Как добавить свою команду в стандартную группу Создать на основании

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

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

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

Способ 1. Использование программного интерфейса БСП (Модуль менеджера)

В современных конфигурациях (таких как УТ 11, ERP 2, КА 2 или БП 3.0) состав кнопок в подменю «Создать на основании» формируется динамически. Это происходит при помощи механизмов БСП. Если мы хотим добавить свою команду программно, нам необходимо обратиться к модулю менеджера объекта-источника (того документа, из которого мы создаем новый объект).

Разберем по шагам, как это реализовать:

  1. Откроем модуль менеджера документа-источника.
  2. Найдем или создадим экспортную процедуру ПриОпределенииКомандПодключенныхКОбъекту. Именно здесь описываются все дополнительные кнопки, которые должны появиться в интерфейсе.
  3. Добавим описание нашей новой команды в коллекцию команд.

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


Процедура ПриОпределенииКомандПодключенныхКОбъекту(Настройки) Экспорт

    // Создаем структуру новой команды
    НоваяКоманда = Настройки.Команды.Добавить();
    
    // Указываем заголовок кнопки, который увидит пользователь
    НоваяКоманда.Представление = НСтр("ru = 'Заказ покупателя (спец. форма)'");
    
    // Задаем уникальный идентификатор команды
    НоваяКоманда.Идентификатор = "СоздатьЗаказНаОснованииСпецФорма";
    
    // КРИТИЧЕСКИ ВАЖНО: Указываем группу. 
    // Для подменю "Создать на основании" используется предопределенное имя.
    НоваяКоманда.Группа = "ГруппаКомандСоздатьНаОсновании";
    
    // Указываем, что команда должна выполнять действие (вызов клиентского кода)
    НоваяКоманда.ТипКоманды = "Действие";
    
    // Указываем обработчик, который будет вызван на клиенте
    НоваяКоманда.Обработчик = "ЭтотОбъект.КомандаСоздатьНаОснованииСпецФорма";

КонецПроцедуры

Проанализируем ситуацию: если мы укажем ТипКоманды = "ЗаполнениеФормы", система попытается выполнить стандартное заполнение. Но поскольку наша цель — открыть конкретную форму, мы используем ТипКоманды = "Действие". В этом случае в модуле формы или в общем модуле (в зависимости от настроек БСП) нам потребуется описать клиентскую процедуру открытия формы:


&НаКлиенте
Процедура КомандаСоздатьНаОснованииСпецФорма(ПараметрыКоманды, ПараметрыВыполнения) Экспорт

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

КонецПроцедуры

Способ 2. Создание команды как объекта метаданных

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

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

  1. В дереве конфигурации найдем документ, который должен создаваться (в нашем примере это «Заказ покупателя»).
  2. Развернем ветку документа и перейдем в раздел Команды. Нажмем кнопку «Добавить».
  3. В свойствах новой команды настроим следующие параметры:
    • Группа: выберем из списка Стандартные команды.Создать на основании.
    • Тип параметра команды: выберем документ-основание (тот документ, в форме которого должна появиться кнопка).
    • Режим использования параметра: Одиночный (если создаем из одного документа).
  4. В модуле команды (который откроется при нажатии на лупу в поле «Действие») пропишем алгоритм открытия нужной формы.

Посмотрим на пример кода в модуле команды:


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

Важный момент: если после создания команды она не появилась в форме, проверим свойство самой формы источника. Перейдем на вкладку «Команды», далее «Глобальные команды». Убедимся, что галочка напротив нашей команды установлена. Также стоит проверить права доступа (роли) — у пользователя должно быть право на просмотр этой команды.

Способ 3. Переопределение формы через ОбработкаПолученияФормы

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

Выясним причину, по которой это удобно: нам не нужно создавать новые кнопки, если мы хотим просто изменить поведение стандартной кнопки «Заказ покупателя» в зависимости от контекста.

В модуле менеджера целевого документа (который создается) пропишем:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) Экспорт

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

КонецПроцедуры

Этот метод позволяет сохранить интерфейс чистым, не плодя множество однотипных кнопок в меню, а управляя логикой «под капотом» платформы.

Использование расширений для типовых конфигураций

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

Например, для реализации первого способа через расширение, нам нужно:

  1. Добавить документ-источник в расширение.
  2. Создать в расширении модуль менеджера для этого документа.
  3. Использовать аннотацию &После для процедуры ПриОпределенииКомандПодключенныхКОбъекту.

Рассмотрим, как будет выглядеть код в расширении:


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

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

← На главную