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