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

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

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

Метод 1: Использование параметров формы и обработчика ПриСозданииНаСервере

Проанализируем самый гибкий способ, который позволяет передать любые произвольные данные в открываемую форму. Этот метод заключается в формировании структуры параметров и их последующей обработке в модуле формы приемника. Рассмотрим, как это выглядит в коде.

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


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

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


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

Важный нюанс: Обратите внимание, что мы проверяем свойство через Свойство(). Это защищает код от ошибок, если форма будет открыта обычным способом из списка, где данный параметр не передается.

Метод 2: Стандартный параметр ЗначенияЗаполнения (оптимальный путь)

Платформа 1С предоставляет встроенный механизм для автоматического заполнения реквизитов. Если мы назовем ключ в структуре параметров как ЗначенияЗаполнения, система сама попытается подставить значения в одноименные реквизиты объекта. Рассмотрим подробнее этот пример:


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

Преимущество этого метода в том, что нам не нужно писать код в процедуре ПриСозданииНаСервере нового документа. Платформа автоматически сопоставит ключ «Клиент» из структуры с реквизитом Клиент в новом документе. Это сокращает объем кода и уменьшает вероятность ошибок.

Метод 3: Архитектурно верный путь — Ввод на основании

Если создание скидочной карты на основе заказа — это штатный бизнес-процесс, правильнее всего будет настроить механизм «Ввод на основании». Это позволит создавать документы не только из форм, но и программно, используя метод Заполнить().

Разберем алгоритм настройки:

  1. В конфигураторе откройте документ СкидочнаяКарта.
  2. Перейдите на закладку Ввод на основании.
  3. В списке «Вводится на основании» отметьте РегистрацияЗаказа.
  4. Нажмите кнопку «Конструктор ввода на основании» и выберите реквизиты для сопоставления.

После этого в модуле объекта СкидочнаяКарта появится обработчик ОбработкаЗаполнения. Посмотрим на пример кода внутри этого обработчика:


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

Для вызова этого механизма из формы заказа используйте параметр Основание:


&НаКлиенте
Процедура СоздатьНаОсновании(Команда)
    ПараметрыФормы = Новый Структура("Основание", Объект.Ссылка);
    ОткрытьФорму("Документ.СкидочнаяКарта.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры

Сравнение методов и практические советы

Выясним, какой метод выбрать в зависимости от ситуации:

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

Подводя итог, можно сказать, что наиболее «чистым» решением является использование механизма ОбработкаЗаполнения, так как он отделяет бизнес-логику (заполнение данных) от интерфейсной логики (открытие формы), что соответствует лучшим практикам разработки на платформе 1С.

← На главную