В практике разработки на платформе «1С:Предприятие 8.3» стандартный механизм ввода на основании, настраиваемый через конструктор на закладке «Ввод на основании», является базовым и наиболее часто используемым. Однако существуют задачи, когда требуется более гибкое управление процессом создания новых объектов. Одним из таких способов является использование параметризованных команд. В этой статье мы подробно разберем, что это такое, как это настроить и в каких ситуациях этот метод превосходит стандартный.
Давайте проанализируем само понятие. Параметризованная команда — это объект метаданных типа Команда, у которой заполнено свойство Тип параметра команды. В отличие от обычной команды, которая просто выполняет алгоритм, параметризованная команда жестко привязана к контексту конкретного объекта (ссылки). Когда мы указываем тип параметра, например, ДокументСсылка.ЗаказПокупателя, система автоматически понимает, что кнопка этой команды должна отображаться там, где есть этот контекст: в формах списка, формах выбора и формах самого документа.
Рассмотрим основные причины, почему стоит выбрать именно этот путь:
Разберем процесс создания по шагам. Допустим, нам нужно создать документ РеализацияТоваровУслуг на основании документа ЗаказПокупателя.
Сначала нам необходимо создать саму команду. Это можно сделать либо в ветке «Команды» конкретного документа-источника, либо создать «Общую команду» в ветке «Общие».
СоздатьРеализациюНаОсновании).ДокументСсылка.ЗаказПокупателя. Теперь наша команда стала параметризованной.Панель действий.Создать на основании. Если мы хотим, чтобы кнопка была более заметной, можно выбрать Командная панель формы.Важное.Одиночный, если предполагается ввод на основании только одного выбранного документа.Теперь перейдем к самому ответственному моменту — написанию кода. Щелкнем правой кнопкой мыши по команде и выберем «Модуль команды». Здесь автоматически создается обработчик ОбработкаКоманды, который выполняется на стороне клиента.
Рассмотрим пример кода, который подготавливает параметры и открывает форму нового документа:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// ПараметрКоманды — это ссылка на наш документ-основание
// Сначала проверим, не пустая ли ссылка
Если ПараметрКоманды.Пустая() Тогда
Возврат;
КонецЕсли;
// Формируем структуру параметров для открытия формы нового документа.
// Ключ "Основание" будет передан в обработку заполнения нового объекта.
ПараметрыФормы = Новый Структура("Основание", ПараметрКоманды);
// Если нам нужно передать дополнительные данные, которые не вычисляются из основания
// напрямую, мы можем добавить их в эту же структуру.
ПараметрыФормы.Вставить("ДополнительныйФлаг", Истина);
// Открываем форму создания нового документа
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
В данном коде ПараметрыВыполненияКоманды.Источник передает контекст формы, из которой была вызвана команда. Это важно для корректной работы системы окон и оповещений.
Вызов ОткрытьФорму с параметром Основание (или любым другим) инициирует стандартный механизм заполнения в 1С. Выясним, что происходит на стороне создаваемого документа РеализацияТоваровУслуг.
Нам необходимо зайти в Модуль объекта создаваемого документа и найти (или создать) процедуру ОбработкаЗаполнения. Важно помнить, что эта процедура всегда выполняется на сервере.
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Если данные переданы через нашу параметризованную команду,
// они будут находиться в переменной ДанныеЗаполнения.
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Заполняем реквизиты из документа-основания
ЭтотОбъект.Контрагент = ДанныеЗаполнения.Контрагент;
ЭтотОбъект.Договор = ДанныеЗаполнения.Договор;
ЭтотОбъект.Склад = ДанныеЗаполнения.Склад;
// Заполнение табличной части
Для Каждого СтрокаТЧ Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = ЭтотОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Основание") Тогда
// Если мы передали структуру из модуля команды
Основание = ДанныеЗаполнения.Основание;
ЭтотОбъект.Контрагент = Основание.Контрагент;
// Проверяем наличие дополнительных флагов из нашей структуры
Если ДанныеЗаполнения.Свойство("ДополнительныйФлаг") Тогда
// Какая-то специфическая логика
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Рассмотрим ситуацию: вы могли бы просто создать кнопку на форме ЗаказПокупателя и прописать в ней аналогичный код. Почему параметризованная команда лучше? Проанализируем:
Если мы установим Режим использования параметра в значение Множественный, то при выделении нескольких строк в списке и нажатии на нашу кнопку, в ОбработкаКоманды прилетит не одна ссылка, а Массив ссылок. Это позволяет реализовать, например, пакетное создание документов на основании списка выбранных объектов, что значительно ускоряет работу пользователя.
Посмотрим, как изменится код модуля команды в этом случае:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// ПараметрКоманды теперь Массив
Для Каждого ТекущееОснование Из ПараметрКоманды Цикл
ПараметрыФормы = Новый Структура("Основание", ТекущееОснование);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
КонецЦикла;
КонецПроцедуры
Таким образом, использование параметризованных команд является современным и рекомендуемым способом реализации ввода на основании в управляемом приложении 1С. Оно обеспечивает отделение логики интерфейса от логики заполнения данных и предоставляет пользователю удобный доступ к функциям системы из любой точки интерфейса, где доступен контекст объекта-основания.