Как восстановить работу внешних печатных форм после удаления процедуры ДополнитьДокументПодписьюИПечатью

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

С выходом обновлений «1С:Бухгалтерия предприятия» (начиная с релиза 3.0.148) многие разработчики столкнулись с критической ошибкой, проводя отладку печатных форм. Причина кроется в исключении или «заглушке» процедуры УправлениеПечатьюБП.ДополнитьДокументПодписьюИПечатью. Фирма 1С переходит на новые механизмы Библиотеки Стандартных Подсистем (БСП), которые требуют иного подхода к выводу факсимиле. В этой статье мы подробно разберем, как адаптировать ваши внешние печатные формы под новые требования.

Выясним причину проблемы и проанализируем изменения

Ранее процедура ДополнитьДокументПодписьюИПечатью выполняла поиск именованных рисунков в макете и программно вставляла в них изображения подписей и печатей. Теперь же механизм вывода факсимиле стал частью общего процесса печати на уровне платформенных инструментов и общих модулей БСП. Если просто удалить вызов старой процедуры, печать и подписи могут выводиться в экранной форме (через общие механизмы), но они перестают отображаться при программном сохранении в PDF или массовой рассылке документов.

Проанализируем основные требования нового механизма:

  1. Имена рисунков в макете: Теперь система ожидает строго определенные имена для картинок-контейнеров (например, в формах ТОРГ-12): ФаксимильнаяПечать, ФаксимилеРуководитель, ФаксимилеГлавныйБухгалтер.
  2. Привязка областей: Для корректной работы системе нужно точно знать, какая область табличного документа соответствует конкретной ссылке на объект, например, формируя формы МХ-1 и МХ-3.
  3. Перенос логики: Наложение факсимиле теперь часто происходит «постфактум» в общей форме печати, что ломает кастомные обработки, которые ожидают готовый документ сразу из модуля менеджера.

Способ 1. Адаптация макета и использование стандартных механизмов

Рассмотрим самый правильный, с точки зрения архитектуры БСП, путь. Если ваша внешняя печатная форма с возможностью изменения макета использует стандартную форму печати, достаточно выполнить следующие шаги:

Во-первых, переименуем рисунки в макете. Вместо произвольных имен используем стандартные:

Во-вторых, в коде формирования печатной формы (в цикле по документам) необходимо обязательно вызвать метод УправлениеПечатью.ЗадатьОбластьПечатиДокумента. Это критически важно для того, чтобы система понимала, к какому документу привязать подписи. Рассмотрим пример кода:


// В цикле формирования документов
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// ... вывод областей (заголовок, строки, подвал) ...

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

При использовании такого подхода и наличии правильно именованных рисунков в макете, кнопка «Подпись и печать» в стандартном окне предпросмотра будет работать корректно без дополнительных вызовов программного кода.

Способ 2. Программное внедрение факсимиле (для рассылок и сохранения в PDF)

Если ваша задача — получить табличный документ с уже внедренными картинками (например, для немедленной отправки по почте), нам придется реализовать «обертку», заменяющую удаленную процедуру. Разберем по шагам, как это сделать, используя новые методы общего модуля УправлениеПечатью.

Создадим вспомогательную процедуру, которую можно разместить в модуле внешней печатной формы или в общем модуле:


Процедура ДобавитьПодписьИПечать(ТабДокумент, ОбъектыПечати) Экспорт
    // Подготавливаем структуру данных для рисунков
    ДанныеПечатиРисунков = УправлениеПечатью.ПодписиИПечатиТабличногоДокумента(ОбъектыПечати, ТабДокумент, "ru");
    
    // Получаем области, где должны быть подписи
    ПодписиИПечатиОбластей = УправлениеПечатью.ПодписиИПечатиОбластей(ОбъектыПечати);
    
    Для Каждого ПодписиИПечатиОбласти Из ПодписиИПечатиОбластей Цикл
        ИмяОбласти = ПодписиИПечатиОбласти.Ключ;
        
        Если ДанныеПечатиРисунков[ИмяОбласти] = Неопределено Тогда
            ДанныеПечатиРисунков[ИмяОбласти] = Новый Соответствие;
        КонецЕсли;
        
        Для Каждого Элемент Из ПодписиИПечатиОбласти.Значение Цикл
            ДанныеПечатиРисунков[ИмяОбласти][Элемент.Ключ] = Элемент.Значение;
        КонецЦикла;
    КонецЦикла;
    
    // Физически добавляем картинки в табличный документ
    УправлениеПечатью.ДобавитьПодписьИПечать(ТабДокумент, ДанныеПечатиРисунков);
КонецПроцедуры

Обратите внимание, что параметр ОбъектыПечати должен быть типом СписокЗначений, где в значении хранится ссылка на документ, а в представлении — уникальный идентификатор области (например, "Документ_1").

Способ 3. Универсальный "костыль" для обратной совместимости

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


Функция ПолучитьОписаниеРисунков(ТабличныйДокумент)
    РисункиМассив = Новый Массив;
    Для Каждого Рисунок Из ТабличныйДокумент.Рисунки Цикл
        Если УправлениеПечатью.ЭтоПодписьИлиПечать(Рисунок) Тогда
            Описание = Новый Структура("Лево,Верх,Ширина,Высота,Картинка,Имя,Линия,РазмерКартинки");
            ЗаполнитьЗначенияСвойств(Описание, Рисунок);
            РисункиМассив.Добавить(Описание);
        КонецЕсли;
    КонецЦикла;
    Возврат РисункиМассив;
КонецФункции

Использование подобных функций позволяет «вручную» пересоздать объекты типа РисунокТабличногоДокумента, если штатные механизмы по какой-то причине не видят ваши области макета. Однако мы рекомендуем придерживаться Способа 1, так как он наиболее устойчив к будущим обновлениям платформы.

Важные рекомендации

Проанализируем несколько важных нюансов, которые помогут избежать ошибок:

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

← На главную