В чем разница между ОткрытьФорму и ПолучитьФорму и как правильно передавать данные между формами?

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

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

Проблема прямого обращения к реквизитам через ПолучитьФорму

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


&НаКлиенте
Процедура Расш2_ОплатитьПеред(Команда)
    // Попытка получить форму программно
    формаОплаты = ПолучитьФорму("Обработка.ПомощникПроведенияОплаты.Форма");
    
    // Прямое присвоение значений реквизитам
    формаОплаты.ЭтоСпецПродажа = Истина;
    формаОплаты.СпецСтоимость = Объект.Запасы[0].Всего;
    
    // Далее предполагается, что штатный код откроет эту же форму
КонецПроцедуры

Почему этот подход считается некорректным и часто не работает? Выясним причины:

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

Использование ОткрытьФорму с передачей параметров

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

Посмотрим на пример правильной реализации:


&НаКлиенте
Процедура Расш2_ОплатитьВместо(Команда)
    // Формируем структуру параметров
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ЭтоСпецПродажа", Истина);
    ПараметрыОткрытия.Вставить("СпецСтоимость", Объект.Запасы[0].Всего);
    ПараметрыОткрытия.Вставить("СпецПродолжительность", Объект.Запасы[0].Количество);
    
    // Открываем форму с параметрами
    ОткрытьФорму("Обработка.ПомощникПроведенияОплаты.Форма", ПараметрыОткрытия);
КонецПроцедуры

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


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

Когда использовать ПолучитьФорму и КлючУникальности

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

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

Синтаксис метода выглядит так: ПолучитьФорму(ИмяФормы, Параметры, Владелец, Уникальность). Если передать в Уникальность конкретное значение (например, ссылку на документ или уникальный идентификатор), система будет искать форму по этому ключу.

Особенности работы в расширениях (Аннотации)

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

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

Альтернативные методы обмена данными

Иногда данных слишком много (например, целая таблица значений), и передавать их через структуру параметров неудобно. Проанализируем другие способы:

  1. Временное хранилище: Помещаем данные в хранилище на клиенте или сервере с помощью ПоместитьВоВременноеХранилище(), а в параметры формы передаем только полученный адрес (строку). Это самый производительный способ для больших объемов данных.
  2. Оповещения (Метод Оповестить): Если форма уже открыта, и вам нужно передать в нее сигнал об изменениях из другой формы, используйте Оповестить("ИмяСобытия", Параметр, ЭтаФорма). В принимающей форме должен быть настроен обработчик ОбработкаОповещения.
  3. Параметры сеанса: Крайне не рекомендуемый метод для передачи данных между формами, так как он замусоривает память сервера и может привести к конфликтам, если пользователь работает в нескольких окнах одновременно.

Подведем итоги

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

Для качественной разработки всегда придерживайтесь правила: передавайте данные через структуру параметров в ОткрытьФорму и обрабатывайте их в ПриСозданииНаСервере. Это обеспечит стабильность вашего расширения и отсутствие трудноуловимых ошибок при обновлении основной конфигурации.

← На главную