Работа с печатными формами и табличными документами — одна из самых частых задач разработчика 1С. Однако начинающие специалисты часто сталкиваются с ситуацией, когда код вроде бы написан верно, запрос выполняется, но в результате вместо заполненной таблицы выводятся пустые строки. В этой статье мы подробно разберем, почему так происходит, проанализируем типичные ошибки на примере реального кейса и выясним, как правильно организовать вывод данных в табличный документ.
Рассмотрим ситуацию, когда разработчик выбирает данные из документа вместе с его табличной частью в одном запросе. В 1С это часто делается через обращение к вложенной таблице, например, СчетНаОплатуПокупателю.Товары.(...). Проанализируем, как 1С обрабатывает такой результат.
Когда вы используете конструкцию со вложенной таблицей, результат запроса становится иерархическим. Это означает, что верхний уровень выборки содержит данные самого документа (ссылку, дату, номер), а строки табличной части "спрятаны" внутри. Если запустить один цикл Пока Выборка.Следующий(), вы пройдете только по самим документам, но не по их строкам.
Для корректного обхода таких данных нам потребуется вложенный цикл. Рассмотрим пример правильной реализации:
// Получаем общую выборку по документам
ВыборкаДокументы = РезультатЗапроса.Выбрать();
Пока ВыборкаДокументы.Следующий() Цикл
// Для каждого документа получаем выборку его строк (табличной части)
ВыборкаСтроки = ВыборкаДокументы.Товары.Выбрать();
Пока ВыборкаСтроки.Следующий() Цикл
// Здесь уже можно работать с конкретными данными строки
ОбластьМакета.Параметры.Номенклатура = ВыборкаСтроки.Номенклатура;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;
КонецЦикла;
Альтернативный и более простой способ — делать запрос напрямую к табличной части документа (например, Документ.СчетНаОплатуПокупателю.Товары). В этом случае иерархия не создается, и данные можно вывести в одном цикле.
Рассмотрим еще одну критическую ошибку, которая часто встречается в коде. Посмотрим на последовательность действий: получение области, заполнение параметров и вывод в табличный документ. В 1С порядок имеет решающее значение.
Объект ОбластьМакета, полученный через Макет.ПолучитьОбласть(), является своего рода "чертежом". Когда мы вызываем метод ТабличныйДокумент.Вывести(ОбластьМакета), 1С берет текущие значения параметров из этой области и "печатает" их в итоговый документ. Если вы сначала вывели область, а потом решили поменять значения параметров — в уже выведенной строке ничего не изменится.
Проанализируем правильный алгоритм работы в цикле:
ОбластьМакета.Параметры.ИмяПараметра = Значение;.ТабличныйДокумент.Вывести(ОбластьМакета);.Также важно отметить, что метода Параметры.Записать() не существует. Параметры фиксируются именно в момент вывода области в документ.
Выясним причину, по которой даже при идеально написанном коде ячейки могут оставаться пустыми. В конфигураторе 1С у каждой ячейки макета есть палитра свойств. Рассмотрим свойство "Заполнение" и флаг "Содержит значение".
Для вывода данных через код в свойстве "Заполнение" должно быть выбрано значение "Параметр". Однако рядом часто находится флажок "Содержит значение". Если этот флаг установлен и выбран конкретный тип (например, "Число" или "СправочникСсылка"), 1С будет ожидать строгое соответствие типов.
Если вы передаете в такую ячейку данные, которые 1С не может автоматически преобразовать к указанному типу (или если тип в макете указан ошибочно, например, "ДокументСсылка" вместо "СправочникСсылка"), ячейка может отображаться пустой. Рекомендация: для обычных печатных форм снимите флаг "Содержит значение" у параметров, чтобы платформа выводила данные как текст.
Посмотрим на пример кода, где разработчик пытается заполнить параметр Номерклатура. При этом в макете параметр называется Номенклатура. 1С — регистронезависимый язык, но он крайне чувствителен к правильности написания имен. Опечатка в одну букву приведет к тому, что значение будет присвоено несуществующему параметру, а реальное поле в макете останется пустым.
Чтобы избежать подобных ошибок, рекомендуется использовать метод Заполнить(). Рассмотрим его работу:
Пока Выборка.Следующий() Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Метод Заполнить автоматически сопоставит имена полей выборки
// с именами параметров в области макета
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Этот метод значительно сокращает количество кода и минимизирует риск опечаток, так как вам не нужно прописывать каждое поле вручную.
Проанализируем ситуацию при создании внешней печатной формы. Часто разработчики пытаются напрямую обратиться к СсылкаНаОбъект.Товары. Важно понимать контекст выполнения кода:
СсылкаНаОбъект не определена в реквизитах обработки или не заполнена при вызове, цикл Для каждого по ее табличной части просто не запустится, так как объект будет пуст.Всегда проверяйте заполнение ссылки перед началом цикла или используйте отладчик, чтобы убедиться, что в СсылкаНаОбъект действительно находится нужный документ с данными.
Мы разобрали основные причины, по которым таблица может не заполняться. Подведем итоги нашего исследования:
Вывести().Заполнить() для автоматизации процесса и защиты от опечаток.Следуя этим правилам, вы сможете избежать "пустографов" в ваших отчетах и печатных формах, делая код более надежным и читаемым.