Как адаптировать код процедуры ПриОткрытии при переходе с обычных форм на управляемые

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Разбираем причину ошибки: ЭлементыФормы vs Элементы

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

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

Рассмотрим пример трансформации кода:


// Было в обычных формах:
ЭлементыФормы.КнопкаВыполнить.Доступность = Ложь;

// Стало в управляемых формах:
Элементы.КнопкаВыполнить.Доступность = Ложь;

Проблема динамического назначения событий (ДействиеФормы)

Часто при переносе кода программисты сталкиваются с тем, что свойство ДействиеФормы или объект Действие не распознаются системой. Это происходит потому, что механизм назначения обработчиков событий полностью изменился. Выясним, как теперь программно связать элемент с кодом.

В управляемых формах для этого используется метод УстановитьДействие(). Посмотрим на примере, как назначить процедуру при нажатии на кнопку:


// В управляемой форме (обычно на сервере или при создании):
Элементы.ИмяКнопки.УстановитьДействие("Нажатие", "ИмяПроцедурыНаКлиенте");

Обратите внимание, что вторым параметром передается строковое имя процедуры, которая обязательно должна быть описана в модуле формы с директивой &НаКлиенте.

Разделение контекста: Клиент и Сервер

Основная сложность переноса процедуры ПриОткрытии заключается в том, что в управляемом приложении она выполняется строго &НаКлиенте. На клиенте у нас нет прямого доступа к базе данных и ко многим методам объектов. Проанализируем, как распределить старый код:

  1. ПриСозданииНаСервере: Сюда следует перенести всю логику, связанную с анализом данных базы, проверкой прав доступа, заполнением реквизитов из других справочников или запросами.
  2. ПриОткрытии (на клиенте): Здесь оставляем только «косметические» действия: интерактивные вопросы пользователю, установку фокуса на элемент или открытие связанных окон.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Логика работы с БД, запросы, проверка условий
    Если Объект.СуммаДокумента > 100000 Тогда
        Элементы.ГруппаВажныеДанные.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Интерактивные действия
    Сообщить("Форма успешно инициализирована");
КонецПроцедуры

Доступ к данным: Объект вместо ЭтотОбъект

В обычных формах мы работали напрямую с данными через ЭтотОбъект или просто обращаясь к реквизитам. В управляемых формах данные «обернуты» в специальный тип ДанныеФормыСтруктура, доступ к которому осуществляется через основной реквизит Объект.

Проанализируем ситуацию: если старый код обращался к ЭтотОбъект.Дата, то в новой форме необходимо писать Объект.Дата. Попытка вызвать метод объекта (например, из модуля документа) на клиенте приведет к ошибке. Для этого нужно выполнить преобразование на сервере:


&НаСервере
Процедура ВызватьМетодОбъектаНаСервере()
    // Преобразуем данные формы в реальный объект метаданных
    ДокОбъект = РеквизитФормыВЗначение("Объект");
    ДокОбъект.ВашаПроцедураИзМодуляОбъекта();
    // Возвращаем изменения обратно в форму
    ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры

Нюансы работы с номерами документов

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

Итоги и рекомендации по переносу

Подведем итог нашей совместной работы по анализу проблемы. Для успешного переноса скриптов выполните следующие шаги:

  1. Замените все обращения ЭлементыФормы на Элементы.
  2. Удалите обращения к коллекции Колонки внутри таблиц, обращаясь к элементам колонок напрямую.
  3. Перенесите тяжелые вычисления и запросы в процедуру ПриСозданииНаСервере.
  4. Вместо ЭтотОбъект используйте Объект для доступа к реквизитам.
  5. Проверьте, не дублирует ли ваш код стандартные функции БСП (особенно в части нумерации и печати).

Помните, что управляемые формы — это не только другой код, но и другая скорость работы (минимизация вызовов сервера). Старайтесь выполнять как можно больше настроек интерфейса за один серверный вызов при создании формы.

← На главную