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