Почему 1С не видит изменения во внешней печатной форме при печати?

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

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

В этой статье мы подробно проанализируем, почему возникает подобное поведение платформы и Библиотеки стандартных подсистем (БСП), разберем ключевые причины этой проблемы и пошагово рассмотрим способы её решения.

Причина 1: Обращение к общему модулю конфигурации вместо локального макета

Это самая распространенная и неочевидная ошибка, с которой сталкиваются даже опытные разработчики при адаптации стандартных печатных форм (таких как УПД, Торг-12, Счет-фактура) под внешние обработки. Выясним причину этой проблемы подробнее.

Когда мы берем за основу типовую печатную форму, её процедура Печать в модуле объекта часто копируется из конфигурации «как есть». Рассмотрим пример такого кода, который предоставил автор темы:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    СчетаФактуры = ПолучитьСчетФактуры(МассивОбъектов);
    
    Если НЕ ЗначениеЗаполнено(СчетаФактуры) тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не выписана счет фактура";
        Сообщение.Сообщить();
        Возврат;
    КонецЕсли;
    
    ДокументСчф = СчетаФактуры[0];
    ДатаДок = ДокументСчф.Дата;
    
    Если ДатаДок < Дата("20170701") тогда    
        
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "УПДСтатус1_981", "УПД (статус 1)",
            ПечатьУниверсальныхПередаточныхДокументов(СчетаФактуры, ОбъектыПечати, 
            ТекстЗапросаПечатьСчетовФактур(Истина, Истина, Ложь)),,
            "ПФ_MXL_УниверсальныйПередаточныйДокумент");
            
    ИначеЕсли ДатаДок >= Дата("20170701") И ДатаДок < Дата("20171001") тогда        
        
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "УПДСтатус1_981", "УПД (статус 1)",
            ПечатьУниверсальныхПередаточныхДокументов(СчетаФактуры, ОбъектыПечати, 
            ТекстЗапросаПечатьСчетовФактур(Истина, Истина, Ложь)),,
            "ПФ_MXL_УниверсальныйПередаточныйДокумент");
            
    ИначеЕсли ДатаДок >= Дата("20171001") тогда    
        
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "УПДСтатус1_981", "УПД (статус 1)",
            УчетНДС.ПечатьУниверсальныхПередаточныхДокументов981(СчетаФактуры, ОбъектыПечати, 
            ТекстЗапросаПечатьСчетовФактур(Истина, Истина, Истина)),,
            "ПФ_MXL_УниверсальныйПередаточныйДокумент981");
    КонецЕсли;
    
КонецПроцедуры

Обратим внимание на условие, когда дата документа больше или равна 01.10.2017. В этом ветвлении система вызывает метод общего модуля конфигурации: УчетНДС.ПечатьУниверсальныхПередаточныхДокументов981(...).

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

Для решения этой проблемы выполним следующие шаги:

  1. Полностью перенесем (скопируем) код функции ПечатьУниверсальныхПередаточныхДокументов981 из общего модуля конфигурации УчетНДС в модуль объекта вашей внешней печатной формы.
  2. Переименуем её, например, в локальную функцию ЛокальнаяПечатьУниверсальныхПередаточныхДокументов981.
  3. Внутри этой функции найдем строку получения макета. Вместо вызова общего макета конфигурации укажем получение локального макета обработки:
    
    // Вместо получения макета из конфигурации:
    // Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_УниверсальныйПередаточныйДокумент981");
        
    // Пишем получение макета из нашей внешней обработки:
    Макет = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_УниверсальныйПередаточныйДокумент981");
    
  4. В основной процедуре Печать заменим вызов метода общего модуля на нашу новую локальную функцию:
    
    ИначеЕсли ДатаДок >= Дата("20171001") тогда    
            
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "УПДСтатус1_981", "УПД (статус 1)",
            ЛокальнаяПечатьУниверсальныхПередаточныхДокументов981(СчетаФактуры, ОбъектыПечати, 
            ТекстЗапросаПечатьСчетовФактур(Истина, Истина, Истина)),,
            "ПФ_MXL_УниверсальныйПередаточныйДокумент981");
    

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

Причина 2: Кэширование файла обработки в справочнике БСП

Посмотрим на то, как платформа 1С работает с механизмом дополнительных отчетов и обработок. Когда вы открываете внешнюю обработку через меню Файл — Открыть, платформа считывает актуальный файл напрямую с диска вашего компьютера. Любые изменения макета видны сразу.

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

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

  1. Перейдем в раздел Администрирование (или НСИ и администрирование в зависимости от конфигурации).
  2. Выберем пункт Печатные формы, отчеты и обработки, затем перейдем в Дополнительные отчеты и обработки.
  3. Найдем в списке нашу внешнюю печатную форму и откроем её карточку.
  4. Нажмем кнопку Обновить из файла... и укажем путь к сохраненному на диске файлу .epf с актуальными изменениями.
  5. Обязательно нажмем кнопку Записать и закрыть для сохранения изменений в базе данных.

После выполнения этих действий старый кэш в базе данных перезапишется новой версией файла.

Причина 3: Приоритет пользовательских макетов печати

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

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

Посмотрим, как исправить эту ситуацию и вернуть приоритет вашей разработке:

  1. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки.
  2. Откроем гиперссылку Макеты печатных форм.
  3. В открывшемся списке найдем макет, соответствующий нашей печатной форме (например, УПД). Измененные пользователем макеты обычно выделяются в списке зеленым цветом или специальной пиктограммой с карандашом.
  4. Выделим строку с макетом и нажмем кнопку Использовать стандартный макет (или удалим измененный пользователем макет из списка).

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

Причина 4: Влияние безопасного режима исполнения кода

При регистрации внешней обработки в процедуре СведенияОВнешнейОбработке разработчик указывает параметры её запуска. Одним из таких параметров является БезопасныйРежим. Рассмотрим пример заполнения параметров:


ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1";
ПараметрыРегистрации.БезопасныйРежим = Истина; // или Ложь

Если для параметра БезопасныйРежим установлено значение Истина, платформа накладывает жесткие ограничения на исполнение кода внешней обработки. В безопасном режиме запрещены:

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

Резюме

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

  1. Проверяйте вызовы общих модулей: Избегайте использования функций общих модулей конфигурации для получения макетов и формирования табличных документов. Локализуйте эти функции внутри вашей обработки, явно обращаясь к макету через ЭтотОбъект.ПолучитьМакет().
  2. Своевременно обновляйте обработку: После каждого изменения кода в Конфигураторе обязательно выполняйте команду «Обновить из файла» в карточке дополнительной обработки в режиме «1С:Предприятие».
  3. Контролируйте пользовательские макеты: Проверяйте, не перекрывают ли измененные вручную макеты в пользовательском режиме работу вашей внешней обработки.
← На главную