При разработке внешних обработок заполнения табличных частей документов в 1С:Предприятие 8 часто возникает задача выборки данных из регистров накопления. В конфигурации 1С:Управление торговлей 10.3 типовой механизм работы с документами (например, «Оприходование товаров») требует корректного построения запроса к виртуальным таблицам и правильной передачи полученных данных в форму документа.
Разберем типичные ошибки, из-за которых табличная часть очищается, но не заполняется данными, а также синтаксические ошибки при передаче текста запроса в модуле 1С.
Проанализируем исходный фрагмент кода и выясним, почему запрос не возвращает строки или вызывает ошибки компиляции:
Номенклатура В &(Родитель) является синтаксически некорректной. Для проверки принадлежности номенклатуры к группе справочника используется оператор В ИЕРАРХИИ (&Родитель). Скобки должны обрамлять имя параметра вместе со знаком амперсанда.|, а весь блок должен быть заключен в кавычки и присвоен свойству Запрос.Текст. Прямая вставка конструкций языка запросов в модуль формы приводит к ошибкам Неопознанный оператор.ГДЕ после выборки виртуальной таблицы РегистрНакопления.Продажи.Обороты неоптимально и может приводить к неожиданным результатам. Условия по организации, подразделению и номенклатуре следует передавать непосредственно в параметры виртуальной таблицы.&Родитель передается элемент другого справочника (например, «Виды номенклатуры»), а в запросе проверяется поле Номенклатура, условие никогда не выполнится, так как типы ссылок не совпадают.Подразделение заполняется подразделением документа. Если в документе оприходования у выбранного склада реквизит Подразделение не заполнен, условие равенства отсечет все движения.Рассмотрим правильный вариант написания текста запроса в модуле внешней обработки. Перенесем условия отбора в параметры виртуальной таблицы и исправим обращение к иерархии:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| Товары.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
| Товары.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
| ПродажиОбороты.Организация КАК Организация,
| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты(
| &НачалоПериода,
| &КонецПериода,
| ,
| Организация = &ВыбОрганизация
| И (&БезПодразделения ИЛИ Подразделение = &ВыбПодразделение)
| И (&БезОтбораПоГруппе ИЛИ Номенклатура В ИЕРАРХИИ (&Родитель))) КАК ПродажиОбороты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
| ПО ПродажиОбороты.Номенклатура = Товары.Ссылка
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура";
Запрос.УстановитьПараметр("ВыбОрганизация", СсылкаНаОбъект.Организация);
Запрос.УстановитьПараметр("ВыбПодразделение", СсылкаНаОбъект.Склад.Подразделение);
Запрос.УстановитьПараметр("БезПодразделения", НЕ ЗначениеЗаполнено(СсылкаНаОбъект.Склад.Подразделение));
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(СсылкаНаОбъект.Дата));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(СсылкаНаОбъект.Дата));
Запрос.УстановитьПараметр("Родитель", ГруппаНоменклатуры);
Запрос.УстановитьПараметр("БезОтбораПоГруппе", НЕ ЗначениеЗаполнено(ГруппаНоменклатуры));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Разберем по шагам, как обработать результат выполнения запроса и перенести полученные строки в табличную часть документа «Оприходование товаров»:
ТабличнаяЧасть.Очистить().Пока Выборка.Следующий() Цикл добавляем новые строки методом ТабличнаяЧасть.Добавить().Номенклатура, ХарактеристикаНоменклатуры, Количество, ЕдиницаИзмерения, Коэффициент и реквизит Качество (по умолчанию устанавливается значение Справочники.Качество.Новый).Посмотрим на пример кода заполнения табличной части документа:
ТабличнаяЧасть = СсылкаНаОбъект.Товары;
ТабличнаяЧасть.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТабличнаяЧасть.Добавить();
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры;
НоваяСтрока.Количество = Выборка.КоличествоОборот;
НоваяСтрока.ЕдиницаИзмерения = Выборка.ЕдиницаХранения;
НоваяСтрока.Коэффициент = ?(Выборка.КоэффициентЕдиницыХранения = 0, 1, Выборка.КоэффициентЕдиницыХранения);
НоваяСтрока.Качество = Справочники.Качество.Новый;
КонецЦикла;
Если после исправления синтаксиса табличная часть по-прежнему остается пустой, выполним следующие диагностические действия:
Продажи за указанный день по выбранной организации с помощью консоли запросов.ГруппаНоменклатуры на форме обработки содержит именно группу справочника Номенклатура, а не элемент справочника Виды номенклатуры. Если требуется фильтрация по виду номенклатуры, условие в запросе должно выглядеть как Номенклатура.ВидНоменклатуры = &ВидНоменклатуры.