Как интегрировать внешнюю обработку БСП в список документов: вывод в меню «Еще», передача параметров и автоматическое обновление списка

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

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

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

Давайте пошагово решим все три задачи, поставленные автором темы.

Шаг 1. Вывод внешней обработки в меню «Еще» списка документов

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

Выясним ключевые параметры регистрации, которые нам понадобятся:

  1. Вид обработки. Чтобы обработка отображалась в контексте объекта или списка, мы должны задать ей вид "ЗаполнениеОбъекта" (или использовать программный метод БСП ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()). Это заставит систему вывести команду в меню «Еще» -> «Изменить / Заполнить».
  2. Назначение. Мы явно указываем массив объектов метаданных, к которым привязывается обработка. В нашем случае это "Документ.РазовоеНачисление".
  3. Тип команды. Нам нужно открыть интерактивную форму обработки, поэтому мы указываем тип команды как "ОткрытиеФормы" (или ТипКомандыОткрытиеФормы()).

Рассмотрим пример кода, который необходимо разместить в Модуле объекта внешней обработки:


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

После загрузки этого файла в справочник «Дополнительные отчеты и обработки» в режиме «1С:Предприятие», система автоматически добавит команду в меню списка документов.

Шаг 2. Чтение текущих настроек и параметров списка при открытии

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

При запуске команды с типом "ОткрытиеФормы", БСП автоматически передает в параметры открываемой формы специальную структуру. В ней содержится параметр ОбъектыНазначения, представляющий собой массив ссылок на выделенные в данный момент строки списка.

Проанализируем алгоритм обработки этих данных. Нам нужно открыть Модуль управляемой формы нашей внешней обработки и написать код в обработчике события ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, передала ли БСП контекст вызова
    Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
        
        // Если в списке выделен хотя бы один документ
        Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
            
            // Берем первый выделенный документ в качестве эталона для автозаполнения
            ДокументСсылка = Параметры.ОбъектыНазначения[0];
            
            // Читаем реквизиты документа оптимальным способом через общий модуль БСП
            СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументСсылка, "Организация, Подразделение");
            
            // Заполняем реквизиты формы нашей внешней обработки
            Объект.Организация = СтруктураРеквизитов.Организация;
            Объект.Подразделение = СтруктураРеквизитов.Подразделение;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Альтернативный вариант: получение активных отборов формы списка. Если пользователь ничего не выделил в списке, но в самом динамическом списке установлен отбор по Организации, мы можем вытащить эти настройки. Для этого нам потребуется обратиться к компоновщику настроек динамического списка формы-владельца. Этот метод более сложный, но крайне эффективный при работе с большими объемами данных:


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

Шаг 3. Программное обновление списка документов после завершения работы

Допустим, наша внешняя обработка успешно выполнила свою задачу: сгенерировала новые документы РазовоеНачисление или удалила неактуальные. Как сделать так, чтобы пользователь мгновенно увидел изменения в открытой форме списка, не прибегая к ручному нажатию кнопки «Обновить»?

Для решения этой задачи в платформе «1С:Предприятие 8» предусмотрен специализированный глобальный метод ОповеститьОбИзменении(). Когда мы вызываем этот метод на клиенте и передаем в него тип измененных данных, платформа автоматически рассылает сигнал всем открытым динамическим спискам данного типа. Списки понимают, что данные в базе обновились, и инициируют свое неявное перечитывание.

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


&НаКлиенте
Процедура ВыполнитьОбработкуДанных(Команда)
    
    // Вызываем серверный метод, выполняющий транзакции создания/удаления документов
    ВыполнитьГенерациюДокументовНаСервере();
    
    // Оповещаем платформу об изменении типа данных "ДокументСсылка.РазовоеНачисление"
    ОповеститьОбИзменении(Тип("ДокументСсылка.РазовоеНачисление"));
    
    // Выводим красивое всплывающее оповещение БСП
    ПоказатьОповещениеПользователя(
        "Успешно",
        ,
        "Документы успешно обработаны, список обновлен!",
        БиблиотекаКартинок.Информация
    );
    
    // При необходимости закрываем форму нашей обработки
    Закрыть();
    
КонецПроцедуры

Подведем итоги

Мы спроектировали и реализовали современное решение в парадигме БСП без изменения кода конфигурации. Наша внешняя обработка теперь:

  1. Красиво интегрируется в интерфейс списка документов РазовоеНачисление через механизм дополнительных обработок.
  2. Интеллектуально считывает контекст (выделенные строки или отборы формы списка), избавляя пользователя от двойного ввода информации.
  3. Корректно сообщает платформе о необходимости обновления динамического списка документов сразу после завершения своей транзакции.

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

← На главную