Как создать ввод на основании с использованием параметризованной команды в 1С?

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

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

Что такое параметризованная команда и зачем она нужна?

Давайте проанализируем само понятие. Параметризованная команда — это объект метаданных типа Команда, у которой заполнено свойство Тип параметра команды. В отличие от обычной команды, которая просто выполняет алгоритм, параметризованная команда жестко привязана к контексту конкретного объекта (ссылки). Когда мы указываем тип параметра, например, ДокументСсылка.ЗаказПокупателя, система автоматически понимает, что кнопка этой команды должна отображаться там, где есть этот контекст: в формах списка, формах выбора и формах самого документа.

Рассмотрим основные причины, почему стоит выбрать именно этот путь:

  1. Динамический выбор объекта: В коде команды мы можем решить, какой именно документ создавать, в зависимости от условий (например, от статуса или суммы исходного документа).
  2. Предварительная проверка: Можно запретить создание нового объекта еще на этапе нажатия кнопки, выдав пользователю предупреждение (например, если текущий документ не проведен).
  3. Интерактивность: Перед созданием можно открыть диалоговое окно для ввода дополнительных данных, которые не хранятся в источнике.

Шаг 1. Настройка команды в дереве метаданных

Разберем процесс создания по шагам. Допустим, нам нужно создать документ РеализацияТоваровУслуг на основании документа ЗаказПокупателя.

Сначала нам необходимо создать саму команду. Это можно сделать либо в ветке «Команды» конкретного документа-источника, либо создать «Общую команду» в ветке «Общие».

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

Шаг 2. Реализация логики в модуле команды

Теперь перейдем к самому ответственному моменту — написанию кода. Щелкнем правой кнопкой мыши по команде и выберем «Модуль команды». Здесь автоматически создается обработчик ОбработкаКоманды, который выполняется на стороне клиента.

Рассмотрим пример кода, который подготавливает параметры и открывает форму нового документа:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    // ПараметрКоманды — это ссылка на наш документ-основание
    // Сначала проверим, не пустая ли ссылка
    Если ПараметрКоманды.Пустая() Тогда
        Возврат;
    КонецЕсли;

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

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

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

В данном коде ПараметрыВыполненияКоманды.Источник передает контекст формы, из которой была вызвана команда. Это важно для корректной работы системы окон и оповещений.

Шаг 3. Обработка данных в создаваемом объекте

Вызов ОткрытьФорму с параметром Основание (или любым другим) инициирует стандартный механизм заполнения в 1С. Выясним, что происходит на стороне создаваемого документа РеализацияТоваровУслуг.

Нам необходимо зайти в Модуль объекта создаваемого документа и найти (или создать) процедуру ОбработкаЗаполнения. Важно помнить, что эта процедура всегда выполняется на сервере.


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

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

Сравнение с обычными кнопками на форме

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

Расширенные возможности: Множественный выбор

Если мы установим Режим использования параметра в значение Множественный, то при выделении нескольких строк в списке и нажатии на нашу кнопку, в ОбработкаКоманды прилетит не одна ссылка, а Массив ссылок. Это позволяет реализовать, например, пакетное создание документов на основании списка выбранных объектов, что значительно ускоряет работу пользователя.

Посмотрим, как изменится код модуля команды в этом случае:


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

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

← На главную