Как программно получить печатную форму с подписями и печатями на сервере 1С?

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

В современных типовых конфигурациях 1С (таких как ERP, УТ 11, КА и БП 3.0), построенных на базе Библиотеки стандартных подсистем (БСП), разработчики столкнулись с существенным изменением архитектуры формирования печатных форм. Если раньше получение табличного документа с факсимиле было тривиальной задачей, то теперь механизмы наложения подписей и печатей стали «формоцентричными». Основная логика вынесена в общую форму ПечатьДокументов, что затрудняет программную генерацию документов (например, для автоматической рассылки по электронной почте) на стороне сервера.

В рамках данной статьи мы разберем, как обойти это ограничение, проанализируем внутренние механизмы работы подсистемы печати и реализуем собственный алгоритм получения готового ТабличныйДокумент с установленными факсимиле.

Почему стандартный вызов Печать() больше не возвращает подписи?

Рассмотрим ситуацию: при вызове метода Печать() из менеджера документа система возвращает «чистый» табличный документ. В новых версиях конфигураций процедура формирования печатной формы отвечает только за вывод данных в ячейки. Наложение изображений (подписей руководителя, главного бухгалтера и печати организации) происходит позже, на этапе вывода табличного документа в форму печати. Это сделано для того, чтобы пользователь мог интерактивно включать или выключать отображение факсимиле перед отправкой на принтер или сохранением в PDF.

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

Шаг 1. Подготовка структуры параметров печати

Для того чтобы типовые механизмы поняли, что в документ нужно добавить изображения, необходимо инициализировать структуру ПараметрыПечати. Без флага ПечатьСПодписьюИПечатью процедуры просто проигнорируют ваш запрос. Выясним, какие поля являются обязательными.

Нам потребуется создать структуру, в которой будет указано, что печать должна выполняться с использованием факсимиле. Разберем пример кода для инициализации таких параметров:


ПараметрыВывода = Новый Структура;
ПараметрыВывода.Вставить("ДополнительныеПараметры", Новый Структура);
ПараметрыВывода.ДополнительныеПараметры.Вставить("ПечатьСПодписьюИПечатью", Истина);

// Также может потребоваться указать коллекцию печатных форм
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("УПД");

Шаг 2. Формирование базового табличного документа

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


// Массив объектов, которые мы печатаем (например, ссылки на документы)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);

ОбъектыПечати = Новый СписокЗначений;
ПараметрыПечати = Новый Структура;

// Вызываем типовой метод формирования
УправлениеПечатью.СформироватьПечатныеФормы(
    "Документ.РеализацияТоваровУслуг", 
    "УПД", 
    МассивОбъектов, 
    ПараметрыПечати, 
    КоллекцияПечатныхФорм, 
    ОбъектыПечати, 
    ПараметрыВывода
);

// Извлекаем полученный табличный документ
СтрокаПечатнойФормы = КоллекцияПечатныхФорм[0];
ТабличныйДокумент = СтрокаПечатнойФормы.ТабличныйДокумент;

Шаг 3. Инициализация данных о факсимиле

Просто вызвать процедуру добавления подписи недостаточно. Система должна знать, чьи именно подписи и какую печать нужно вставить. В конфигурациях типа Бухгалтерия предприятия 3.0 за это отвечают специализированные модули. Рассмотрим, как подготовить данные.

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

Используем процедуру ПодготовитьДанныеДляПечатиПодписиИПечати (название может варьироваться в зависимости от версии БСП, например, УправлениеПечатьюБП.ПодготовитьДанныеДляПечатиПодписиИПечати).

Шаг 4. Программное наложение изображений

Теперь перейдем к самому ответственному моменту — вызову процедуры ДобавитьПодписьИПечать. Эта процедура выполняет сложную работу: она ищет в табличном документе области с именами типа ПодписьРуководителя, ПодписьБухгалтера или текстовые маркеры «М.П.». Затем она создает объекты типа РисунокТабличногоДокумента, устанавливает их координаты, делает фон прозрачным и помещает поверх текста.

Разберем пример реализации обертки, которую упоминал автор темы:


// Подготавливаем структуру для вставки
ПараметрыВставки = Новый Структура;
ПараметрыВставки.Вставить("ТабличныйДокумент", ТабличныйДокумент);
ПараметрыВставки.Вставить("ОбъектыПечати", ОбъектыПечати);

// Если мы в БП 3.0, используем соответствующий модуль
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
    // В некоторых случаях параметры нужно передавать как соответствие 
    // объектов и печатных форм
    СведенияОДокументах = Новый Соответствие;
    СведенияОДокументах.Вставить(СсылкаНаДокумент, Истина); // Истина означает наличие факсимиле
    
    // Вызываем системную процедуру
    УправлениеПечатьюБП.ДобавитьПодписьИПечать(ТабличныйДокумент, СведенияОДокументах, ОбъектыПечати);
КонецЕсли;

Важные нюансы при работе на сервере

При реализации данного функционала следует учитывать несколько критических моментов:

  1. Доступ к томам хранения файлов: Если изображения подписей хранятся в томах на диске, убедитесь, что учетная запись, под которой запущен кластер серверов 1С, имеет права доступа к этим папкам. В противном случае вместо подписей вы получите пустые области.
  2. Z-порядок рисунков: Программное добавление рисунков может перекрывать важную информацию, если в макете неверно определены границы областей. Типовой механизм старается располагать рисунки так, чтобы они не закрывали текст подписей, имитируя «живой» оттиск.
  3. Фоновые задания: При формировании рассылки в фоновом задании контекст формы полностью отсутствует. Именно поэтому ручное заполнение структур ПараметрыВывода и ПараметрыПечати является обязательным.
  4. Имена рисунков в макете: Если вы используете нетиповой макет, убедитесь, что в нем присутствуют именованные рисунки-контейнеры. Процедура ДобавитьПодписьИПечать ищет конкретные имена объектов в коллекции Рисунки табличного документа.

Проанализировав ситуацию, мы видим, что «убийство» типовых процедур формирования подписей разработчиками 1С — это на самом деле переход к более гибкой, хотя и более сложной модели управления печатью. Используя описанный выше подход с ручной инициализацией параметров, вы сможете успешно автоматизировать процесс генерации документов с факсимиле на сервере.

← На главную