Как программно добавить команду «Создать на основании» на форму списка документа в 1С?

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

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

Анализ проблемы: почему кнопка не появляется?

Рассмотрим стандартную ситуацию. Программист добавляет код в процедуру ПриСозданииНаСервере в расширении формы списка. Код выглядит следующим образом:


КомандаСоздатьЗаказ = ЭтаФорма.Команды.Добавить("СоздатьЗаказПокупателя");
КомандаСоздатьЗаказ.Действие = "СоздатьЗаказПокупателя";
КомандаСоздатьЗаказ.Заголовок = "Заказ покупателя";

КнопкаСоздатьЗаказ = ЭтаФорма.Элементы.Добавить("СоздатьЗаказПокупателя", Тип("КнопкаФормы"), ЭтаФорма.Элементы.ФормаСоздатьНаОсновании);
КнопкаСоздатьЗаказ.ИмяКоманды = "СоздатьЗаказПокупателя";
КнопкаСоздатьЗаказ.Вид = ВидКнопкиФормы.ОбычнаяКнопка;

Несмотря на то что точка останова подтверждает выполнение кода, кнопка в интерфейсе не появляется. Проанализируем основные причины такого поведения:

  1. Свойство «Источник команд»: Если у группы (например, ФормаСоздатьНаОсновании) установлено свойство Источник команд, платформа автоматически управляет составом этой группы на основе метаданных. Любые программно добавленные элементы могут игнорироваться или удаляться при отрисовке формы.
  2. Влияние БСП (Библиотеки стандартных подсистем): В современных типовых конфигурациях (УНФ, ERP, КА) меню кнопок управляется подсистемой Подключаемые команды. Процедуры БСП могут перезаполнять командную панель после вашего кода, затирая изменения (разобраться в механизмах поможет справочник по методам БСП).
  3. Контекст данных: Форма списка работает с типом ДинамическийСписок, в то время как форма документа — с ДокументОбъект. Механизмы создания на основании требуют четкой привязки к ссылке текущей строки, также может потребоваться настройка видимости объектов пользователями в списке (удобно через инструмент настройки интерфейса и управления событиями форм).

Способ 1: Использование механизмов БСП (Рекомендуемый)

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

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


&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура ИмяРасширения_ПриОпределенииКомандПодключенныхКОбъекту(Настройки, Команды) Экспорт
    
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Вид = ВидПодключаемойКоманды.СоздатьНаОсновании;
    НоваяКоманда.Менеджер = "Документ.ЗаказПокупателя";
    НоваяКоманда.Представление = НСтр("ru = 'Заказ покупателя'");
    НоваяКоманда.Порядок = 10;
    
КонецПроцедуры

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

Способ 2: Работа с метаданными

Самый простой и надежный способ — настроить связи объектов в дереве метаданных расширения. Рассмотрим этот алгоритм по шагам:

  1. Добавьте в расширение оба документа (основание и создаваемый).
  2. В свойствах создаваемого документа (например, ЗаказПокупателя) перейдите на вкладку Вводится на основании.
  3. В списке документов-оснований отметьте ваш исходный документ (например, ПриходнаяНакладная).
  4. Платформа автоматически сформирует команду и добавит ее в стандартные группы Создать на основании во всех формах.

Способ 3: Обход ограничений отрисовки (Хак с обработчиком ожидания)

Если вам критично добавить кнопку именно программно через Элементы.Добавить(), и вы обнаружили, что стандартные механизмы 1С затирают вашу кнопку при открытии, можно воспользоваться «хитростью» с клиентом. Разберем ситуацию: программное добавление в ПриСозданииНаСервере отрабатывает, но группа Источник команд обновляется позже.

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

Важные замечания по видимости элементов

Иногда кнопка фактически добавлена, но скрыта настройками пользователя. Проанализируем шаги для проверки:

Резюме: Для типовых конфигураций всегда отдавайте предпочтение Способу 1 (БСП) или Способу 2 (Метаданные). Программное создание элементов управления через ЭтаФорма.Элементы.Добавить оправдано только в полностью самописных конфигурациях, где отсутствуют автоматизированные подсистемы управления интерфейсом.

← На главную