Как программно получить макет из внешней обработки в 1С?

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

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

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

Почему возникает ошибка при обращении к макету?

Часто разработчики пытаются использовать метод ВнешниеОбработки.Создать() непосредственно в коде формы на клиенте. Это приводит к ошибке, так как объектная модель внешних обработок недоступна на тонком клиенте. Методы работы с файловой системой и создание объектов обработок должны выполняться только на сервере.

Давайте проанализируем правильный подход. Нам необходимо передать путь к файлу на сервер, там создать экземпляр обработки, извлечь макет и, при необходимости, вернуть результат обратно.

Решение 1: Получение макета из файла на диске

Рассмотрим ситуацию, когда файл внешней обработки лежит в известном каталоге на сервере или доступен по сети. Для получения макета мы будем использовать менеджер ВнешниеОбработки.

Разберем по шагам функцию, которую необходимо разместить в серверном модуле или в секции &НаСервере модуля формы:

  1. Создаем экземпляр обработки, используя путь к файлу. Обратите внимание на второй параметр метода Создать — Ложь. Он указывает, что мы не подключаем обработку в безопасном режиме (если это допустимо политикой безопасности), что важно для корректной работы некоторых механизмов.
  2. Используем метод ПолучитьМакет созданного объекта.

Посмотрим на пример кода функции:


&НаСервере
Функция ПолучитьМакетИзФайлаОбработки(ПолноеИмяФайла, ИмяМакета)
    
    // Создаем объект внешней обработки по пути к файлу
    ОбработкаОбъект = ВнешниеОбработки.Создать(ПолноеИмяФайла, Ложь);
    
    // Получаем макет по имени
    Макет = ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
    
    Возврат Макет;

КонецФункции

В данном примере переменная ПолноеИмяФайла должна содержать путь, доступный именно серверу 1С.

Решение 2: Если обработка хранится в базе (Двоичные данные)

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

Нам потребуется выполнить следующие действия:

  1. Получить двоичные данные файла из хранилища значений.
  2. Сохранить эти данные во временный файл на сервере с расширением .epf.
  3. Создать обработку из этого временного файла.
  4. Получить макет.
  5. Удалить временный файл, чтобы не засорять дисковое пространство сервера.

Рассмотрим реализацию этого алгоритма:


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

КонецФункции

Важные нюансы

При работе с этим механизмом обратите внимание на следующие моменты:

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

Тип макета. Метод ПолучитьМакет возвращает разные типы объектов в зависимости от содержимого макета (ТабличныйДокумент, СхемаКомпоновкиДанных, ДвоичныеДанные и т.д.). Убедитесь, что ваш код готов обработать возвращаемый тип данных.

Используя эти методы, вы сможете гибко работать с ресурсами внешних обработок, не нарушая клиент-серверную архитектуру 1С.

← На главную