Как добавить свою команду в кнопку "Создать на основании" в 1С?

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

Часто возникает задача расширить стандартный функционал 1С, не изменяя основную конфигурацию. Одна из таких задач — добавить в типовой документ новую, специализированную команду в меню "Создать на основании". Например, рядом со стандартным пунктом "Задание" добавить "Задание на покупку", реализовать обратную реализацию (приобретение на основании реализации) или автоматизировать ввод счета на оплату клиенту в обход стандартных помощников — есть no-code решение для настройки создания объектов на основании. Попытка найти эту кнопку в редакторе формы не дает результата, так как меню формируется программно.

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

Принцип работы механизма "Создать на основании" в БСП

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

Эта процедура называется ДобавитьКомандыСозданияНаОсновании. Она принимает на вход два основных параметра:

Наша задача — "подключиться" к выполнению этой процедуры и добавить в коллекцию КомандыСозданияНаОсновании свою собственную команду. Для этого идеально подходит механизм расширений — для ускорения работы есть инструментарий автоматизации ввода документов и заполнения реквизитов.

Пошаговая инструкция по добавлению команды через расширение

Разберем весь процесс по шагам. Предположим, мы хотим из документа "Заказ клиента" (схожим образом реализуется и создание доверенности на основании заказа клиента) создавать документ "Задача" по специальному шаблону "Задание на покупку".

  1. Создание расширения и заимствование объекта

    В режиме конфигуратора создайте новое расширение. Назовем его, например, Расш1_ДоработкаСозданияНаОсновании. Далее необходимо добавить в это расширение объект, в который мы вносим изменения. В нашем случае это документ-основание — Документ.ЗаказКлиента. Найдите его в дереве конфигурации, кликните правой кнопкой мыши и выберите "Добавить в расширение".

  2. Расширение модуля менеджера документа

    Теперь, когда документ заимствован, нам нужно получить доступ к его модулю менеджера. В дереве объектов нашего расширения найдите Документ.ЗаказКлиента, раскройте его и создайте расширение модуля менеджера. Для этого кликните правой кнопкой мыши на документе в расширении и выберите "Создать модуль менеджера".

    В открывшемся модуле мы создадим свою процедуру, которая будет выполняться после основной типовой процедуры. Это позволяет безопасно расширить логику типовых процедур с помощью аннотаций, так как такой способ не затирает стандартную логику, а лишь дополняет её. Для этого используется аннотация &После("ИмяПроцедуры").

  3. Программное добавление новой команды

    В модуль менеджера документа ЗаказКлиента в расширении добавим следующий код. Он создаст новый элемент в коллекции команд и определит его свойства.

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

    Важно: всегда используйте префикс вашего расширения (здесь Расш1_) для имен процедур и идентификаторов, чтобы избежать конфликтов с другими расширениями или будущими обновлениями типовой конфигурации.

  4. Создание клиентского обработчика команды

    Как мы указали в свойстве Команда.Обработчик, нам нужна клиентская процедура, которая выполнится при выборе нашего пункта меню. Для этого в расширении создадим новый общий модуль. Назовем его Расш1_ОбщиеКомандыКлиент и обязательно установим для него флаги "Клиент (управляемое приложение)" и "Вызов сервера".

    В этот модуль поместим процедуру-обработчик, где будет реализована передача параметров между формами в управляемом приложении при открытии нового объекта:

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

    Мы почти у цели. Команда создана, обработчик написан, форма нового документа открывается. Остался последний шаг — научить форму документа "Задача" понимать наш специальный параметр и заполняться по шаблону. Для этой задачи есть обработка автоматизации логики заполнения и контроля реквизитов.

    Для этого в нашем расширении заимствуем Документ.Задача и расширим его форму документа (ФормаДокумента). В модуле этой формы нам нужно расширить серверную процедуру ПриСозданииНаСервере.

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

Итог

Проанализируем проделанную работу. Мы, не меняя ни одной строки кода в основной конфигурации, добились нужного результата. Наш новый пункт "Задание на покупку" появился в меню "Создать на основании" документа "Заказ клиента". При его выборе открывается стандартный документ "Задача", но уже предварительно заполненный по нашей логике. Этот подход является не только правильным с точки зрения архитектуры 1С, но и гарантирует, что наши доработки не будут утеряны при очередном обновлении типовой конфигурации.

← На главную