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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Анализ стандартного механизма БСП

Подсистема «Дополнительные отчеты и обработки» в составе Библиотеки стандартных подсистем (БСП) берет на себя всю работу по выводу кнопок на формы. Когда мы регистрируем обработку с видом ЗаполнениеОбъекта, система ищет на форме документа предопределенные группы команд. Чаще всего это подменю ГруппаКомандЗаполнить.

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

Разбор функции регистрации обработки

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


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.ПланПродаж");
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Округлить цены в строках";
    НоваяКоманда.Идентификатор = "ОкруглитьЦены";
    // Используем открытие формы, если нужна настройка параметров перед заполнением
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    // Или вызов серверного метода, если заполнение происходит сразу
    // НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Даже если мы добавим в этот код различные параметры, БСП не поймет команду «размести меня над таблицей Товары», так как в структуре ПараметрыРегистрации просто не предусмотрено поле для указания имени конкретного элемента формы (таблицы).

Решение 1: Использование расширения конфигурации (рекомендуемый способ)

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

  1. Создадим расширение и добавим в него форму нужного документа (например, Документ.ПланПродаж.Форма.ФормаДокумента).
  2. В окне элементов формы расширения найдем командную панель целевой табличной части.
  3. Добавим в эту панель новую группу (вид — Группа кнопок или Подменю). Назовем её, например, ГруппаКомандЗаполнитьТаблицу.
  4. В модуле формы расширения нам нужно переопределить или дополнить процедуру ПриСозданииНаСервере.

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


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Подготавливаем параметры вывода команд
    ПараметрыВывода = Новый Структура;
    // Указываем группу, которую мы создали над табличной частью
    ПараметрыВывода.Вставить("ГруппаКомандЗаполнить", Элементы.ГруппаКомандЗаполнитьТаблицу);
    
    // Вызываем механизм БСП для инициализации команд в новой группе
    ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма, ПараметрыВывода);
    
КонецПроцедуры

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

Решение 2: Программное создание группы команд без изменения состава элементов

Если вы не хотите вручную добавлять группу в редакторе формы расширения, можно попробовать создать её программно в том же ПриСозданииНаСервере. Посмотрим на пример кода:


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПеред(Отказ, СтандартнаяОбработка)
    
    // Находим командную панель таблицы
    КоманднаяПанельТовары = Элементы.ТоварыКоманднаяПанель;
    
    // Создаем подменю программно
    НовоеПодменю = Элементы.Добавить("ПодменюЗаполнитьТаблицу", Тип("ГруппаФормы"), КоманднаяПанельТовары);
    НовоеПодменю.Вид = ВидГруппыФормы.Подменю;
    НовоеПодменю.Заголовок = "Заполнить таблицу";
    
    // Регистрируем эту группу для БСП
    ПараметрыВывода = ДополнительныеОтчетыИОбработки.ПараметрыВыводаКоманд();
    ПараметрыВывода.ГруппаКомандЗаполнить = НовоеПодменю;
    
    ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма, ПараметрыВывода);
    
КонецПроцедуры

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

Использование модификаторов команд

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

НоваяКоманда.Модификатор = "ЗаполнениеТабличнойЧасти";

Однако стоит учитывать, что сам по себе модификатор не создаст кнопку над таблицей. Он лишь передает дополнительный признак в форму. Чтобы это сработало, в коде формы (опять же, в ПриСозданииНаСервере) должна быть реализована логика, которая считывает этот модификатор и направляет команду в соответствующий элемент управления.

Особенности реализации в УТ 11 и свежих версиях БСП

В свежих версиях Управления торговлей 11 логика подключения команд сильно унифицирована. Если вы посмотрите код модуля формы документа (например, ПланПродаж), вы увидите вызов ПодключитьВыводимыеКоманды(). БСП автоматически собирает все доступные команды (печать, заполнение, создание на основании).

Чтобы разделить команды «Заполнить весь документ» и «Заполнить только строки», разработчики конфигурации должны явно предусмотреть две разные группы команд на форме. Если в типовой форме предусмотрена только одна общая группа, то без расширения или изменения конфигурации переместить кнопку внешней обработки в командную панель таблицы невозможно.

Выясним причину возможных ошибок

Если после проделанных действий кнопка не появилась, проверим следующие пункты:

  1. Кэширование: БСП кэширует сведения о внешних обработках. После изменения кода функции СведенияОВнешнейОбработке обязательно нужно перезагрузить файл обработки в справочнике «Дополнительные отчеты и обработки».
  2. Назначение: Проверьте, точно ли указан объект в ПараметрыРегистрации.Назначение. Если документ указан неверно, команда не появится ни в одной группе.
  3. Видимость групп: Если вы создали группу в расширении, убедитесь, что у неё установлена видимость и она не перекрывается другими элементами.

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

← На главную