Переносим файл .epf внутрь расширения конфигурации: объект, права, вызов

· 9 мин

Содержание

Добавить внешнюю обработку в расширение 1С можно двумя путями. Первый — сделать её «своей» обработкой расширения: в Конфигураторе создать в ветке Обработки расширения новый объект и перенести в него реквизиты, формы и модуль из файла .epf. Второй — оставить обработку внешней, положить файл в общий макет расширения и подключать его из кода методом ВнешниеОбработки.Подключить().

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

Какой способ выбрать: объект расширения, макет или дополнительные обработки

Решение зависит от того, кто правит код обработки и как часто.

СпособКогда подходитМинусы
Своя обработка расширенияОбработка стабильна, нужна в меню раздела, нужны права через рольЛюбая правка кода — новая версия расширения
.epf в общем макете расширенияФайл обновляет сторонний разработчик, расширение служит «упаковкой» и точкой вызоваСложнее отлаживать, нужно продумать безопасный режим
Дополнительные отчеты и обработки (БСП)Нужно просто дать пользователям файл с регистрацией и командамиОбработку надо дорабатывать под интерфейс регистрации, расширение не участвует

Дальше разобраны первые два способа: именно они отвечают на вопрос «как завести внешнюю обработку в расширение».

Подготовка: файл .epf, расширение и префикс имён

Перед переносом соберите всё необходимое.

  • 📄 Файл обработки .epf и, если есть, исходники от разработчика. Откройте его в Конфигураторе через Файл → Открыть и убедитесь, что он открывается без ошибок в вашей версии платформы.
  • 🧩 Расширение. Если расширения ещё нет, создайте его: Конфигурация → Расширения конфигурации, кнопка «Добавить». Расширения появились в платформе 8.3.6, но для работы с собственными объектами лучше актуальная платформа 8.3.2x.
  • 🏷️ Префикс имён. В свойствах расширения задайте префикс, например Расш1_. Имена собственных объектов расширения должны начинаться с него, иначе проверка конфигурации выдаст предупреждение, а при совпадении имён с объектами основной конфигурации расширение не применится.
  • 💾 Копия базы. Расширение не меняет основную конфигурацию, но при обновлении структуры базы данных ошибка в нём может помешать запуску у пользователей.

Сначала посмотрите, к каким объектам конфигурации обращается обработка: справочникам, регистрам, общим модулям. Если она вызывает процедуры общих модулей, расширению понадобится доступ к ним. Экспортные процедуры общих модулей вызываются из кода расширения напрямую, заимствовать модуль ради вызова не нужно.

Сохраните исходную обработку

Положите исходный .epf рядом с выгрузкой расширения .cfe. Если перенос пойдёт не так, вы всегда вернётесь к рабочему файлу, а позже сможете сравнить поведение «до» и «после».

Создание обработки в дереве метаданных расширения

Это основной способ. Обработка становится полноценным объектом расширения: у неё есть свои формы, модуль объекта, модуль менеджера, команды и права.

Шаг 1. Добавьте объект

  1. Откройте дерево расширения: Конфигурация → Расширения конфигурации, выделите расширение, кнопка «Открыть».
  2. В дереве найдите ветку Обработки, щёлкните по ней правой кнопкой и выберите «Добавить».
  3. Задайте имя с префиксом, например Расш1_ЗагрузкаЦенПоставщика, и синоним — его пользователи увидят в интерфейсе.

Шаг 2. Замените содержимое внешней обработкой

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

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

Шаг 3. Если команды замены нет — перенесите вручную

В некоторых версиях платформы команда замены для объектов расширения может быть недоступна. Тогда переносите по частям:

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

Имена реквизитов должны совпасть до буквы. Форма ссылается на реквизиты объекта по имени, и при расхождении элементы формы потеряют связь с данными.

Шаг 4. Поправьте код

Внешняя обработка обращается к себе как к ВнешняяОбработка.Имя, а объект расширения — как к Обработка.Имя. Найдите в модулях строки вида "ВнешняяОбработка. и замените их. То же с вызовами ВнешниеОбработки.Создать() внутри самой обработки: теперь вместо них нужен Обработки.Расш1_ЗагрузкаЦенПоставщика.Создать().

Затем запустите Конфигурация → Проверка конфигурации в окне расширения и Синтаксический контроль модулей.

Свойства обработки, команда и место в интерфейсе

Сама по себе обработка в расширении пользователю не видна. Её нужно вывести в командный интерфейс.

Основная форма

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

Подсистема

Чтобы обработка появилась в разделе, например «Склад» или «Администрирование»:

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

Своя команда

Если нужна кнопка с особым названием или открытие с параметрами, добавьте обработке команду на закладке Команды. Укажите группу, например панель действий раздела, и опишите обработчик:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("Обработка.Расш1_ЗагрузкаЦенПоставщика.Форма", ,
        ПараметрыВыполненияКоманды.Источник,
        ПараметрыВыполненияКоманды.Уникальность,
        ПараметрыВыполненияКоманды.Окно);
КонецПроцедуры

Свойства самого расширения

