В современных конфигурациях 1С (таких как УТ, БП, ЗУП, ERP), построенных на базе Библиотеки стандартных подсистем (БСП), механизмы интеграции внешних отчетов и обработок полностью стандартизированы. Однако при попытке автоматизировать этот процесс — например, при развертывании обновлений или массовой загрузке обработок — разработчики часто сталкиваются с трудностями. В частности, возникает вопрос: как программно привязать загружаемую внешнюю обработку к определенным разделам (подсистемам) интерфейса?
В этой статье мы подробно разберем, почему стандартный механизм авторегистрации не решает эту задачу напрямую, и пошагово реализуем программную регистрацию внешней обработки с привязкой к нужным разделам.
Часто разработчики пытаются передать разделы интерфейса непосредственно в модуле внешней обработки — внутри экспортной функции СведенияОВнешнейОбработке(). В этой функции формируется структура параметров регистрации, куда пытаются добавить таблицу значений с разделами (как показано в Сообщении 8 темы форума):
// Пример НЕРАБОЧЕГО кода в модуле внешней обработки:
РегистрационныеДанные.Вставить("Разделы", тзРазделы);
Выясним причину, почему этот способ не работает. Стандартный программный интерфейс БСП (функция ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке()) строго регламентирован. В возвращаемой структуре параметров регистрации свойство Разделы попросту не поддерживается на уровне автоматического заполнения. Механизм БСП умеет считывать команды, назначение для контекстных объектов, но распределение по разделам интерфейса для глобальных обработок всегда определяется в пользовательском режиме базы данных при интерактивной или программной записи элемента справочника ДополнительныеОтчетыИОбработки.
Поэтому правильный путь решения — это создание элемента справочника ДополнительныеОтчетыИОбработки программным путем и заполнение его табличной части Разделы.
Для того чтобы полностью программно загрузить файл внешней обработки (.epf или .erf) и привязать его к конкретным подсистемам, нам необходимо выполнить следующие действия:
ДополнительныеОтчетыИОбработки.ИдентификаторыОбъектовМетаданных и добавить их в табличную часть Разделы нашего объекта.Рассмотрим подробнее реализацию каждого шага на примере готового программного кода.
Ниже приведен готовый листинг кода, который вы можете использовать в своей обработке или регламентном задании для автоматической регистрации внешних обработок в интерфейсе.
Процедура ЗарегистрироватьВнешнююОбработкуВРазделах(ПутьКФайлу, ПолноеИмяПодсистемы) Экспорт
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
ВызватьИсключение "Указанный файл внешней обработки не найден!";
КонецЕсли;
// Шаг 1. Помещаем двоичные данные файла во временное хранилище
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла);
// Шаг 2. Создаем элемент справочника БСП
НоваяОбработка = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
НоваяОбработка.Наименование = ФайлНаДиске.ИмяБезРасширения;
НоваяОбработка.ИмяФайла = ФайлНаДиске.Имя;
НоваяОбработка.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется;
// Указываем тип: дополнительная обработка (глобальная)
НоваяОбработка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
// Шаг 3. Регистрация параметров через БСП (заполнение команд из СведенияОВнешнейОбработке)
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.ПараметрыРегистрацииВнешнейОбработки();
ПараметрыРегистрации.АдресВременногоХранилища = АдресХранилища;
ПараметрыРегистрации.ИмяФайла = ФайлНаДиске.Имя;
// Вызываем системный метод БСП для автозаполнения реквизитов и табличной части команд
ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку(НоваяОбработка, ПараметрыРегистрации);
// Шаг 4. Программное заполнение разделов интерфейса
// Важно: Искать подсистему нужно по ее полному имени в метаданных, а не по наименованию!
СсылкаНаРаздел = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту("ПолноеИмя", ПолноеИмяПодсистемы);
Если ЗначениеЗаполнено(СсылкаНаРаздел) Тогда
НоваяСтрокаРаздела = НоваяОбработка.Разделы.Добавить();
НоваяСтрокаРаздела.Раздел = СсылкаНаРаздел;
Иначе
ЗаписьЖурналаРегистрации("РегистрацияОбработки",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Не найдена подсистема с полным именем: " + ПолноеИмяПодсистемы);
EndЕсли;
// Шаг 5. Записываем подготовленный элемент справочника
Попытка
НоваяОбработка.Записать();
Сообщить("Внешняя обработка '" + НоваяОбработка.Наименование + "' успешно зарегистрирована в разделе: " + ПолноеИмяПодсистемы);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ВызватьИсключение "Ошибка при записи внешней обработки: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
КонецПроцедуры
Для вызова этого метода в качестве параметра подсистемы передавайте ее реальное имя из конфигуратора, например, "Подсистема.Продажи", "Подсистема.БанкИКасса" или "Подсистема.Администрирование":
ЗарегистрироватьВнешнююОбработкуВРазделах("C:\Distr\MyProcessing.epf", "Подсистема.Продажи");
Проанализируем ключевые моменты, на которые следует обратить внимание при программной работе со справочником разделов:
НайтиПоНаименованию() для получения ссылки на раздел подсистемы. Наименования подсистем в справочнике идентификаторов могут быть синонимизированы, локализованы или иметь неуникальные названия. Единственный надежный способ — осуществлять поиск по реквизиту ПолноеИмя (например, "Подсистема.Продажи").Разделы имеет смысл только для глобальных видов обработок — таких как ДополнительнаяОбработка и ДополнительныйОтчет. Если вы регистрируете назначаемую (контекстную) обработку (например, ПечатнаяФорма или ЗаполнениеОбъекта), то вместо ТЧ Разделы вам необходимо программно заполнять табличную часть Назначение, указывая там ссылки на объекты метаданных, к которым привязывается обработка (например, к конкретным документам или справочникам).Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка().Применяя описанный подход, вы сможете гибко автоматизировать любые сценарии развертывания ваших программных решений в ландшафте 1С без необходимости ручной настройки интерфейса администраторами системы.