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

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

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

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

Способ 1: Программная передача параметров через структуру

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

Шаг 1. Формирование параметров на клиенте

Сначала нам нужно вызвать процедуру открытия формы. Важно передать в нее структуру с данными, которые мы хотим видеть в новой форме. Проанализируем код в модуле формы справочника:


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

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

    // Открываем форму записи регистра, передавая параметры
    ОткрытьФорму("РегистрСведений.ШтрихкодыНоменклатуры.ФормаЗаписи", ПараметрыФормы);

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

Шаг 2. Обработка параметров на сервере

Теперь перейдем к модулю формы записи регистра сведений. Многие начинающие разработчики пытаются получить параметры в процедуре ПриОткрытии на клиенте. Однако правильнее и надежнее делать это в процедуре ПриСозданииНаСервере. Рассмотрим почему:

  1. Параметры формы доступны на сервере сразу в момент инициализации.
  2. Вы работаете напрямую с данными (объектом Запись), что исключает лишние перерисовки интерфейса.
  3. В процедуре ПриСозданииНаСервере можно проверить, является ли запись новой, чтобы не перезаписывать данные в уже существующих записях.

Проанализируем пример реализации в модуле формы регистра:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

Способ 2: Использование стандартного параметра «ЗначениеЗаполнения»

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

Рассмотрим, как изменится код вызова в справочнике:


&НаКлиенте
Процедура СоздатьШтрихкод(Команда)

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

    ОткрытьФорму("РегистрСведений.ШтрихкодыНоменклатуры.ФормаЗаписи", ПараметрыФормы);

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

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

Способ 3: Платформенный метод «без кода»

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

Пошаговый алгоритм настройки:

  1. Убедитесь, что в динамическом списке на форме установлен отбор по текущей номенклатуре (обычно это делается через свойство Параметры или ФиксированныеНастройки списка).
  2. В метаданных регистра сведений для измерения Номенклатура установите свойство «Заполнять из данных заполнения» (галочка в конфигураторе).
  3. Используйте стандартную кнопку «Создать» командной панели динамического списка.

Как это работает: Платформа видит, что список открыт с фильтром по полю Номенклатура = Товар №1. При нажатии «Создать» система автоматически понимает контекст и передает значение фильтра в форму новой записи. Это максимально корректный путь с точки зрения стандартов разработки 1С.

Важные технические нюансы

Рассмотрим причины, по которым данные могут не заполняться или код может работать некорректно:

1. Объект не записан. Как мы уже упоминали, если вы пытаетесь создать запись в регистре для новой, еще не сохраненной номенклатуры, Объект.Ссылка будет пустой. Регистр сведений не может ссылаться на "пустоту". Всегда проверяйте Объект.Ссылка.Пустая() перед вызовом форм.

2. Измерения vs Ресурсы. Если в вашем регистре Номенклатура является ресурсом, а не измерением, стандартные механизмы заполнения могут работать иначе. Старайтесь проектировать регистры так, чтобы ключевые аналитики (то, по чему мы фильтруем) были именно измерениями.

3. Параметры формы и их жизненный цикл. Помните, что ЭтаФорма.Параметры — это структура, которая существует только в момент инициализации формы. Если вы планируете использовать эти данные позже, например, при нажатии каких-то кнопок уже внутри открытой формы записи, лучше сразу перенести их в реквизиты объекта (в поле Запись).

Итоги

Мы проанализировали три подхода к передаче данных. Для простых задач идеально подходит Способ 3 (настройка метаданных), так как он не требует поддержки кода. Если же логика открытия сложная (нужно передать дополнительные флаги, вычислить значения), используйте Способ 1 с обработкой в ПриСозданииНаСервере. Это обеспечит стабильную работу приложения и чистоту программного кода.

← На главную