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