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