Как правильно отлаживать внешние печатные формы и почему не работает метод прямой загрузки файла?

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

Введение в проблематику

Каждый 1С-разработчик сталкивается с необходимостью отладки внешних печатных форм (ВПФ). Стандартный цикл "Внести изменения -> Сохранить -> Загрузить в 1С -> Проверить" занимает слишком много времени. Поэтому часто используется метод "горячей" отладки, когда обработка загружается напрямую с диска сервера.

В рассматриваемой ситуации возникла проблема: при попытке отладить ВПФ, вызывая её файл с диска внутри кода другой обработки, табличный документ не формировался, хотя отдельно печатная форма работала корректно. Давайте разберем причины такого поведения, проанализируем ошибки в коде и рассмотрим профессиональные способы организации отладки.

Анализ "быстрого" метода отладки и его ошибки

Рассмотрим подход, который часто пытаются применить для быстрой отладки. Разработчик вставляет в модуль внешней обработки следующий код:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Блок отладки
    ВО = ВнешниеОбработки.Создать("D:\ГрупповаяПечатьДляМагнита\ПечатьТТН_Магнит.epf", Ложь);
    ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    Возврат; // Прерывание выполнения основного кода
    
    // Основной код печатной формы
    ПараметрыПечати = Новый Структура;
    Макет = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ТТН");
    // ... логика формирования
КонецПроцедуры

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

1. Проверка имени макета в БСП

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


Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПечатьТТН_Магнит") Тогда
    // Формирование
КонецЕсли;

Если идентификатор макета в КоллекцияПечатныхФорм, который передала вызывающая обработка ("ГрупповаяПечать"), не совпадает с тем, что ожидает код внутри файла .epf, условие вернет Ложь, и табличный документ просто не будет добавлен в коллекцию. При отладке "файловой" версии идентификаторы могут не совпадать с теми, что зарегистрированы в справочнике "Дополнительные отчеты и обработки".

2. Проблема путей на сервере

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

3. Потеря контекста

Когда вы создаете обработку через ВнешниеОбработки.Создать, она работает как самостоятельный объект. Она не знает о том, что она подключена к системе как "Дополнительная обработка", у нее нет ссылки на элемент справочника (если логика кода на это завязана). Хотя для простой печати это редко бывает критичным, если передаются правильные параметры МассивОбъектов.

Правильное решение: использование БСП для отладки

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

Способ 1. Расширение конфигурации для отладки (Рекомендуемый)

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

Для реализации через расширение необходимо:

  1. Добавить в расширение справочник ДополнительныеОтчетыИОбработки.
  2. Добавить к нему два реквизита:
    • СОГ_ПолныйПутьДляОтладки (Строка, 1000) — путь к файлу на сервере.
    • СОГ_ИспользоватьОтладку (Булево) — флаг включения режима.
  3. Перехватить функцию подключения в общем модуле ДополнительныеОтчетыИОбработки.

Пример кода перехвата функции (Аннотация &Вместо):


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

    // Далее следует стандартный код БСП по получению из хранилища...
    // ...
КонецФункции

Преимущества этого метода:

Способ 2. Использование внешней обработки-отладчика

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

Принцип их работы:

  1. Вы запускаете такую обработку в 1С.
  2. Выбираете файл вашей ВПФ на диске.
  3. Выбираете документ-ссылку, для которого нужно сформировать печать.
  4. Нажимаете "Выполнить" (или "Отладка").

Обработка-отладчик сама сформирует правильные структуры КоллекцияПечатныхФорм, ПараметрыВывода и вызовет метод Печать вашей обработки. Это самый безопасный способ, так как он изолирован от рабочей среды.

Рекомендации по устранению ошибки автора

Если вы все же решили использовать "ручной" метод вызова (как в исходном вопросе), обратите внимание на следующие моменты, чтобы это заработало:

  1. Проверьте имя макета. Внутри файла обработки убедитесь, что вы проверяете именно то имя макета, которое передается в коллекции. Временно уберите условие Если УправлениеПечатью.НужноПечататьМакет(...) и печатайте безусловно, чтобы проверить, формируется ли документ.
  2. Правильно передавайте параметры. Убедитесь, что МассивОбъектов содержит ссылки нужного типа.
  3. Следите за кэшем. Если вы изменили файл на диске, но 1С держит старую версию в памяти, перезапустите сеанс или используйте уникальное имя файла при каждом сохранении (менее удобно).
  4. Возврат значения. Процедура Печать в БСП ничего не возвращает, она помещает результат в КоллекцияПечатныхФорм. Убедитесь, что вызываемая "вложенная" обработка действительно записывает табличный документ в переданную по ссылке коллекцию.

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

← На главную