Как программно добавить внешнюю обработку в базу 1С

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

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

Основы программного создания элемента справочника

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

Рассмотрим по шагам процесс загрузки:


// 1. Получаем двоичные данные файла с диска
ПутьКФайлу = "C:\Users\User\Desktop\ТестВнешняяОбработка\ЗагрузкаИзExcel.epf";
ФайлДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);

// 2. Создаем ХранилищеЗначения на основе двоичных данных
// Это критически важный момент, так как реквизиты типа ХранилищеЗначения 
// требуют именно такой обертки.
ХранилищеФайла = Новый ХранилищеЗначения(ФайлДвоичныеДанные);

// 3. Создаем новый элемент в справочнике
НоваяВнешняя = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
НоваяВнешняя.Наименование = "Загрузка из Excel (программная)";
НоваяВнешняя.ИмяФайла = "ЗагрузкаИзExcel.epf";

// 4. Помещаем данные в реквизит ХранилищеОбработки
// Важно: присваивать нужно именно объект типа ХранилищеЗначения, а не сами ДвоичныеДанные.
НоваяВнешняя.ХранилищеОбработки = ХранилищеФайла;

// 5. Записываем элемент
НоваяВнешняя.Записать();

Важное замечание: Если вы допустите ошибку и попытаетесь присвоить напрямую ДвоичныеДанные реквизиту ХранилищеОбработки, система выдаст ошибку при попытке выполнения обработки. Типичное сообщение об ошибке в этом случае гласит: "Значение данного типа невозможно преобразовать для передачи как файл (Неопределено)". Всегда используйте конструктор Новый ХранилищеЗначения(Файл).

Особенности работы в конфигурациях на БСП (БП 3.0, УТ 11, ERP)

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

Проанализируем, какие дополнительные действия необходимо выполнить для корректной регистрации в БСП:

  1. Вызов функции «СведенияОВнешнейОбработке»: Каждая внешняя обработка должна иметь в модуле объекта экспортную функцию СведенияОВнешнейОбработке(). Чтобы не заполнять параметры команд вручную, мы можем программно вызвать эту функцию из загружаемого файла.
  2. Заполнение табличной части «Команды»: В справочнике ДополнительныеОтчетыИОбработки есть табличная часть Команды. Без ее заполнения пользователь не увидит кнопку запуска.
  3. Установка режима публикации: Для того чтобы обработка стала доступна пользователям, реквизит Публикация должен иметь значение Используется.

Рассмотрим более продвинутый пример кода, учитывающий требования БСП:


// Предположим, что мы уже получили ДвоичныеДанные и Хранилище
НоваяВнешняя = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
НоваяВнешняя.Наименование = "Интеллектуальная загрузка";
НоваяВнешняя.ХранилищеОбработки = ХранилищеФайла;
НоваяВнешняя.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
НоваяВнешняя.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется;

// Заполнение команд (упрощенно)
НоваяКоманда = НоваяВнешняя.Команды.Добавить();
НоваяКоманда.Идентификатор = "ОткрытьФорму";
НоваяКоманда.Представление = "Запустить обработку";
НоваяКоманда.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы;

НоваяВнешняя.Записать();

Массовое обновление в 60 базах

Выясним, как масштабировать это решение. Если у вас 60 баз, запускать этот код вручную в каждой из них — не лучший вариант. Разберем стратегии автоматизации:

Вариант 1: Использование COM-соединения. Вы можете написать одну управляющую обработку, которая будет поочередно подключаться к каждой базе через V83.COMConnector. В коде подключения вы будете выполнять поиск существующей обработки по наименованию или уникальному идентификатору и обновлять ее ХранилищеОбработки.

Вариант 2: Расширение конфигурации. Как советовали на форуме, можно создать расширение, включить в него обработку и устанавливать это расширение программно во все базы. Однако это требует изменения метаданных баз, что не всегда допустимо. Программная загрузка через справочник является более «мягким» и гибким способом.

Типичные проблемы и способы их решения

Проанализируем ситуацию, когда обработка загружена, но не работает. Одной из причин может быть безопасный режим. По умолчанию дополнительные обработки запускаются в безопасном режиме, который ограничивает доступ к файловой системе или внешним ресурсам. Если ваша обработка должна, например, читать файлы Excel с диска, необходимо программно установить реквизит БезопасныйРежим = Ложь при создании элемента справочника.

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

Выясним, как проверить корректность загрузки. После выполнения кода зайдите в справочник «Дополнительные отчеты и обработки», найдите ваш элемент и нажмите кнопку «Выполнить». Если форма открылась без ошибок, значит, двоичные данные записаны верно и механизм ХранилищаЗначения отработал штатно.

← На главную