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