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