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