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

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

При разработке внешних обработок с видом «Заполнение объекта» на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются со стандартным поведением системы: кнопки команд автоматически помещаются в общее подменю «Заполнить», расположенное в шапке документа. Однако с точки зрения юзабилити гораздо удобнее, когда команда, предназначенная для работы с конкретными строками, находится непосредственно над соответствующей табличной частью.

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

Почему БСП размещает команды в шапке?

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

Способ 1. Программный перенос кнопки через расширение

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

Рассмотрим по шагам, как это реализовать в модуле формы документа через расширение:

  1. Создадим процедуру-перехватчик для события ПриСозданииНаСервере.
  2. Вызовем основной код БСП, чтобы кнопки были созданы.
  3. Найдем нужную кнопку по имени и изменим её свойство Родитель.

Посмотрим на пример кода:


&НаСервере
Процедура Изм_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // 1. Находим командную панель нужной табличной части
    ПанельТаблицы = Элементы.ТоварыКоманднаяПанель;
    
    // 2. Имена кнопок БСП формирует по шаблону: 
    // "ДополнительныеОтчетыИОбработкиЗаполнитьОбъект" + <ИмяКомандыБезПробелов>
    // Нам нужно перебрать элементы формы и найти те, что относятся к нашей обработке
    
    Префикс = "ДополнительныеОтчетыИОбработкиЗаполнитьОбъект";
    Для Каждого ЭлементФормы Из Элементы Цикл
        Если Лев(ЭлементФормы.Имя, СтрДлина(Префикс)) = Префикс Тогда
            // Проверяем, что это именно наша команда (можно проверить по заголовку или части имени)
            Если Найти(ЭлементФормы.Имя, "МояСпециальнаяОбработка") > 0 Тогда
                // 3. Переносим кнопку в панель таблицы
                Элементы.Переместить(ЭлементФормы, ПанельТаблицы);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

Способ 2. Использование переопределяемого модуля БСП

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

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

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

Способ 3. Регистрация как «Дополнительная обработка»

Иногда проще отказаться от автоматического механизма «Заполнение объекта» в пользу полного контроля. Мы можем зарегистрировать обработку с видом «ДополнительнаяОбработка». В этом случае БСП не будет пытаться сама добавить кнопку в меню «Заполнить».

Разберем алгоритм действий при таком подходе:

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

Пример программного вызова из клиента:


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

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

Способ 4. Ручная настройка через «Изменить форму»

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

Важные нюансы этого метода:

Таким образом, данный метод подходит только для разовых «быстрых» правок в информационной базе без возможности доработки кода.

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

Проанализировав ситуацию, можно сделать следующие выводы:

Если вам требуется быстро перенести кнопку типовой внешней обработки, используйте Способ 1 с расширением и методом Переместить(). Это требует минимум кода и не нарушает логику регистрации БСП.

Если вы проектируете сложную систему заполнения, лучше использовать Способ 3. Это даст вам полный контроль над визуализацией: вы сможете разместить кнопку не только в командной панели, но и, например, в контекстном меню строки таблицы, что значительно повысит удобство работы для конечного пользователя.

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

← На главную