Как добавить внешнюю обработку в командную панель табличной части документа?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При разработке внешних обработок заполнения для конфигураций на базе БСП (например, Бухгалтерия предприятия 3.0 или ERP) программисты часто сталкиваются с тем, что кнопка обработки автоматически появляется в подменю «Заполнить» в шапке документа. Однако для удобства пользователя иногда требуется разместить команду непосредственно в командной панели конкретной табличной части (ТЧ). Проанализируем, почему стандартный механизм этого не позволяет и как решить задачу с помощью расширения.

Почему стандартный механизм БСП ограничивает расположение кнопок

Рассмотрим принцип работы механизма «Дополнительные отчеты и обработки». Когда мы регистрируем обработку, система обращается к функции СведенияОВнешнейОбработке. В этой функции мы указываем тип команды, например, ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеОбъекта().

Проанализируем ситуацию: БСП программно ищет на форме документа предопределенные группы, такие как ПодменюЗаполнить или ГруппаВажныеКоманды, и добавляет туда кнопки. По умолчанию разработчики 1С не предусмотрели возможность в коде самой обработки указать конкретный элемент формы (командную панель таблицы) в качестве родителя для кнопки. Это сделано для соблюдения единообразия интерфейса «Такси», где все команды заполнения объекта должны быть сгруппированы в одном месте.

Решение проблемы через создание расширения

Если бизнес-задача требует наличия кнопки именно внутри табличной части, нам придется отойти от полностью автоматической регистрации и задействовать расширение конфигурации. Разберем этот процесс по шагам.

Шаг 1. Подготовка внешней обработки

Ваша обработка должна быть зарегистрирована в справочнике ДополнительныеОтчетыИОбработки. Убедитесь, что в функции СведенияОВнешнейОбработке правильно указаны параметры команды. Нам потребуется Идентификатор команды, который мы будем вызывать программно.

Шаг 2. Создание команды в расширении

Создадим расширение и добавим в него форму нужного документа. Выполним следующие действия:

  1. Перейдем в дерево элементов формы и найдем нужную табличную часть (например, Товары).
  2. В командной панели этой ТЧ добавим новую Команду формы. Назовем ее, например, удЗаполнитьИзВнешнейОбработки.
  3. Вытащим эту команду кнопкой в визуальную область командной панели ТЧ.

Шаг 3. Программный вызов обработки

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


&НаКлиенте
Процедура удЗаполнитьИзВнешнейОбработки(Команда)
    
    // 1. Находим ссылку на внешнюю обработку по наименованию или идентификатору
    СсылкаНаОбработку = ПолучитьСсылкуНаВнешнююОбработку("МояОбработкаЗаполненияТЧ");
    
    Если СсылкаНаОбработку.Пустая() Тогда
        Возврат;
    КонецЕсли;

    // 2. Формируем параметры для вызова БСП
    ПараметрыКоманды = Новый Структура;
    ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка", СсылкаНаОбработку);
    ПараметрыКоманды.Вставить("ИдентификаторКоманды", "ОсновнаяКоманда"); // Идентификатор из СведенияОВнешнейОбработке
    ПараметрыКоманды.Вставить("ОбъектыНазначения", Новый Массив);
    ПараметрыКоманды.ОбъектыНазначения.Добавить(Объект.Ссылка);
    
    // 3. Вызываем стандартный метод БСП для выполнения
    ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВнешнейОбработки(ПараметрыКоманды, ЭтаФорма);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаВнешнююОбработку(Имя)
    Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(Имя);
КонецФункции

Передача контекста и работа с выделенными строками

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

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

Альтернативный метод: Перемещение группы «ПодменюЗаполнить»

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

Посмотрим на последовательность действий:

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

Важно: Этот метод может нарушить визуальную логику, если к документу подключено много разных обработок, часть из которых должна заполнять шапку, а часть — таблицу. Поэтому программный вызов через отдельную кнопку в расширении (способ №2) считается более надежным и гибким.

Рекомендации по реализации

Подведем итог. Для качественной реализации задачи придерживайтесь следующих правил:

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

← На главную