Как правильно открыть вторую форму того же объекта в 1С:Управляемые формы?

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

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

Понимание архитектурных ограничений

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

Способ №1: Передача через параметры и открытие формы

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

Рассмотрим пример открытия формы с передачей ключа:


ПараметрыФормы = Новый Структура(\"Ключ\", Объект.Ссылка);
ОткрытьФорму(\"Справочник.ВашСправочник.Форма.Форма2\", ПараметрыФормы);

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

Способ №2: Работа через владельца формы и копирование данных

Это наиболее надежный способ, если вторая форма открывается модально и должна взаимодействовать с данными основной формы. Мы можем передать ЭтаФорма в качестве владельца при открытии, а затем манипулировать данными.

Выполним это в несколько шагов:

  1. Откроем форму, передав владельца.
  2. Внутри второй формы получим данные владельца.
  3. Используем метод КопироватьДанныеФормы для синхронизации.

// В первой форме:
Форма2 = ПолучитьФорму(\"Справочник.ВашСправочник.Форма.Форма2\", , ЭтаФорма);
КопироватьДанныеФормы(Объект, Форма2.Объект); // Заполнение данными
Форма2.ОткрытьМодально();

При закрытии второй формы, чтобы вернуть измененные данные обратно в форму-владельца, используем обратную операцию:


// Во второй форме при закрытии:
КопироватьДанныеФормы(Объект, ЭтаФорма.ВладелецФормы.Объект);

Способ №3: Вынос логики в модуль менеджера

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

В чем преимущество такого подхода?

Просто передавайте ссылку на элемент в функцию модуля менеджера:


// В модуле менеджера:
Функция ВыполнитьСложнуюПроверку(СсылкаНаОбъект) Экспорт
    ОбъектДанные = СсылкаНаОбъект.ПолучитьОбъект();
    // ... логика проверки ...
    Возврат Результат;
КонецФункции

Подводя итоги

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

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

Следуя этим рекомендациям, вы сможете построить гибкий и надежный интерфейс, который будет легко поддерживать и дорабатывать в будущем.

← На главную