При работе с типовыми конфигурациями, такими как 1С:Комплексная автоматизация или 1С:ERP, часто возникает ситуация, когда стандартный макет печатной формы полностью устраивает по внешнему виду, но некоторые его поля остаются незаполненными. В данной статье мы разберем, как программно заполнить существующий параметр (в примере автора — ПУНКТ 4_1) своими данными, используя механизм расширений и не снимая конфигурацию с поддержки.
Рассмотрим ситуацию, описанную в теме. Имеется документ, у которого есть встроенный макет печатной формы. В этом макете присутствует именованный параметр ПУНКТ 4_1, который в пользовательском режиме выводится пустым.
Основываясь на обсуждении и структуре нормативных документов, речь идет о Транспортной накладной. Согласно правилам (например, Постановлению Правительства № 2200), пункты 4-го раздела часто касаются сопроводительных документов или сведений об опасных грузах. В типовых решениях 1С логика заполнения этого поля следующая: если в системе не включен учет опасных грузов или в карточке номенклатуры не заполнены соответствующие реквизиты (код ООН, класс опасности), программа оставляет этот параметр пустым или ставит прочерк.
Наша задача — принудительно заполнить этот параметр своими данными (статическим текстом или значением из дополнительного реквизита), не перерисовывая весь макет заново.
Участники обсуждения выделили несколько путей решения. Давайте проанализируем их:
Остановимся подробно на варианте с Расширением конфигурации, так как он позволяет сохранить типовой макет (который обновляется поставщиком 1С) и лишь "подмешать" в него наши данные.
Разберем по шагам, как реализовать заполнение параметра без создания внешней печатной формы.
Создадим новое расширение конфигурации. Нам необходимо добавить в него (заимствовать) следующие объекты:
РеализацияТоваровУслуг или ТранспортнаяНакладная).Прежде чем писать свой код, найдем в модуле менеджера процедуру, отвечающую за печать. Обычно это экспортная процедура вида Печать или функция, возвращающая табличный документ. Нас интересует момент, когда табличный документ уже сформирован, но еще не показан пользователю.
Самый элегантный способ — использовать аннотацию &После. Мы даем типовой конфигурации полностью отработать стандартную логику: получить макет, заполнить основные поля, сформировать табличный документ. А затем, в самом конце, мы находим нужный параметр в готовом документе и подменяем его значение.
Посмотрим на пример кода, который нужно разместить в модуле менеджера документа в расширении:
&После("Печать")
Процедура Расш_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// Находим нужную печатную форму в коллекции по ее имени
// Имя макета ("ТранспортнаяНакладная") нужно уточнить в конфигураторе
ПечатнаяФорма = УправлениеПечатью.НайтиПечатнуюФормуВКоллекции(
КоллекцияПечатныхФорм, "ТранспортнаяНакладная");
Если ПечатнаяФорма <> Неопределено Тогда
// Получаем сам табличный документ
ТабДок = ПечатнаяФорма.ТабличныйДокумент;
// Ищем параметр в табличном документе.
// Важно: в готовом табличном документе параметры могут быть уже заменены на текст,
// но если параметр не был заполнен, он часто остается доступным как свойство области или параметр.
// Вариант А: Если параметр доступен в коллекции Параметры
Попытка
ТабДок.Параметры.ПУНКТ_4_1 = "Наш текст для пункта 4.1";
Исключение
// Вариант Б: Если параметр уже выведен в ячейку, ищем область
// Это более сложный случай, требующий поиска ячейки по тексту или имени
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Обратите внимание: Если в типовом макете ячейка имеет тип заполнения "Параметр" и имя ПУНКТ_4_1, то обращение через ТабДок.Параметры.ПУНКТ_4_1 сработает корректно даже после формирования формы, при условии, что этот параметр существует в коллекции параметров табличного документа.
В обсуждении справедливо замечено: "Нужно понять откуда возьмутся свои данные". Если текст всегда одинаковый (статичный), его можно прописать прямо в коде, как в примере выше. Однако чаще данные меняются от документа к документу.
Рассмотрим правильный подход для динамических данных:
1С:Предприятие добавим для документа Дополнительный реквизит (строкового типа), назовем его "Данные для п. 4.1".Пример получения данных из доп. реквизита внутри процедуры печати:
// Внутри цикла по объектам или запроса
// Получаем значение доп. реквизита (используя БСП функцию или запрос)
ЗначениеПараметра = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "Данные_для_п_4_1");
ТабДок.Параметры.ПУНКТ_4_1 = ЗначениеПараметра;
Для решения задачи заполнения пустого параметра в типовой печатной форме:
&После.ТабличныйДокумент.Параметры для установки своего значения.Такой подход обеспечивает минимальное вмешательство в типовой код и гарантирует, что при обновлении релиза 1С ваша доработка продолжит функционировать, а сам макет (его шапка, подвал, другие поля) обновится автоматически, если разработчики 1С внесут в него изменения.