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