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