При загрузке расширения в режиме предприятия (в типовых конфигурациях: Администрирование → Печатные формы, отчеты и обработки → Расширения) обратите внимание на флажок «Безопасный режим». В безопасном режиме код расширения не может работать с файлами на сервере, COM-объектами, внешними компонентами и подключать внешние обработки без безопасного режима. Если обработка что-то читает с диска сервера, это ограничение сработает первым.

Права доступа: роль расширения и профили

Обработка расширения подчиняется тем же правилам ролей, что и объекты основной конфигурации. Без права на неё пользователь получит Нарушение прав доступа! или просто не увидит команду.

  1. В дереве расширения добавьте в ветку Роли новую роль, например Расш1_ИспользованиеЗагрузкиЦен.
  2. Откройте её и найдите вашу обработку. Установите права Использование и Просмотр.
  3. Если обработка читает или пишет данные справочников и документов, этих прав в роли расширения недостаточно сами по себе: у пользователя должны быть права на эти объекты из основной конфигурации.
  4. Обновите конфигурацию базы данных (F7 в окне расширения).

Дальше роль нужно выдать пользователю:

  • в конфигурациях на БСП — включить её в профиль групп доступа: Администрирование → Настройки пользователей и прав → Профили групп доступа, затем добавить пользователя в группу с этим профилем;
  • в конфигурациях без БСП — отметить роль у пользователя в Конфигураторе: Администрирование → Пользователи, закладка «Прочие».

Роли расширения можно также заимствовать и дописать в них права на свои объекты. Это работает, но при обновлении типовой конфигурации заимствованная роль требует внимания. Отдельная своя роль проще в сопровождении.

Отдельное право на интерактивное открытие внешних обработок обработке расширения не нужно: для платформы это обычный объект конфигурации. Это ещё один довод переносить обработку внутрь, а не открывать файлом.

Вызов внешней обработки из кода расширения

Есть два варианта вызова: вашей обработки расширения и «настоящей» внешней обработки, которая лежит в расширении файлом.

Вызов обработки расширения

Из любого модуля расширения обработка вызывается по имени менеджера. Пример на сервере — выполнить загрузку без открытия формы:

&НаСервереБезКонтекста
Процедура ЗагрузитьЦеныНаСервере(ИмяФайла)
    Обработка = Обработки.Расш1_ЗагрузкаЦенПоставщика.Создать();
    Обработка.ИмяФайла = ИмяФайла;
    Обработка.ВыполнитьЗагрузку();
КонецПроцедуры

Здесь ИмяФайла — реквизит обработки, а ВыполнитьЗагрузку — экспортная процедура модуля объекта. Без слова Экспорт в модуле объекта вызов не сработает.

Подключение .epf из общего макета

Если обработка должна остаться внешней, упакуйте её файл в расширение:

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

&НаКлиенте
Процедура ОткрытьВнешнююЗагрузку(Команда)
    ИмяОбработки = ПодключитьОбработкуИзМакета();
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры

Третий параметр Подключить — безопасный режим. Значение Истина запрещает обработке опасные действия: работу с файлами сервера, COM, привилегированный режим. Если обработке они нужны, передайте Ложь, но тогда само расширение должно быть загружено без безопасного режима.

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

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

Если обработка не видна или не открывается: диагностика

Большинство проблем после переноса укладывается в несколько симптомов.

Диагностика: выберите симптом

Как отладить код обработки расширения

Точки останова в модулях расширения ставятся так же, как в основной конфигурации. Запустите предприятие из Конфигуратора (F5) или подключитесь к работающему сеансу через Отладка → Подключение.

Для серверного кода в клиент-серверном варианте сервер 1С должен работать с включённой отладкой: у службы агента сервера в командной строке есть ключ -debug. Изменение параметров службы требует её перезапуска, а перезапуск агента оборвёт сеансы всех пользователей — делайте это вне рабочего времени.

С обработкой, подключённой из макета, точки останова в Конфигураторе срабатывают хуже: код живёт во временном файле. Удобнее отладить .epf отдельно, открыв его через Файл → Открыть, и только потом загружать в макет.

Частые вопросы

Слетит ли обработка расширения при обновлении типовой конфигурации?
Нет. Собственные объекты расширения не зависят от релиза типовой. Проверять после обновления нужно заимствованные объекты: подсистемы, роли, формы.
Можно ли поставить в расширение несколько внешних обработок?
Да. Каждая становится отдельным объектом в ветке «Обработки» или отдельным общим макетом. Ограничения на количество нет.
Нужна ли лицензия на расширение?
Нет, отдельно не лицензируется. Расширение работает в рамках лицензий, которые уже есть на базу.
Работает ли расширение с обработкой в 1С:Фреш и облачных базах?
Зависит от политики сервиса. Обычно там разрешены только расширения в безопасном режиме, поэтому обработке нельзя работать с файлами сервера и COM.
Как вернуть обработку обратно во внешний файл?
В контекстном меню объекта обработки в дереве расширения выберите «Сохранить как внешнюю обработку, отчет…». Получится обычный файл .epf.