В практике разработки на платформе 1С часто встречается ситуация, когда при формировании печатной формы вместо полного списка товаров, услуг или работ выводится только одна позиция (обычно последняя из списка). Это происходит из-за типичной ошибки в логике построения цикла вывода табличного документа. Разберем подробно, почему так происходит, и как правильно спроектировать код и макет для корректного отображения всех данных.
Рассмотрим ситуацию: разработчик пишет запрос, получает выборку данных и в цикле Пока ... Следующий() присваивает значения параметрам области макета. Однако, если метод Вывести() вызывается уже после окончания цикла, в печатную форму попадет только тот результат, который был записан в параметры на последней итерации цикла. Проанализируем типичный ошибочный фрагмент кода:
// ОШИБОЧНЫЙ КОД
Пока ПФ.Следующий() Цикл
ВЗ = ПФ.Работа;
ОбластьСтрокаТЧ.Параметры.Работа = ВЗ; // Значение перезаписывается каждую итерацию
КонецЦикла;
ТабличныйДокумент.Вывести(ОбластьСтрокаТЧ); // Выводится только последнее значение
Чтобы исправить эту ситуацию, необходимо понимать механизм работы областей. Область макета — это «чертеж», который мы заполняем данными и «печатаем» (выводим) в итоговый документ. Если мы хотим видеть 10 строк, мы должны 10 раз вызвать метод Вывести(), предварительно заполнив параметры для каждой строки.
Прежде чем приступать к коду, необходимо правильно разметить макет. Посмотрим на структуру, которая обеспечит гибкость и корректное отображение. Проанализируем рекомендации опытных разработчиков: макет должен быть разбит на горизонтальные секции (области).
Основные области макета:
Важно: в макете для ячеек параметра «Работа» или «Номенклатура» обязательно установите свойство «Размещение текста» в значение «Переносить». Это позволит выводить длинные названия в несколько строк, не «ломая» верстку документа.
Теперь перейдем к правильной программной реализации. Основная задача — поместить метод вывода области внутрь цикла обработки данных. Выясним, как это выглядит на практике:
// ПРАВИЛЬНЫЙ КОД
// 1. Выводим статичную шапку
ТабличныйДокумент.Вывести(ОбластьШапка);
ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
// 2. Получаем область строки
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТЧ");
// 3. Запускаем цикл по данным (из запроса или табличной части)
Пока Выборка.Следующий() Цикл
// Заполняем параметры текущей строки
ОбластьСтрока.Parameters.Работа = Выборка.Работа;
ОбластьСтрока.Parameters.Цена = Выборка.Цена;
// ВЫВОДИМ СТРОКУ В ДОКУМЕНТ НА КАЖДОЙ ИТЕРАЦИИ
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
// 4. Выводим подвал с итогами
ТабличныйДокумент.Вывести(ОбластьПодвал);
Часто новички забывают передавать в запрос ссылку на текущий документ, из-за чего печатная форма может выводить данные всех документов в базе или не выводить ничего. Рассмотрим, как правильно составить запрос для получения данных конкретной табличной части документа.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заявка.Работа КАК Работа,
| Заявка.СтоимостьТиража КАК Стоимость
|ИЗ
| Документ.ЗаявкаВПроизводство.РаботаИВыборМатериала КАК Заявка
|ГДЕ
| Заявка.Ссылка = &СсылкаНаОбъект
| И Заявка.ВыборРаботы = ИСТИНА";
Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Проанализируем этот код: использование параметра &СсылкаНаОбъект гарантирует, что мы работаем только с данными текущего документа. Дополнительное условие Заявка.ВыборРаботы = ИСТИНА позволяет фильтровать строки, которые пользователь отметил для печати.
Для создания действительно качественной печатной формы рекомендуем использовать следующие методы:
1. Метод ЗаполнитьЗначенияСвойств
Если имена колонок в вашей табличной части (или поля в запросе) совпадают с именами параметров в макете, можно значительно сократить код. Вместо ручного присвоения каждой переменной используйте функцию ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ТекущаяСтрока). Это минимизирует риск опечаток.
2. Проверка вывода на страницу
Когда в документе много позиций, важно, чтобы «Итого» или подписи не переносились на отдельный лист без самих строк товаров. Перед выводом строки используйте метод ПроверитьВывод(). Рассмотрим пример:
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСтрока);
МассивОбластей.Добавить(ОбластьПодвал);
Если Не ТабличныйДокумент.ПроверитьВывод(МассивОбластей) Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
3. Работа с дополнительными реквизитами
В современных конфигурациях 1С (на базе БСП) для получения значений дополнительных реквизитов (например, цвета или формата) лучше не писать сложные запросы к табличным частям ДополнительныеРеквизиты, а использовать программный интерфейс БСП, такой как УправлениеСвойствами.ЗначениеСвойства(). Это сделает ваш код более устойчивым к обновлениям системы.
Таким образом, для вывода нескольких позиций в печатную форму необходимо обеспечить три условия: корректная структура макета с выделенной областью строки, наличие фильтра по ссылке в запросе и вызов метода Вывести() строго внутри цикла. Соблюдение этих правил позволит вам создавать профессиональные и безошибочные отчетные формы в среде 1С.