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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

← На главную