Разработчики 1С, работающие с конфигурацией «Управление производственным предприятием» (УПП) или другими решениями на обычных формах, часто сталкиваются с загадочной ситуацией: во внешнюю печатную форму (ВПФ) внесены изменения, макет подправлен, файл сохранен и загружен в базу, но при печати документа программа упорно выдает старый вариант. При этом, если открыть ту же обработку через меню «Файл — Открыть», всё работает корректно. В этой статье мы подробно разберем, где именно «прячется» старая версия формы и как заставить систему подхватить обновленный файл.
Первым делом проанализируем структуру справочника Внешние обработки. В УПП этот справочник используется для хранения всех дополнительных печатных форм, обработок и заполнений табличных частей. Основная ловушка заключается в том, что файл обработки может храниться в двух местах внутри одной карточки.
Разберем по шагам, как это устроено:
ХранилищеЗначения.Проанализируем ситуацию: если вы обновили файл только в «шапке» карточки, но в табличной части осталась ссылка на старую версию, система при вызове печати из документа может продолжать использовать именно тот двоичный файл, который «прилип» к строке назначения. Чтобы решить эту проблему, убедитесь, что при обновлении файла вы перезаписали его во всех возможных местах внутри элемента справочника и обязательно нажали кнопку «Записать». Без нажатия кнопки сохранения изменения в ХранилищеЗначения не зафиксируются в базе данных.
Если обновление файла в справочнике не помогло, выясним причину в механизме управления макетами. В платформе 1С:Предприятие 8.2 и 8.3 существует стандартный функционал «Управление макетами печатных форм». Этот механизм имеет приоритет над программным кодом внешней обработки.
Рассмотрим подробнее: пользователь мог зайти в меню «Сервис» (или «Администрирование» в более свежих релизах) и отредактировать макет конкретно этой печатной формы «под себя». В этом случае система создает запись в специальном регистре сведений. Даже если вы полностью перепишете код внешней обработки и измените в ней макет, программа проигнорирует его и возьмет тот, что сохранен в пользовательских настройках.
Как это проверить:
Когда мы запускаем внешнюю печатную форму, платформа 1С не работает с ней напрямую из базы данных. Сначала она выгружает двоичные данные из хранилища во временную папку пользователя на диске (директория %TEMP%). После этого происходит запуск файла. Иногда из-за сбоев прав доступа или особенностей работы операционной системы файл во временной папке не перезаписывается новым.
Проанализируем алгоритм борьбы с кэшем:
AppData\Local\Temp (или через системную переменную %TEMP%) и удалите все файлы и папки, названия которых начинаются на v8_.Иногда «старая печать» — это не проблема кэша, а логическая ошибка внутри модуля обработки. Посмотрим на пример типичной структуры функции Печать():
Функция Печать() Экспорт
// Если макет получается не из самой обработки, а из конфигурации
// ТабДокумент = ПолучитьОбщийМакет("М4"); // ОШИБКА: всегда будет старый макет из конфы
// Правильный способ:
Макет = ЭтотОбъект.ПолучитьМакет("ИмяВашегоМакета");
// ... дальнейшая логика формирования
КонецФункции
Если в коде жестко прописано обращение к макету через ПолучитьОбщийМакет() или обращение к макету конкретного документа в метаданных, то любые изменения макета внутри самого файла .epf никак не повлияют на результат. Проверьте, что метод ПолучитьМакет() вызывается именно у объекта ЭтотОбъект (самой внешней обработки).
Выясним еще одну неочевидную причину: коллизия имен. Если макет внутри вашей внешней формы называется точно так же, как макет в основной конфигурации (например, Накладная), система может запутаться в контекстах исполнения. Проанализируем ситуацию: при определенных настройках безопасности или в специфических процедурах печати (например, если используется универсальный механизм из УПП), платформа может приоритетно искать макет в метаданных документа, а не во внешнем объекте.
Рекомендация: Всегда давайте макетам во внешних обработках уникальные имена с префиксами. Например, вместо ТОРГ12 используйте ВН_ТОРГ12_Фирма. Это гарантирует, что ЭтотОбъект.ПолучитьМакет() вернет именно ваш вариант.
Подводя итог, если ваша внешняя печатная форма в УПП «не видит» обновлений, выполните следующий чек-лист:
%TEMP%.ЭтотОбъект.Помните, что УПП — система почтенного возраста, и многие механизмы в ней работают на «обычном» интерфейсе, который более чувствителен к состоянию файлового кэша и корректности записи объектов в базу, чем современные управляемые формы.