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

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

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

Использование оповещений при закрытии формы

Одним из самых «чистых» способов получения данных из открываемой формы является использование механизма оповещений. Вместо того чтобы пытаться «пробросить» значение через цепочку вызовов, мы используем событие закрытия формы.

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

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

Если параметров много, рекомендуем собрать их в Структура. Это позволит передать объект с данными целиком, сохраняя чистоту кода.

Применение параметров сеанса

Если выбранный подписант является настройкой, которая должна сохраняться на протяжении всей работы пользователя в текущем сеансе, идеальным решением будет использование ПараметрыСеанса.

Разберем этот подход по шагам:

  1. Создайте параметр сеанса в конфигураторе.
  2. При выборе значения в форме, запишите его в ПараметрыСеанса.ИмяВашегоПараметра.
  3. Теперь в любой серверной процедуре, в любом общем модуле или при формировании отчета вы сможете обратиться к этому значению напрямую.

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

Использование хранилища настроек

Если необходимо, чтобы выбор подписанта сохранялся даже после перезапуска системы (персистентность), воспользуйтесь ХранилищеСистемныхНастроек или ХранилищеОбщихНастроек.

Проанализируем преимущества этого метода:

Почему не стоит использовать переменные модуля для передачи данных?

Часто программисты пытаются объявить Переменная на уровне модуля и использовать её как глобальное хранилище. Важно понимать, что в 1С:Предприятии 8 серверный и клиентский контексты сильно разделены:

  1. Переменная клиентского модуля не видна на сервере.
  2. Переменная серверного модуля (включая формы) живет только до завершения текущего серверного вызова.

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


Процедура ВыполнитьВыгрузку(Подписант)
    // Здесь мы уже имеем переданный объект
    ПодготовитьXML(Подписант);
    СохранитьФайл(Подписант);
КонецПроцедуры

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

Подводя итог, выбор метода зависит от времени жизни данных: для разовой операции используйте ОповеститьОВыборе и передачу параметров, для сессионных настроек — ПараметрыСеанса, а для долговременных предпочтений — ХранилищеНастроек.

← На главную