Как исправить ошибки в запросе при заполнении документа продажами за день в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке внешних обработок заполнения табличных частей документов в 1С:Предприятие 8 часто возникает задача выборки данных из регистров накопления. В конфигурации 1С:Управление торговлей 10.3 типовой механизм работы с документами (например, «Оприходование товаров») требует корректного построения запроса к виртуальным таблицам и правильной передачи полученных данных в форму документа.

Разберем типичные ошибки, из-за которых табличная часть очищается, но не заполняется данными, а также синтаксические ошибки при передаче текста запроса в модуле 1С.

Причины возникновения ошибок и пустого результата выборки

Проанализируем исходный фрагмент кода и выясним, почему запрос не возвращает строки или вызывает ошибки компиляции:

  1. Синтаксическая ошибка в условии по иерархии: конструкция Номенклатура В &(Родитель) является синтаксически некорректной. Для проверки принадлежности номенклатуры к группе справочника используется оператор В ИЕРАРХИИ (&Родитель). Скобки должны обрамлять имя параметра вместе со знаком амперсанда.
  2. Ошибки вставки текста запроса в модуль: текст запроса в коде 1С представляет собой строковый литерал. Каждая новая строка в многострочной строке должна начинаться с символа вертикальной черты |, а весь блок должен быть заключен в кавычки и присвоен свойству Запрос.Текст. Прямая вставка конструкций языка запросов в модуль формы приводит к ошибкам Неопознанный оператор.
  3. Фильтрация виртуальной таблицы в секции ГДЕ: наложение условий на измерения в секции ГДЕ после выборки виртуальной таблицы РегистрНакопления.Продажи.Обороты неоптимально и может приводить к неожиданным результатам. Условия по организации, подразделению и номенклатуре следует передавать непосредственно в параметры виртуальной таблицы.
  4. Несоответствие типов данных при отборе: если в качестве параметра &Родитель передается элемент другого справочника (например, «Виды номенклатуры»), а в запросе проверяется поле Номенклатура, условие никогда не выполнится, так как типы ссылок не совпадают.
  5. Пустое подразделение склада: в регистре «Продажи» измерение Подразделение заполняется подразделением документа. Если в документе оприходования у выбранного склада реквизит Подразделение не заполнен, условие равенства отсечет все движения.

Исправление текста запроса и параметров

Рассмотрим правильный вариант написания текста запроса в модуле внешней обработки. Перенесем условия отбора в параметры виртуальной таблицы и исправим обращение к иерархии:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ПродажиОбороты.Номенклатура КАК Номенклатура,
|	ПродажиОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|	Товары.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
|	Товары.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
|	ПродажиОбороты.Организация КАК Организация,
|	ПродажиОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
|	РегистрНакопления.Продажи.Обороты(
|			&НачалоПериода,
|			&КонецПериода,
|			,
|			Организация = &ВыбОрганизация
|				И (&БезПодразделения ИЛИ Подразделение = &ВыбПодразделение)
|				И (&БезОтбораПоГруппе ИЛИ Номенклатура В ИЕРАРХИИ (&Родитель))) КАК ПродажиОбороты
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
|		ПО ПродажиОбороты.Номенклатура = Товары.Ссылка
|
|УПОРЯДОЧИТЬ ПО
|	Номенклатура";

Запрос.УстановитьПараметр("ВыбОрганизация", СсылкаНаОбъект.Организация);
Запрос.УстановитьПараметр("ВыбПодразделение", СсылкаНаОбъект.Склад.Подразделение);
Запрос.УстановитьПараметр("БезПодразделения", НЕ ЗначениеЗаполнено(СсылкаНаОбъект.Склад.Подразделение));
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(СсылкаНаОбъект.Дата));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(СсылкаНаОбъект.Дата));
Запрос.УстановитьПараметр("Родитель", ГруппаНоменклатуры);
Запрос.УстановитьПараметр("БезОтбораПоГруппе", НЕ ЗначениеЗаполнено(ГруппаНоменклатуры));

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пошаговый алгоритм заполнения табличной части документа

Разберем по шагам, как обработать результат выполнения запроса и перенести полученные строки в табличную часть документа «Оприходование товаров»:

  1. Очистка табличной части: перед заполнением очищаем коллекцию строк документа с помощью метода ТабличнаяЧасть.Очистить().
  2. Обход выборки: в цикле Пока Выборка.Следующий() Цикл добавляем новые строки методом ТабличнаяЧасть.Добавить().
  3. Заполнение обязательных реквизитов: для документа оприходования обязательно заполняем поля Номенклатура, ХарактеристикаНоменклатуры, Количество, ЕдиницаИзмерения, Коэффициент и реквизит Качество (по умолчанию устанавливается значение Справочники.Качество.Новый).
  4. Пересчет сумм и цен: при необходимости вызываем типовые процедуры пересчета сумм документа, чтобы исключить расхождения в движениях регистра при проведении.

Посмотрим на пример кода заполнения табличной части документа:


ТабличнаяЧасть = СсылкаНаОбъект.Товары;
ТабличнаяЧасть.Очистить();

Пока Выборка.Следующий() Цикл
	НоваяСтрока = ТабличнаяЧасть.Добавить();
	НоваяСтрока.Номенклатура = Выборка.Номенклатура;
	НоваяСтрока.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры;
	НоваяСтрока.Количество = Выборка.КоличествоОборот;
	НоваяСтрока.ЕдиницаИзмерения = Выборка.ЕдиницаХранения;
	НоваяСтрока.Коэффициент = ?(Выборка.КоэффициентЕдиницыХранения = 0, 1, Выборка.КоэффициентЕдиницыХранения);
	НоваяСтрока.Качество = Справочники.Качество.Новый;
КонецЦикла;

Рекомендации по отладке

Если после исправления синтаксиса табличная часть по-прежнему остается пустой, выполним следующие диагностические действия:

  1. Проверим наличие фактических записей в регистре накопления Продажи за указанный день по выбранной организации с помощью консоли запросов.
  2. Убедимся, что реквизит ГруппаНоменклатуры на форме обработки содержит именно группу справочника Номенклатура, а не элемент справочника Виды номенклатуры. Если требуется фильтрация по виду номенклатуры, условие в запросе должно выглядеть как Номенклатура.ВидНоменклатуры = &ВидНоменклатуры.
  3. Проверим соответствие подразделения в движениях продаж и реквизита подразделения у склада в шапке документа.
← На главную