Как заполнить параметр в существующем макете печатной формы 1С через расширение?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При работе с типовыми конфигурациями, такими как 1С:Комплексная автоматизация или 1С:ERP, часто возникает ситуация, когда стандартный макет печатной формы полностью устраивает по внешнему виду, но некоторые его поля остаются незаполненными. В данной статье мы разберем, как программно заполнить существующий параметр (в примере автора — ПУНКТ 4_1) своими данными, используя механизм расширений и не снимая конфигурацию с поддержки.

Анализ задачи и контекст проблемы

Рассмотрим ситуацию, описанную в теме. Имеется документ, у которого есть встроенный макет печатной формы. В этом макете присутствует именованный параметр ПУНКТ 4_1, который в пользовательском режиме выводится пустым.

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

Наша задача — принудительно заполнить этот параметр своими данными (статическим текстом или значением из дополнительного реквизита), не перерисовывая весь макет заново.

Выбор метода решения

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

  1. Изменение конфигурации: Включить возможность изменения, найти модуль менеджера документа и дописать код. Минус: сложности при обновлении.
  2. Внешняя печатная форма: Создать внешнюю обработку, скопировать туда макет и код печати. Минус: трудоемко, нужно следить за актуальностью макета при изменении законодательства.
  3. Расширение конфигурации: Наиболее современный и правильный подход. Мы можем "перехватить" процесс печати и внести изменения точечно.

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

Алгоритм реализации через Расширение

Разберем по шагам, как реализовать заполнение параметра без создания внешней печатной формы.

Шаг 1. Подготовка расширения

Создадим новое расширение конфигурации. Нам необходимо добавить в него (заимствовать) следующие объекты:

Шаг 2. Анализ типового кода

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

Шаг 3. Написание кода (Пост-обработка)

Самый элегантный способ — использовать аннотацию &После. Мы даем типовой конфигурации полностью отработать стандартную логику: получить макет, заполнить основные поля, сформировать табличный документ. А затем, в самом конце, мы находим нужный параметр в готовом документе и подменяем его значение.

Посмотрим на пример кода, который нужно разместить в модуле менеджера документа в расширении:


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

Обратите внимание: Если в типовом макете ячейка имеет тип заполнения "Параметр" и имя ПУНКТ_4_1, то обращение через ТабДок.Параметры.ПУНКТ_4_1 сработает корректно даже после формирования формы, при условии, что этот параметр существует в коллекции параметров табличного документа.

Где взять данные для заполнения?

В обсуждении справедливо замечено: "Нужно понять откуда возьмутся свои данные". Если текст всегда одинаковый (статичный), его можно прописать прямо в коде, как в примере выше. Однако чаще данные меняются от документа к документу.

Рассмотрим правильный подход для динамических данных:

  1. В режиме 1С:Предприятие добавим для документа Дополнительный реквизит (строкового типа), назовем его "Данные для п. 4.1".
  2. Пользователи будут заполнять это поле в документе.
  3. В коде расширения нам нужно будет считать это значение.

Пример получения данных из доп. реквизита внутри процедуры печати:


// Внутри цикла по объектам или запроса
// Получаем значение доп. реквизита (используя БСП функцию или запрос)
ЗначениеПараметра = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "Данные_для_п_4_1");

ТабДок.Параметры.ПУНКТ_4_1 = ЗначениеПараметра;

Резюме

Для решения задачи заполнения пустого параметра в типовой печатной форме:

  1. Не копируйте макет во внешние обработки без острой необходимости — это усложнит поддержку.
  2. Используйте Расширения конфигурации.
  3. Применяйте метод пост-обработки: перехватывайте управление после выполнения стандартной процедуры печати с помощью аннотации &После.
  4. Обращайтесь к коллекции ТабличныйДокумент.Параметры для установки своего значения.

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

← На главную