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

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

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

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

---

Часть 1. Передача параметров в обычных формах (Толстый клиент)

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

Рассмотрим детально 5 основных и наиболее эффективных способов передачи параметров в обычных формах.

Способ 1. Прямое присвоение значения реквизиту формы (Решение автора темы)

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

Давайте разберем по шагам, как выглядит этот код в вызывающей обработке:


// Получаем форму нужной обработки по ее метаданным
ФормаПолученная = Обработки.Обработка2.ПолучитьФорму("ФормаОсновная");

// Напрямую заполняем реквизит формы переданным значением
ФормаПолученная.Подразделение = Подразделение;

// Открываем форму (модально или обычно)
ФормаПолученная.ОткрытьМодально();

В самой вызываемой форме (в модуле Обработка2) значение реквизита Подразделение будет доступно сразу во всех обработчиках событий, включая ПередОткрытием и ПриОткрытии. Никакого дополнительного кода для приема параметра писать не требуется.

Способ 2. Использование экспортной переменной модуля формы

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

В модуле открываемой формы Обработка2 пропишем:


Перем ПодразделениеЭкспорт Экспорт;

Процедура ПриОткрытии()
    Если ЗначениеЗаполнено(ПодразделениеЭкспорт) Тогда
        // Выполняем логику инициализации формы на основании переданного параметра
        Сообщить("Получено подразделение: " + ПодразделениеЭкспорт);
    КонецЕсли;
КонецПроцедуры

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


ФормаВызова = Обработки.Обработка2.ПолучитьФорму("ФормаОсновная");
// Присваиваем значение экспортной переменной модуля формы
ФормаВызова.ПодразделениеЭкспорт = Подразделение;
ФормаВызова.Открыть();

Способ 3. Использование экспортных методов инициализации (Лучшая практика)

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

Давайте проанализируем этот подход. В модуле формы Обработки2 создаем экспортную процедуру:


Процедура УстановитьПараметрыИнициализации(ВыбранноеПодразделение) Экспорт
    // Здесь мы можем не только присвоить значение внутренней переменной,
    // но и сразу перенастроить видимость элементов, доступность кнопок и т.д.
    Подразделение = ВыбранноеПодразделение;
    
    // Пример логики:
    ЭлементыФормы.ОсновнаяПанель.ТекущаяСтраница = ЭлементыФормы.ОсновнаяПанель.Страницы.СтраницаПодразделения;
КонецПроцедуры

Вызов такой формы становится предельно понятным и безопасным:


ФормаВызова = Обработки.Обработка2.ПолучитьФорму("ФормаОсновная");
// Передаем параметры через специализированный интерфейсный метод
ФормаВызова.УстановитьПараметрыИнициализации(Подразделение);
ФормаВызова.Открыть();

Способ 4. Использование стандартного свойства «Параметр»

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

Посмотрим на пример его использования. В вызывающем коде:


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

ФормаВызова.Параметр = ПараметрыИнициализации;
ФормаВызова.Открыть();

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


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

Способ 5. Передача через создание объекта обработки

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

Реализуем это следующим образом:


// Создаем непосредственно объект обработки в памяти
ОбъектОбработки = Обработки.Обработка2.Создать();
// Заполняем реквизит самого объекта
ОбъектОбработки.Подразделение = Подразделение;

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

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

---

Часть 2. Передача параметров в управляемых формах (Тонкий/Веб-клиент)

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

Разберем классический алгоритм передачи параметров на управляемых формах по шагам:

Шаг 1. Объявление параметров в метаданных формы

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

Шаг 2. Вызов и передача параметров на клиенте

Для открытия формы и передачи данных мы используем стандартный метод платформы ОткрытьФорму. Данные передаются в виде структуры, где ключи должны строго соответствовать именам параметров, заданным в конфигураторе на Шаге 1.


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

// Открываем форму, передавая структуру вторым аргументом
ОткрытьФорму("Обработка.Обработка2.Форма.ФормаОсновная", ПараметрыПередачи);

Шаг 3. Прием параметров на сервере

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


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

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

---

Важный нюанс: Использование модальности в 1С

В финальном решении автора темы на форуме фигурирует вызов метода ОткрытьМодально(). Важно помнить следующее:

← На главную