Как передать значение реквизита из формы документа в форму обработки в обычном приложении 1С?

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

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

Различие подходов: почему Параметры не работают?

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

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

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

Предположим, у нас есть документ «Материалы» с реквизитом Склад. Нам нужно передать этот склад в обработку «ПараметрыМатериалов».

  1. В модуле формы документа, в процедуре нажатия кнопки, получаем форму обработки.
  2. Напрямую обращаемся к реквизиту полученной формы.
  3. Открываем форму.

Пример кода будет выглядеть следующим образом:


Процедура ДействиеКнопкиНастройки(Кнопка)
    // 1. Получаем форму обработки по её имени
    // ЭтаФорма указывается в качестве владельца
    ФормаНастройки = Обработки.ПараметрыМатериалов.ПолучитьФорму("Форма", ЭтаФорма);
    
    // 2. Устанавливаем значение реквизита формы
    // Важно: реквизит "Склад" должен быть создан в закладке "Реквизиты" формы обработки
    ФормаНастройки.Склад = Склад; 
    
    // 3. Открываем форму для пользователя
    ФормаНастройки.Открыть();
КонецПроцедуры

Важный нюанс: Чтобы этот код работал, в форме обработки на закладке «Реквизиты» должен существовать реквизит с именем Склад, имеющий соответствующий тип данных. Если вы попытаетесь присвоить значение элементу управления (полю ввода), а не реквизиту, система может выдать ошибку или значение не отобразится корректно.

Способ 2: Использование объекта обработки как посредника

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

Рассмотрим ситуацию подробнее:

  1. Создаем экземпляр обработки через Создать().
  2. Заполняем реквизит самого объекта обработки (не формы!).
  3. Получаем форму от этого конкретного объекта.

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

Преимущество этого метода в том, что данные сохраняются в объекте обработки. Если на форме поле ввода связано с данными объекта (через свойство Данные), то значение Склад появится там автоматически без дополнительных манипуляций в коде формы.

Способ 3: Использование экспортных переменных формы

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

Разберем, как это реализовать:

В самом начале модуля формы обработки (выше всех процедур) объявим переменную:

Перем ПереданныйСклад Экспорт;

Теперь в модуле формы документа мы можем обращаться к этой переменной так же, как к реквизиту:


ФормаНастройки = Обработки.ПараметрыМатериалов.ПолучитьФорму("Форма");
ФормаНастройки.ПереданныйСклад = Склад;
ФормаНастройки.Открыть();

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

Анализ типичных ошибок: почему «ничего не сохраняется»?

Часто пользователи жалуются: «Я написал код присвоения, в отладчике значение передается, но на форме поле пустое». Давайте проанализируем основные причины такой ситуации:

Рекомендации по реализации

Подводя итог, для обычного приложения 1С 8.3 мы рекомендуем придерживаться следующего алгоритма действий:

  1. Всегда четко определяйте, где должен храниться склад: в реквизитах самой обработки (объекта) или только в реквизитах формы.
  2. Используйте метод ПолучитьФорму() для создания объекта формы и сохранения ссылки на него в переменной.
  3. Выполняйте настройку формы (заполнение реквизитов) до вызова метода Открыть().
  4. Если вам нужно вернуть измененное значение обратно в документ, не забудьте указать Владельца формы при получении и использовать механизм ОповеститьОВыборе() в обработке и ОбработкаВыбора() в документе.

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

← На главную