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