Как реализовать авторегистрацию внешней обработки в дополнительных отчетах и обработках в 1С:УТ?

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

При разработке внешних обработок для конфигураций на базе Библиотеки Стандартных Подсистем (БСП), таких как «1С:Управление торговлей», часто возникает задача максимально упростить жизнь пользователям и администраторам. Стандартный путь регистрации внешней обработки (через ручное добавление файла в справочник «Дополнительные отчеты и обработки») может вызывать трудности у неподготовленных сотрудников. Гораздо удобнее, когда пользователь просто открывает файл через меню Файл -> Открыть, а система автоматически регистрирует его в базе данных для последующего постоянного использования.

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

Общий алгоритм работы авторегистрации

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

  1. Интерактивный запуск: Администратор системы открывает файл обработки на своем компьютере.
  2. Чтение пути к файлу: Программа определяет физический путь к открытому файлу обработки на диске пользователя.
  3. Передача двоичных данных: Файл считывается в бинарном виде и временно помещается в сетевое хранилище для передачи на серверную сторону.
  4. Получение метаданных: Из модуля объекта обработки вызывается экспортная функция СведенияОВнешнейОбработке, чтобы получить имя, версию, описание и команды.
  5. Проверка на дубли: Выполняется запрос к справочнику дополнительных обработок, чтобы не перезаписать или не заблокировать существующую регистрацию.
  6. Программная запись: Создается новый элемент справочника БСП, заполняются реквизиты, загружается бинарник, и элемент записывается в базу данных.

Рассмотрим подробнее каждый этап реализации.

Шаг 1. Подготовка модуля объекта обработки

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


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.2.1");
    
    ПараметрыРегистрации.Вид = "ДополнительнаяОбработка";
    ПараметрыРегистрации.Версия = "1.0.0.1";
    ПараметрыРегистрации.Наименование = "Автоматический помощник продаж";
    ПараметрыРегистрации.Информация = "Эта обработка автоматически регистрируется в системе при первом открытии.";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    // Опишем команду для запуска обработки
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Открыть помощник продаж";
    НоваяКоманда.Идентификатор = "ОткрытьФормуПомощника";
    НоваяКоманда.Использование = "ОткрытиеФормы";
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Здесь мы указываем базовые настройки: вид обработки, ее наименование и команду, которая будет отображаться в интерфейсе после успешного добавления в систему.

Шаг 2. Разработка формы и чтение файла на клиенте

В форме внешней обработки (обычно это основная форма) нам необходимо перехватить событие открытия или добавить специальную кнопку. Безопаснее и нагляднее добавить на форму кнопку «Установить в систему». Выясним, как получить сам файл обработки и передать его на сервер.

На клиенте путь к текущему запущенному файлу хранится в свойстве формы ЭтотОбъект.ИспользуемоеИмяФайла. Нам нужно прочитать этот файл в двоичные данные:


&НаКлиенте
Процедура УстановитьВСистему(Команда)
    
    ПутьКФайлу = ЭтаФорма.ЭтотОбъект.ИспользуемоеИмяФайла;
    
    Если ПустаяСтрока(ПутьКФайлу) Тогда
        ПоказатьПредупреждение(, "Не удалось определить путь к файлу. Откройте обработку через Файл -> Открыть.");
        Возврат;
    КонецЕсли;
    
    ФайлНаДиске = Новый Файл(ПутьКФайлу);
    Если Не ФайлНаДиске.Существует() Тогда
        ПоказатьПредупреждение(, "Файл обработки отсутствует по указанному пути.");
        Возврат;
    КонецЕсли;
    
    // Переводим файл в двоичные данные для загрузки в Справочник
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
    
    // Вызываем серверную процедуру регистрации
    РезультатРегистрации = ЗарегистрироватьОбработкуНаСервере(АдресВХранилище, ФайлНаДиске.ИмяБезРасширения);
    
    ПоказатьПредупреждение(, РезультатРегистрации);
    
КонецПроцедуры

Шаг 3. Обработка данных и запись в справочник на сервере

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

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

Проанализируем пример серверной функции регистрации:


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

Важные нюансы и ограничения

При реализации авторегистрации обязательно учитывайте следующие важные моменты:

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

← На главную