Часто начинающие разработчики или пользователи, самостоятельно редактирующие конфигурацию, сталкиваются с ситуацией: в макете печатной формы (файл .mxl) новая колонка добавлена, границы прорисованы, заголовки написаны, но при запуске на печать документ выглядит по-старому. В этой статье мы подробно разберем, почему так происходит, и как правильно «подцепить» новый столбец программно, чтобы он появился в итоговом документе.
В системе 1С:Предприятие печатная форма — это не просто статичная картинка. Это результат работы программного алгоритма. Когда вы нажимаете кнопку «Печать», программа выполняет код, который пошагово собирает ТабличныйДокумент из кусочков (областей) макета. Если вы добавили колонку в макет, но не дали программе команду «возьми эту новую колонку и приклей её к остальным», она просто проигнорирует ваши изменения.
Большинство современных печатных форм в 1С (например, Счет на оплату в Бухгалтерии 3.0) строятся по принципу пересечения горизонтальных и вертикальных областей. Чтобы столбец появился, нам нужно выполнить три условия:
Присоединить() для вывода этой области в финальный документ.Прежде чем лезть в код, проанализируем структуру нашего макета. Откроем макет нужного документа (в нашем примере это ПФ_MXL_СчетЗаказ). В 1С колонки часто группируются в вертикальные области. Проверьте, что ваша новая колонка выделена как отдельная вертикальная область или входит в существующую. Для корректной работы лучше всего создать свою вертикальную область с уникальным именем, например, СтрокаПоставки.
Важно: убедитесь, что в ячейках новой колонки свойство «Заполнение» установлено в значение Параметр, если вы планируете выводить туда данные из документа, а не просто статический текст.
Для внесения изменений нам нужно найти код, который отвечает за формирование счета. Обычно это происходит в Модуле менеджера документа или в Общем модуле (если форма типовая). Воспользуемся глобальным поиском (Ctrl+Shift+F) по названию макета или найдем функцию ПечатьСчетаНаОплату в модуле ОбщийМодуль.ПечатьТорговыхДокументов.
Рассмотрим структуру типовой функции вывода. В ней создается объект ТабличныйДокумент, затем определяются области макета через ПолучитьОбласть(). Именно здесь кроется решение проблемы.
Разберем на конкретном примере кода, как интегрировать новый столбец. Допустим, мы добавили вертикальную область СтрокаПоставки. Нам нужно изменить код в двух местах: при выводе шапки таблицы и при выводе каждой строки с товаром.
Сначала найдем блок кода, где формируется заголовок таблицы. Нам нужно получить нашу новую область и присоединить её после основных данных:
// В блоке определения областей шапки
ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицы|Данные");
ОбластьСуммы = Макет.ПолучитьОбласть("ШапкаТаблицы|Сумма");
// Получаем нашу новую область шапки
ОбластьСтрокаПоставки = Макет.ПолучитьОбласть("ШапкаТаблицы|СтрокаПоставки");
// Выводим стандартные колонки
ТабличныйДокумент.Присоединить(ОбластьДанных);
ТабличныйДокумент.Присоединить(ОбластьСуммы);
// Присоединяем нашу колонку в конец шапки
ТабличныйДокумент.Присоединить(ОбластьСтрокаПоставки);
Теперь проанализируем цикл, который перебирает строки товаров в документе. Аналогичные действия нужно выполнить для каждой строки, иначе колонка в шапке будет, а в теле документа — нет.
Для Каждого Строка Из СведенияОДокументе.ТаблицаДокумента Цикл
// ... получение стандартных областей строки ...
ОбластьДанных = Макет.ПолучитьОбласть("Строка|Данные");
ОбластьСтрокаПоставки = Макет.ПолучитьОбласть("Строка|СтрокаПоставки");
// Вывод стандартных данных строки
ТабличныйДокумент.Присоединить(ОбластьДанных);
// Заполнение параметра нашей новой колонки данными из строки документа
// Предположим, что в табличной части есть поле "СрокПоставки"
ОбластьСтрокаПоставки.Параметры.СтрокаПоставки = Строка.СрокПоставки;
// Присоединяем заполненную колонку строки
ТабличныйДокумент.Присоединить(ОбластьСтрокаПоставки);
КонецЦикла;
Обратите внимание на использование метода Присоединить(). В отличие от метода Вывести(), который добавляет область вниз (создает новую строку), Присоединить() добавляет область справа к уже выведенной строке. Это ключевой момент для работы с колонками.
Если столбец появился, но он пустой, выясним причину. Чаще всего это происходит из-за того, что в структуру СведенияОДокументе.ТаблицаДокумента не попадает нужное нам поле из базы данных. Вывод в печатную форму обычно работает по цепочке:
Запрос к базе данных -> Заполнение таблицы значений -> Перебор таблицы в цикле -> Заполнение параметров макета.
Если вы просто добавили параметр в макет и в код, но не изменили запрос, который собирает данные для печати, то в Строка.СрокПоставки будет пустота. Проверьте функцию СформироватьСтруктуруСведенийСчетаНаОплату (или аналогичную) — именно там формируется текст запроса (ТекстЗапроса). Вам нужно добавить в выборку ваше новое поле табличной части.
Рассмотрим ситуацию, когда вы не хотите или не можете менять программный код типовой конфигурации (например, чтобы не снимать её с поддержки). В этом случае проанализируем два профессиональных подхода:
.epf). Отредактируйте макет и код внутри этой обработки и подключите её через раздел «Дополнительные отчеты и обработки». Это самый безопасный метод, так как обновления конфигурации не затронут вашу форму.&Вместо. В расширении вы сможете безопасно модифицировать логику формирования ТабличногоДокумента.Данные в макете и вставьте туда новый параметр [СрокПоставки]. Однако это изменит внешний вид уже имеющихся данных.Выделим наиболее частые ошибки, которые мешают корректному отображению:
Строка_Поставки, а в коде вы пишете Макет.ПолучитьОбласть("Строка|СтрокаПоставки"), программа не найдет область и не выдаст ошибку, но колонка не появится. Соблюдайте точность до символа.Текст, то программа не сможет подставить туда реальную дату, она так и напечатает слово «СрокПоставки».Подводя итог, можно сказать, что работа с печатными формами в 1С требует комплексного подхода. Недостаточно просто «нарисовать» столбец — нужно обеспечить его программную поддержку. Использование методов ПолучитьОбласть и Присоединить в связке с правильным заполнением параметров позволяет создавать гибкие и информативные документы любой сложности.