При разработке под типовые конфигурации «1С:Предприятие 8», использующие Библиотеку Стандартных Подсистем (БСП), программисты регулярно сталкиваются с необходимостью внедрения нового функционала без изменения самой конфигурации. Одним из самых гибких механизмов для этого является подсистема «Дополнительные отчеты и обработки».
В этой статье мы подробно разберем, как создать внешнюю обработку, которая будет гармонично встроена в интерфейс конкретного документа (например, РазовоеНачисление в программе «1С:ЗУП»), научим ее автоматически считывать контекст открытия (выбранную организацию и подразделение) и обновлять родительский список документов после завершения работы.
Давайте пошагово решим все три задачи, поставленные автором темы.
Для того чтобы система БСП распознала нашу внешнюю обработку и привязала ее к конкретному списку документов, мы должны использовать механизм регистрации. Вся магия происходит в Модуле объекта нашей внешней обработки через экспортную функцию СведенияОВнешнейОбработке().
Выясним ключевые параметры регистрации, которые нам понадобятся:
"ЗаполнениеОбъекта" (или использовать программный метод БСП ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()). Это заставит систему вывести команду в меню «Еще» -> «Изменить / Заполнить»."Документ.РазовоеНачисление"."ОткрытиеФормы" (или ТипКомандыОткрытиеФормы()).Рассмотрим пример кода, который необходимо разместить в Модуле объекта внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Наименование = "Групповое создание и удаление Разовых начислений";
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Ложь, так как нам может потребоваться запись/удаление объектов базы данных
// Привязываем обработку к документу "Разовое начисление"
ПараметрыРегистрации.Назначение.Добавить("Документ.РазовоеНачисление");
// Создаем команду для вызова формы
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Обработка разовых начислений...";
НоваяКоманда.Идентификатор = "ОткрытьОбработкуНачислений";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
После загрузки этого файла в справочник «Дополнительные отчеты и обработки» в режиме «1С:Предприятие», система автоматически добавит команду в меню списка документов.
Теперь разберем ситуацию, когда пользователь выделил строки в списке или мы хотим получить параметры отбора, чтобы автоматически заполнить реквизиты Организация и Подразделение на форме нашей обработки.
При запуске команды с типом "ОткрытиеФормы", БСП автоматически передает в параметры открываемой формы специальную структуру. В ней содержится параметр ОбъектыНазначения, представляющий собой массив ссылок на выделенные в данный момент строки списка.
Проанализируем алгоритм обработки этих данных. Нам нужно открыть Модуль управляемой формы нашей внешней обработки и написать код в обработчике события ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передала ли БСП контекст вызова
Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
// Если в списке выделен хотя бы один документ
Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
// Берем первый выделенный документ в качестве эталона для автозаполнения
ДокументСсылка = Параметры.ОбъектыНазначения[0];
// Читаем реквизиты документа оптимальным способом через общий модуль БСП
СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументСсылка, "Организация, Подразделение");
// Заполняем реквизиты формы нашей внешней обработки
Объект.Организация = СтруктураРеквизитов.Организация;
Объект.Подразделение = СтруктураРеквизитов.Подразделение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Альтернативный вариант: получение активных отборов формы списка. Если пользователь ничего не выделил в списке, но в самом динамическом списке установлен отбор по Организации, мы можем вытащить эти настройки. Для этого нам потребуется обратиться к компоновщику настроек динамического списка формы-владельца. Этот метод более сложный, но крайне эффективный при работе с большими объемами данных:
&НаСервере
Процедура ЗаполнитьИзОтборовФормыСписка()
// Владельцем формы в данном контексте будет выступать форма списка документов
Если ФормаВладелец <> Неопределено Тогда
Попытка
// Пробуем получить настройки компоновки динамического списка "Список"
НастройкиКомпоновки = ФормаВладелец.Список.КомпоновщикНастроек.ПолучитьПользовательскиеНастройки();
Для Каждого ЭлементОтбора Из НастройкиКомпоновки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
// Ищем отбор по Организации
Если Строка(ЭлементОтбора.ЛевоеЗначение) = "Организация" И ЭлементОтбора.Использование Тогда
Объект.Организация = ЭлементОтбора.ПравоеЗначение;
КонецЕсли;
// Ищем отбор по Подразделению
Если Строка(ЭлементОтбора.ЛевоеЗначение) = "Подразделение" И ЭлементОтбора.Использование Тогда
Объект.Подразделение = ЭлементОтбора.ПравоеЗначение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Исключение
// Если структура списка отличается, просто игнорируем ошибку
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Допустим, наша внешняя обработка успешно выполнила свою задачу: сгенерировала новые документы РазовоеНачисление или удалила неактуальные. Как сделать так, чтобы пользователь мгновенно увидел изменения в открытой форме списка, не прибегая к ручному нажатию кнопки «Обновить»?
Для решения этой задачи в платформе «1С:Предприятие 8» предусмотрен специализированный глобальный метод ОповеститьОбИзменении(). Когда мы вызываем этот метод на клиенте и передаем в него тип измененных данных, платформа автоматически рассылает сигнал всем открытым динамическим спискам данного типа. Списки понимают, что данные в базе обновились, и инициируют свое неявное перечитывание.
Рассмотрим, как правильно завершить работу алгоритма в модуле управляемой формы нашей обработки:
&НаКлиенте
Процедура ВыполнитьОбработкуДанных(Команда)
// Вызываем серверный метод, выполняющий транзакции создания/удаления документов
ВыполнитьГенерациюДокументовНаСервере();
// Оповещаем платформу об изменении типа данных "ДокументСсылка.РазовоеНачисление"
ОповеститьОбИзменении(Тип("ДокументСсылка.РазовоеНачисление"));
// Выводим красивое всплывающее оповещение БСП
ПоказатьОповещениеПользователя(
"Успешно",
,
"Документы успешно обработаны, список обновлен!",
БиблиотекаКартинок.Информация
);
// При необходимости закрываем форму нашей обработки
Закрыть();
КонецПроцедуры
Мы спроектировали и реализовали современное решение в парадигме БСП без изменения кода конфигурации. Наша внешняя обработка теперь:
РазовоеНачисление через механизм дополнительных обработок.Использование связки СведенияОВнешнейОбработке, параметра ОбъектыНазначения и метода ОповеститьОбИзменении — это золотой стандарт разработки расширений функционала в экосистеме БСП, гарантирующий стабильную работу при любых обновлениях конфигурации.