Почему не заполняется таблица в макете 1С через цикл и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Работа с печатными формами и табличными документами — одна из самых частых задач разработчика 1С. Однако начинающие специалисты часто сталкиваются с ситуацией, когда код вроде бы написан верно, запрос выполняется, но в результате вместо заполненной таблицы выводятся пустые строки. В этой статье мы подробно разберем, почему так происходит, проанализируем типичные ошибки на примере реального кейса и выясним, как правильно организовать вывод данных в табличный документ.

Разбор первой ошибки: Иерархия в результатах запроса

Рассмотрим ситуацию, когда разработчик выбирает данные из документа вместе с его табличной частью в одном запросе. В 1С это часто делается через обращение к вложенной таблице, например, СчетНаОплатуПокупателю.Товары.(...). Проанализируем, как 1С обрабатывает такой результат.

Когда вы используете конструкцию со вложенной таблицей, результат запроса становится иерархическим. Это означает, что верхний уровень выборки содержит данные самого документа (ссылку, дату, номер), а строки табличной части "спрятаны" внутри. Если запустить один цикл Пока Выборка.Следующий(), вы пройдете только по самим документам, но не по их строкам.

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


// Получаем общую выборку по документам
ВыборкаДокументы = РезультатЗапроса.Выбрать();

Пока ВыборкаДокументы.Следующий() Цикл
    // Для каждого документа получаем выборку его строк (табличной части)
    ВыборкаСтроки = ВыборкаДокументы.Товары.Выбрать();
    
    Пока ВыборкаСтроки.Следующий() Цикл
        // Здесь уже можно работать с конкретными данными строки
        ОбластьМакета.Параметры.Номенклатура = ВыборкаСтроки.Номенклатура;
        ТабличныйДокумент.Вывести(ОбластьМакета);
    КонецЦикла;
КонецЦикла;

Альтернативный и более простой способ — делать запрос напрямую к табличной части документа (например, Документ.СчетНаОплатуПокупателю.Товары). В этом случае иерархия не создается, и данные можно вывести в одном цикле.

Анализ порядка вывода области: Параметры vs Вывести

Рассмотрим еще одну критическую ошибку, которая часто встречается в коде. Посмотрим на последовательность действий: получение области, заполнение параметров и вывод в табличный документ. В 1С порядок имеет решающее значение.

Объект ОбластьМакета, полученный через Макет.ПолучитьОбласть(), является своего рода "чертежом". Когда мы вызываем метод ТабличныйДокумент.Вывести(ОбластьМакета), 1С берет текущие значения параметров из этой области и "печатает" их в итоговый документ. Если вы сначала вывели область, а потом решили поменять значения параметров — в уже выведенной строке ничего не изменится.

Проанализируем правильный алгоритм работы в цикле:

  1. Получаем область один раз перед началом цикла.
  2. Внутри цикла сначала заполняем параметры области ОбластьМакета.Параметры.ИмяПараметра = Значение;.
  3. Только после заполнения всех параметров вызываем ТабличныйДокумент.Вывести(ОбластьМакета);.

Также важно отметить, что метода Параметры.Записать() не существует. Параметры фиксируются именно в момент вывода области в документ.

Свойства ячейки макета: Коварный флаг "Содержит значение"

Выясним причину, по которой даже при идеально написанном коде ячейки могут оставаться пустыми. В конфигураторе 1С у каждой ячейки макета есть палитра свойств. Рассмотрим свойство "Заполнение" и флаг "Содержит значение".

Для вывода данных через код в свойстве "Заполнение" должно быть выбрано значение "Параметр". Однако рядом часто находится флажок "Содержит значение". Если этот флаг установлен и выбран конкретный тип (например, "Число" или "СправочникСсылка"), 1С будет ожидать строгое соответствие типов.

Если вы передаете в такую ячейку данные, которые 1С не может автоматически преобразовать к указанному типу (или если тип в макете указан ошибочно, например, "ДокументСсылка" вместо "СправочникСсылка"), ячейка может отображаться пустой. Рекомендация: для обычных печатных форм снимите флаг "Содержит значение" у параметров, чтобы платформа выводила данные как текст.

Внимательность к деталям: Опечатки и именование

Посмотрим на пример кода, где разработчик пытается заполнить параметр Номерклатура. При этом в макете параметр называется Номенклатура. 1С — регистронезависимый язык, но он крайне чувствителен к правильности написания имен. Опечатка в одну букву приведет к тому, что значение будет присвоено несуществующему параметру, а реальное поле в макете останется пустым.

Чтобы избежать подобных ошибок, рекомендуется использовать метод Заполнить(). Рассмотрим его работу:


Пока Выборка.Следующий() Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    // Метод Заполнить автоматически сопоставит имена полей выборки 
    // с именами параметров в области макета
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Этот метод значительно сокращает количество кода и минимизирует риск опечаток, так как вам не нужно прописывать каждое поле вручную.

Работа с внешней обработкой и "СсылкаНаОбъект"

Проанализируем ситуацию при создании внешней печатной формы. Часто разработчики пытаются напрямую обратиться к СсылкаНаОбъект.Товары. Важно понимать контекст выполнения кода:

Всегда проверяйте заполнение ссылки перед началом цикла или используйте отладчик, чтобы убедиться, что в СсылкаНаОбъект действительно находится нужный документ с данными.

Итоги и рекомендации

Мы разобрали основные причины, по которым таблица может не заполняться. Подведем итоги нашего исследования:

  1. При использовании вложенных таблиц в запросах всегда используйте двойной цикл для обхода данных.
  2. Сначала заполняйте параметры области, и только потом вызывайте метод Вывести().
  3. Проверяйте свойства ячеек в макете: тип заполнения должен быть "Параметр", а флаг "Содержит значение" в большинстве случаев должен быть снят.
  4. Используйте метод Заполнить() для автоматизации процесса и защиты от опечаток.
  5. Пользуйтесь консолью запросов для проверки структуры результата перед тем, как писать код обхода выборки.

Следуя этим правилам, вы сможете избежать "пустографов" в ваших отчетах и печатных формах, делая код более надежным и читаемым.

← На главную