О чем эта статья
Конструктор запроса предоставляет феноменальные средства для визуального пошагового формирования синтаксически правильного текста запроса. В статье показывается каким образом можно использовать данный функционал на платформе редакции 8.3.5 в управляемом режиме.
Кроме того, описан новый объект СхемаЗапроса, который позволяет изменять текст запроса из встроенного языка без необходимости анализа текста самого запроса.
Применимость
В статье рассматривается платформа «1С:Предприятие» редакции 8.3.5.823 в управляемом режиме работы. В актуальных версиях платформы описанная функциональность не изменилась, поэтому материал полностью актуален.
Конструктор запросов в управляемом приложении в «1С:Предприятие 8.3.5»
В платформе 8.3.5.823 появилась давно ожидаемая разработчиками возможность – был реализован конструктор запроса, работающий в режиме управляемого приложения.
Теперь конструктор запроса доступен в тонком и толстом клиентах, а также в веб-клиенте.
Знакомство с новым механизмом начнем с написания простой обработки, которая будет открывать конструктор в тонком клиенте.
Создадим внешнюю обработку, на форме разместим поле ввода для текста запроса и кнопку, открывающую конструктор:
Для увеличения нажмите на изображение.
Напишем следующий обработчик нажатия на кнопку:
Процедура Конструктор(Команда)
Конструктор = Новый КонструкторЗапроса;
Конструктор.Текст = ТекстЗапроса;
Оповещение = Новый ОписаниеОповещения(“ОткрытьКонструкторЗапросаЗавершение”,
ЭтотОбъект);
Конструктор.Показать(Оповещение);
КонецПроцедуры &НаКлиенте
Процедура ОткрытьКонструкторЗапросаЗавершение(Текст, ДополнительныеПараметры) Экспорт
Если НЕ Текст = Неопределено Тогда
ТекстЗапроса = Текст;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что вместо метода ОткрытьМодально() использовался новый метод Показать(), который открывает конструктор запроса немодально.
При открытии обработки в тонком клиенте и нажатии на кнопку открывается форма конструктора запроса:
Для увеличения нажмите на изображение.
По сравнению с классическим конструктором, к которому мы привыкли еще со времен 8.0, внешний вид нового претерпел несколько изменений.
Первое, что бросается в глаза – отсутствие привычных закладок, отображающих запросы пакета, имена временных таблиц и объединения запросов:
Вместо этого теперь в нижней части окна расположены два выпадающих списка – “Редактируемый запрос” и “Редактируемый оператор”.
Для увеличения нажмите на изображение.
Для увеличения нажмите на изображение.
В первом из них перечислены запросы, входящие в пакет, для временных таблиц указываются имена.
Во втором списке можно выбрать, который из объединяемых запросов редактируется в данный момент.
В классическом конструкторе запроса для создания запроса на уничтожение временной таблицы нужно было установить переключатель на закладке “Дополнительно” в соответствующую позицию:
А при использовании управляемого конструктора запроса это действие выполняется на закладке “Пакет запросов” при выборе соответствующего пункта кнопки “Добавить”:
Для увеличения нажмите на изображение.
Но все-таки самые большие отличия расположены на закладке “Связи”. Теперь чтобы связать две таблицы, необходимо мышкой перетащить одну таблицу поверх другой.
Таблицы после этого будут отображаться в виде дерева. Далее необходимо указать вид соединения в выпадающем списке (внутреннее, левое, правое, полное) и написать условие соединения.
Для увеличения нажмите на изображение.
Вид соединения теперь выбирается явно из списка, а не указывается галочками. Также больше не существует галочки “Произвольное условие” при описании связей и условий, все условия редактируются только в редакторе произвольного выражения или вручную.
Схема запроса
На практике часто встречается необходимость сформировать различный текст запроса в зависимости от настроек параметров учета в конфигурации.
Для этого зачастую применяется следующий подход: строка, содержащая текст запроса, собирается динамически, “по кусочкам”.
Для примера рассмотрим, как в типовой конфигурации “Управление торговлей, редакция 10.3” формируется текст запроса.
|ВЫБРАТЬ // Запрос, контролирующий остатки на складах
| Док.Номенклатура.Представление КАК НоменклатураПредставление,
…
| %ПОЛЕ_Док_Серия% КАК СерияНоменклатуры,
…
| ЕСТЬNULL(МАКСИМУМ(Резервы.КоличествоОстаток), 0) КАК РезервыКоличество
|ИЗ
| “+ ТекстЗапросаРеквизитыДокумента + ”
|
|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(,Склад в (&СписокСкладов) И
| ДокументРезерва в (&СписокДокументовРезерва) И
| %ВыборкаПоНоменклатуре%) КАК Резервы
|ПО
| Док.Номенклатура = Резервы.Номенклатура
| И Док.Склад = Резервы.Склад
| И Док.ЗаказПокупателя = Резервы.ДокументРезерва
| //СОЕДИНЕНИЕ_Характеристика_Резервы
| //СОЕДИНЕНИЕ_Серия_Резервы
…
|”;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,“%ВыборкаПоНоменклатуре%”,“Номенклатура В
(“+ТекстЗапросаСписокНоменклатуры+“)”);
…
Если не УчитыватьСерии Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,“%ПОЛЕ_Док_Серия%”,“&ПустаяСерия”);
КонецЕсли;
Как видно, текст запроса собирается из частей при помощи конкатенации, в тексте запроса намеренно используются недопустимые символы (например, %).
Части текста запроса подменяются при помощи СтрЗаменить() на те или иные значения в зависимости от различных условий.
При этом воспользоваться конструктором запроса невозможно – такой текст он не распознает, редактировать запрос в таком случае придется вручную, а программный код получается достаточно громоздким.
В платформе 8.3.5 появилась объектная модель схемы запроса. Теперь программно можно формировать текст запроса, пользуясь не конкатенацией отдельных строк, а оперируя объектами встроенного языка.
Для этого был реализован специальный объект СхемаЗапроса.
Для примера составим при помощи объектной модели на демо-конфигурации “Управляемое приложение” текст запроса, в котором к табличной части документа “Расход товара” при помощи левого соединения присоединяем срез последних регистра сведений “Цены товаров”.
Пояснения к разрабатываемому коду даны в комментариях.
//при создании схема содержит один пакет и один оператор в пакете.
Пакет = СхемаЗапроса.ПакетЗапросов[0];
Оператор = Пакет.Операторы[0];
//получаем таблицы для дальнейшего использования
ДоступнаяТаблицаРасходТовара = Пакет.ДоступныеТаблицы.Найти(“Документ.РасходТовара”);
ДоступнаяТаблицаРасходТовараТовары =
Пакет.ДоступныеТаблицы.Найти(“Документ.РасходТовара.Товары”);
//добавляем источники
Источник = Оператор.Источники.Добавить(ДоступнаяТаблицаРасходТовараТовары);
Источник.Источник.Псевдоним = “РасходТовараТовары”;
Источник = Оператор.Источники.Добавить(Пакет.ДоступныеТаблицы.Найти
(“РегистрСведений.ЦеныТоваров.СрезПоследних”));
Источник.Источник.Псевдоним = “ЦеныТоваровСрезПоследних”;
//задаем параметры виртуальной таблицы для среза последних регистра сведений
Источник.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса(“&Дата”);
Источник.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса(“ВидЦен =
&ВидЦен”);
//устанавливаем условия левого соединения таблиц
Соединение = Оператор.Источники[0].Соединения.Добавить(“ЦеныТоваровСрезПоследних”,
“РасходТовараТовары.Товар = ЦеныТоваровСрезПоследних.Товар”);
Оператор.Источники[0].Соединения[0].ТипСоединения =
ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
//перечисляем выходные поля
//для первых двух псевдоним будет сгенерирован автоматически
//а для третьего принудительно укажем псевдоним “Цена”
ВыбранноеПоле = Оператор.ВыбираемыеПоля.Добавить(“РасходТовараТовары.Товар”);
ВыбранноеПоле = Оператор.ВыбираемыеПоля.Добавить(“РасходТовараТовары.Количество”);
ВыбранноеПоле =
Оператор.ВыбираемыеПоля.Добавить(“ЕСТЬNULL(ЦеныТоваровСрезПоследних.Цена, 0)”);
Пакет.Колонки[2].Псевдоним = “Цена”;
//добавляем секцию ГДЕ в запрос
Оператор.Отбор.Добавить(“РасходТовараТовары.Ссылка = &Ссылка”);
Сообщить(СхемаЗапроса.ПолучитьТекстЗапроса());
При выполнении метода ПолучитьТекстЗапроса() объекта СхемаЗапроса мы получим следующий текст запроса:
РасходТовараТовары.Товар,
РасходТовараТовары.Количество,
ЕСТЬNULL(ЦеныТоваровСрезПоследних.Цена, 0) КАК Цена
ИЗ
Документ.РасходТовара.Товары КАК РасходТовараТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(&Дата, ВидЦен
= &ВидЦен) КАК ЦеныТоваровСрезПоследних
ПО (РасходТовараТовары.Товар = ЦеныТоваровСрезПоследних.Товар)
ГДЕ
РасходТовараТовары.Ссылка = &Ссылка
Если же необходимо готовый текст запроса трансформировать в объект СхемаЗапроса, то следует воспользоваться методом УстановитьТекстЗапроса():
| РасходТовараТовары.Товар,
| РасходТовараТовары.Количество,
| ЕСТЬNULL(ЦеныТоваровСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| Документ.РасходТовара.Товары КАК РасходТовараТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(&Дата,
ВидЦен = &ВидЦен) КАК ЦеныТоваровСрезПоследних
| ПО РасходТовараТовары.Товар = ЦеныТоваровСрезПоследних.Товар
|ГДЕ
| РасходТовараТовары.Ссылка = &Ссылка”;
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Текст);
После этого объект СхемаЗапроса будет содержать структуру запроса в виде набора свойств.
Использование схемы запроса позволяет редактировать текст запроса более наглядно, оперируя при этом элементами структуры запроса.
В таком случае возможно избежать получения запроса при помощи сборки из отдельных фрагментов, что должно повысить наглядность и читаемость кода.
Будем ждать, когда разработчики типовых решений начнут применять объектную модель запросов при написании конфигураций. Это позволит нам на практике познакомиться с применением новых возможностей платформы 8.3.5.
В дополнение к статье Вы можете скачать Консоль запросов для платформы 8.3.5. Автор приложения – BigB.
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Статья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Курсы-по-1С.рф – Конструктор запросов в управляемом приложении в 1СПредприятие 8.3.5.pdf
Добрый день! Подскажите пожалуйста.
Пытаюсь модифицировать типовой запрос из УТ11 при помощи схемы запроса. Вот кусок запроса:
ИЗ
Документ.ПоступлениеТоваровУслуг.Серии КАК ТаблицаСерии
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ТаблицаТовары
ПО ТаблицаСерии.Ссылка = ТаблицаТовары.Ссылка
И ТаблицаСерии.Номенклатура = ТаблицаТовары.Номенклатура
И ТаблицаСерии.Характеристика = ТаблицаТовары.Характеристика
И ТаблицаСерии.Склад = ТаблицаТовары.Склад
//+ Добавлено
И ТаблицаСерии.Помещение = ТаблицаТовары.Помещение
//- Добавлено Источник: ©Курсы-по-1С.рф
И ТаблицаСерии.Назначение = ТаблицаТовары.Назначение
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК Поступление
ПО Поступление.Ссылка = ТаблицаСерии.Ссылка
Комментариями выделена добавленная связь между таблицами.
В таком виде все прекрасно – запрос открывается в конструкторе запросов. Затем я удаляю добавленную связь из текста запроса и пытаюсь добавить ее программно:
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
ЗапросВыбора = СхемаЗапроса.ПакетЗапросов[0];
ОператорВыбрать = ЗапросВыбора.Операторы[1];
ОператорВыбрать.Источники[1].Соединения.Добавить(“ТаблицаСерии”, “ТаблицаТовары.Помещение = ТаблицаСерии.Помещение”);
На последней строке получаю сообщение об ошибке:
Ошибка при вызове метода контекста (Добавить)
ОператорВыбрать.Источники[1].Соединения.Добавить(“ТаблицаСерии”, “ТаблицаТовары.Помещение = ТаблицаСерии.Помещение”);
по причине:
Противоречивая связь “#1”
Что я не так делаю?
Добрый день!
Откорректируйте строку программного кода, т.е. замените имя таблицы, с которой выполняется связь:
Либо можно использовать обратный подход – откорректировать сам текст запроса, получить для него схему, а потом посмотреть, из каких объектов она состоит. Так будет понятнее, куда именно следует добавлять соединение.
Добрый день!
Такой вариант я тоже пробовал. Та же самая ошибка.
И обратный подход пробовал. Использовал для этого использовал обработку с инфостарта: http://infostart.ru/public/305809/
Скормил ей мой запрос с добавленными полями и связями.
Там все видно, все понятно. Но в решении проблемы это не помогло.
Помогло лишь скажем так “извращение” – модификация имеющегося соединения с условием “ТаблицаСерии.Склад = ТаблицаТовары.Склад”.
ОператорВыбрать.Источники[0].Соединения[3].Условие = Новый ВыражениеСхемыЗапроса(“”+ОператорВыбрать.Источники[0].Соединения[3].Условие + ” И ТаблицаСерии.Помещение = ТаблицаТовары.Помещение”);
В результате в выходном запросе имеем условие соединения:
И (ТаблицаСерии.Склад = ТаблицаТовары.Склад
И ТаблицаСерии.Помещение = ТаблицаТовары.Помещение)
Жаль что не получилось добиться нужного результата стандартными действиями. Видимо разработчики 1С чего-то не доработали.
Добрый день!
Проблема в том, что указать вид соединения при добавлении мы не можем. Если открыть исходный тест запроса в конструкторе, попытаться добавить левое соединение таблиц ТаблицаСерии и ТаблицаТовары, то мы получим такую же ошибку с противоречивой связью. Так что приходится прибегать к подобным обходам.
СхемаЗапроса – очень полезна, но она “привязана” к конфигурации.Невозможно разобрать текст из другой конф
Да, можно разобрать только текст запроса из этой конфигурации. В противном случае возникают ошибки несоответствия типов. Хотя здесь, в принципе, как и с конструктором запроса – тоже работаем со структурой текущей конфигурации.
А как в новой консоли запросов связать три таблички?
Например мне нужны две связи:
Номенклатура=СтоимостьОстатки
Номенклатура=КоличествоОстатки
Делает только одну правильно. Вторую либо кидает внутрь как подчиненную, либо просто сама по себе висит.
Добрый день!
Написал простой запрос, где соединяются три таблицы:
Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ (&Ссылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровТовары.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Количество
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровТовары.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_Сумма
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Номенклатура.Ссылка КАК Ссылка,
ВТ_Количество.Количество КАК Количество,
ВТ_Сумма.Сумма КАК Сумма
ИЗ
ВТ_Номенклатура КАК ВТ_Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Количество КАК ВТ_Количество
ПО (ВТ_Номенклатура.Ссылка = ВТ_Количество.Номенклатура)
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Сумма КАК ВТ_Сумма
ПО (ВТ_Номенклатура.Ссылка = ВТ_Сумма.Номенклатура)
При помощи нового конструктора получилось сделать такой запрос. На закладке Связи перетаскивал значки таблиц ВТ_Сумма и ВТ_Количество последовательно поверх ВТ_Номенклатура. Выглядит это вот так:
При использовании метода “Показать()” вместо “ОткрытьМодально()” в параметр “Текст” процедуры “ОткрытьКонструкторЗапросаЗавершение” всегда передается текст запроса, даже в случае нажатия “Отмены”.
Платформа 8.3.5.1098.
Добрый день!
Проверял на платформе 8.3.5.1460. Работает корректно и в толстом, и тонком клиенте. Если конструктор закрыли по кнопке OK, то передается текст запроса, в противном случае – Неопределено.
Возможно в более новых версиях платформы и работает, но именно на 8.3.5.1098 работает так, как описал.
Вполне может быть. В списке исправленных ошибок в релизе 8.3.6.1977 есть еще несколько, связанных с конструктором запроса для тонкого клиента. Так что механизм дорабатывается.
В любом случае, спасибо за статью.
Есть особенность: почему-то не получается определить таблицу
ДоступнаяТаблицаРасходТовараТовары = Пакет.ДоступныеТаблицы.Найти(“Документ.РасходТовара.Товары”);
без предварительного определения таблицы
ДоступнаяТаблицаРасходТовара = Пакет.ДоступныеТаблицы.Найти(“Документ.РасходТовара”);
Потратил немало времени в недоумении, пока не скопипастил код из примера. Может кому-нибудь информация окажется полезной.
Консоль запросов в тонком клиенте сырая. При попытке настроить связи для запроса выдает ошибки. Хотя такой же запрос в толстом клиенте отрабатывает нормально.
Будем ждать пока 1С исправят косяки в новых версиях платформы.
Да, есть такая проблема, будем ждать:)
Кроме этой ошибки также в версии 8.3.5.993 (для тестирования) исправлена ошибка 10139831
“Конструктор запроса для тонкого клиента не позволяет вводить имя временной таблицы, начинающееся со знака &.”
А также ошибка 30004621 исправлена в версии 8.3.5.823 (для тестирования)
“При передаче в конструктор объекта КонструкторЗапроса текста запроса, в котором используется неопределенная временная таблица, диагностируется ошибка
Неверные параметры”.
Василий, у вас в коде небольшая описка. Написано:
Оповещение = Новый ОписаниеОповещения(“ОткрытьКонструкторЗапросаЗавершение”,
ЭтотОбъект);
А рабочий вариант:
Оповещение = Новый ОписаниеОповещения(“ОткрытьКонструкторЗапросаЗавершение”,
ЭтаФорма);
Для управляемой формы, команды командного интерфейса и общего модуля реализовано свойство ЭтотОбъект. Данное свойство не поддерживается в режиме совместимости с версией 8.3.2. Свойство ЭтаФорма объекта УправляемаяФорма удалено и поддерживается для совместимости.
УправляемаяФорма.ЭтотОбъект содержит данную форму. Может быть использовано в модуле формы для получения данной формы и передачи ее в качестве параметра в другие формы, глобальные процедуры и функции и т.д.
Спасибо интересно! Я правильно понимаю что это развитие в том числе идет к тому чтобы использовать запросы на мобильной платформе работая через СхемаЗапроса ?
На текущий момент объект СхемаЗапроса доступен на сервере, под толстым клиентом и во внешнем соединении. А вот в мобильной платформе реализована возможность работы с произвольными запросами, в том числе и в динамических списках. Так что не исключено, что и СхемаЗапроса появится. Но пока достоверной информации о таких планах не располагаем.
Добрый день. Вот здесь http://v8.1c.ru/o7/201401query/index.htm говориться :”Вы можете создать пустую схему запроса конструктором и загрузить в неё имеющийся текст запроса”. Что за конструктор, как его запустить и как им пользоваться, можете объяснить?
Добрый день. Имеется в виду конструктор объекта во встроенном языке при помощи ключевого слова Новый:
А для загрузки имеющегося текста запроса выполнить:
По СхемеЗапроса сомневаюсь, что получилось упрощение. Громоздкости похоже будет раза в полтора больше + трудность восприятия. Даже на приведенном примере типовой пример из УТ смотрится понятнее, чем схему разбирать. Насчет внешних улучшений конструктора у меня тоже сомнения – что это будет удобнее, чем было раньше.
Так они просто создали новый класс КонструкторЗапроса!? Хм, что то это у меня возникают смутные сомнения о полезности. Да еще какой то класс СхемаЗапроса появился. Что то все больше усложнений появляется в 8.3.
Класс КонструкторЗапроса был доступен и раньше, но только под толстым клиентом.
Очередной мыльный пузырь от 1с! Когда же наконец пудет реализована многоядерность? Базы, даже для самый небольших фирм, уже давно перевалили за 1ГБ. Даже такие операции как глобальный поиск проходят в одном потоке! Позорники!
Спасибо!
Улучшения наглядности не увидел. Пока вижу один способ применения нового механизма – создание обычного запроса для одного из случаев его применения. Потом преобразование в схему и модификация в зависимости от входящих параметров.
Возможность очень интересная, но пока не вижу где можно применить на практике. Возможно за день весь запас фантазии исчерпал…
Например, консоль запросов, которая будет открываться в тонком клиенте и веб-клиенте. А до этого необходимо было открывать только под толстым клиентом.
А если вы про схему запроса, то тут идея в том, чтобы системнее и нагляднее редактировать текст существующего запроса при помощи свойств объекта СхемаЗапроса. При этом не надо будет “разрывать” текст запроса на набор отдельных строчек, запрос по-прежнему можно будет открыть в конструкторе.
Ждем, как это будет выглядеть на практике в сложных запросах типовых конфигураций:)
Ну осталось еще чуть-чуть и конструктор запроса будет как в SQL )))
Спасибо!
Ну наконец-то
Очень полезная информация
Сплошные хорошие новости в статьях
ссылка
Если ссылка дана с целью отдать обработку во внешний мир – готовы опубликовать ее прямо в статье, с указание авторства.
Если с целью заработать несколько стартмани, ссылка будет удалена.
Евгений, вот ссылка на эту обработку без стартмани
Добрый день! Спасибо, ссылку на обработку вынесли в статью.
Ольга, пожалуйста уберите из шапки мою фамилию, имя и город. Не светите меня. Оставьте просто ник: BigB
Хорошо, информация изменена – оставили только никнейм.
В консоли ошибка – выдает ошибку при обращении через точку к табличной части.
Например: ВЫБРАТЬ ПЕРВЫЕ 1
ПеремещениеТоваров.Ссылка КАК Ссылка,
ПеремещениеТоваров.Товары.(
Ссылка КАК Ссылка,
НомерСтроки КАК НомерСтроки,
….
Добрый день!
На демоконфигурации Управляемое приложение ошибка не воспроизвелась. Составил при помощи консоли такой запрос:
ПриходТовара.Ссылка КАК Ссылка,
ПриходТовара.Товары.(
Ссылка КАК Ссылка,
НомерСтроки КАК НомерСтроки,
Товар КАК Товар,
Цена КАК Цена,
Количество КАК Количество,
Сумма КАК Сумма
)
ИЗ
Документ.ПриходТовара КАК ПриходТовара
Этот запрос получилось составить при помощи конструктора запроса, а также наоборот – открыть в конструкторе ранее написанный запрос.
Какая ошибка у вас появляется?
Спасибо, очень интересно.
Спасибо, интересный материал.