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