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