В практике разработки на платформе «1С:Предприятие 8.3» начинающие специалисты часто сталкиваются с ситуацией, когда необходимо передать данные из интерфейса (формы) в логику, описанную в модуле менеджера. Попытка сделать это «напрямую», используя метод ПолучитьФорму() внутри модуля менеджера, является классической архитектурной ошибкой. В этой статье мы подробно разберем, почему старый подход не работает в управляемом приложении, и рассмотрим правильные способы решения этой задачи.
Рассмотрим ситуацию, описанную автором: в справочнике «Основные средства» на форме элемента создан флажок (тип Булево), который не связан с данными базы (реквизит формы). Разработчик пытается из модуля менеджера получить доступ к этому флажку следующим образом:
ВР = ПолучитьФорму("Справочник.ОсновныеСредства.ФормаЭлемента");
Сообщить("Флажок = " + ВР.ЭлементыФормы.Флажок);
Проанализируем, что происходит в этот момент в системе. Проблема кроется в разделении контекстов выполнения (Клиент и Сервер) и сути самого модуля менеджера:
ПолучитьФорму() на сервере, система не обращается к уже открытому окну пользователя. Вместо этого она создает в памяти сервера новый, чистый экземпляр формы. Все реквизиты в этой форме будут иметь значения по умолчанию (для Булево это Ложь). Именно поэтому автор всегда будет получать пустое значение, даже если пользователь нажал на флажок в своем окне.Элементы — это визуальные компоненты (кнопки, поля ввода), которые отвечают за отображение. Само значение хранится в Реквизитах формы. Модуль менеджера в принципе «не видит» интерфейсную оболочку.Самый правильный и надежный способ — это передать значение флажка из формы в модуль менеджера в момент вызова процедуры. Если вам нужно выполнить какую-то логику в менеджере, зависящую от состояния интерфейса, объявите процедуру в модуле менеджера с ключевым словом Экспорт.
Разберем по шагам. Сначала в Модуле менеджера справочника создаем метод:
Процедура ВыполнитьДействиеНаОснованииФлага(ЗначениеФлага, СсылкаНаОбъект) Экспорт
Если ЗначениеФлага Тогда
// Ваша логика, если флаг установлен
ОбъектМенеджера = СсылкаНаОбъект.ПолучитьОбъект();
// ... действия с объектом
КонецЕсли;
КонецПроцедуры
Затем в Модуле формы (на клиенте) вызываем этот метод, передавая текущее состояние флажка:
&НаКлиенте
Процедура КомандаВыполнитьДействие(Команда)
// Передаем значение реквизита формы "Флажок" прямо в менеджер
Справочники.ОсновныеСредства.ВыполнитьДействиеНаОснованииФлага(Объект.Флажок, Объект.Ссылка);
КонецПроцедуры
Этот метод исключает попытки «дотянуться» до формы из сервера — данные передаются явно и прозрачно.
Если логика в модуле менеджера должна срабатывать в момент записи объекта (например, при перехвате события записи), а флажок является временным (не сохраняется в базу), используйте механизм ДополнительныеСвойства. Это специальный транспортный контейнер, который живет в рамках одного цикла записи объекта.
Рассмотрим алгоритм действий в Модуле формы перед записью:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Добавляем значение флажка в структуру дополнительных свойств объекта
ТекущийОбъект.ДополнительныеСвойства.Вставить("ИспользоватьСпецЛогику", Объект.Флажок);
КонецПроцедуры
Теперь в модуле менеджера (или в модуле объекта в обработчике ПередЗаписью) вы сможете прочитать это значение. Выясним причину популярности этого метода: он позволяет передать «волю пользователя» глубоко в серверные механизмы, не создавая лишних полей в таблице базы данных.
Часто программисты создают «Реквизиты формы», когда на самом деле данные имеют значение для бизнес-логики предприятия. Проанализируем ситуацию: если значение этого флажка важно не только в момент нажатия кнопки, но и при последующих обработках, его следует добавить в сам справочник как Реквизит объекта.
В этом случае работа с ним становится максимально простой:
Флажок в метаданные справочника «ОсновныеСредства».Объект.Флажок).Ссылка.Флажок.Важный нюанс: Помните, что реквизит объекта записывается в базу данных и занимает место. Используйте этот подход только если значение должно «выживать» после закрытия формы.
Подводя итог, приведем основные правила взаимодействия контекстов, которые помогут избежать ошибок в будущем:
Элемент формы (картинка на экране) и Реквизит формы (переменная со значением). Даже на клиенте данные нужно брать из реквизита.Соблюдение этих простых правил сделает ваш код чистым, предсказуемым и соответствующим стандартам разработки фирмы «1С».