Как перейти с обычных форм на управляемые в 1С:8.3?

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

Переход с обычных форм на управляемые — это не просто косметическое обновление интерфейса «Такси». Это фундаментальное изменение архитектуры приложения, которое требует от разработчика переосмысления того, как данные передаются между пользователем и базой данных. В этой статье мы разберем основные этапы трансформации конфигурации, выясним причины типичных ошибок новичков и проанализируем технические нюансы разделения кода.

Понимание архитектурного сдвига: Клиент против Сервера

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

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


&НаКлиенте
Процедура КомандаВыполнить(Команда)
    Результат = ПолучитьДанныеНаСервере();
    Сообщить(Результат);
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеНаСервере()
    Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");
    // Логика формирования результата
    Возврат "Данные получены";
КонецФункции

Почему объекты не отображаются в интерфейсе?

Часто разработчики сталкиваются с ситуацией: объект (справочник или документ) создан, но в режиме «1С:Предприятие» его не видно в подсистемах. Проанализируем основные причины этой проблемы и пути их решения.

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

2. Настройка подсистем. Убедитесь, что объект включен хотя бы в одну подсистему, которая отмечена для отображения в командном интерфейсе. Также важно проверить состав команд подсистемы. Для этого нужно нажать правой кнопкой на корень конфигурации и выбрать «Открыть командный интерфейс рабочего стола» или «Открыть командный интерфейс конфигурации».

3. Функциональные опции. Проверьте, не привязан ли ваш объект к какой-либо функциональной опции. Если опция выключена (значение в константе или параметре сеанса ложно), объект будет скрыт от пользователя независимо от прав доступа и настроек интерфейса.

Рефакторинг бизнес-логики: Модули объекта и проведения

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

Нам необходимо переписать все интерактивные действия. Вместо модальных вызовов в формах теперь используются асинхронные методы. Посмотрим на пример замены кода:

Было в обычных формах:


Если Вопрос("Продолжить?", РежимДиалога.ДаНет) = КодВозвратаДиалога.Да Тогда
    // Действие
КонецЕсли;

Стало в управляемых формах:


&НаКлиенте
Процедура СделатьДействие(Команда)
    Оповещение = Новый ОписаниеОповещения("ЗавершитьДействие", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Продолжить?", РежимДиалога.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьДействие(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Продолжаем логику
    КонецЕсли;
КонецПроцедуры

Работа с данными формы: РеквизитФормыВЗначение

В управляемом интерфейсе мы работаем не с самим объектом базы данных, а с его отображением на форме. Тип данных в форме — ДанныеФормыСтруктура (для документов/справочников) или ДанныеФормыКоллекция (для табличных частей). Чтобы вызвать метод объекта (например, заполнить документ по какому-то алгоритму, описанному в модуле объекта), нам нужно выполнить преобразование.

Рассмотрим шаги этого процесса:

  1. Переходим на сервер.
  2. Преобразуем данные формы в полноценный объект метаданных функцией РеквизитФормыВЗначение("Объект").
  3. Выполняем необходимые действия с объектом.
  4. Возвращаем изменения обратно в форму функцией ЗначениеВРеквизитФормы(ДокОбъект, "Объект").

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

Стратегия постепенного перехода

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

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

Важный совет: При проектировании новых форм старайтесь выносить всю сложную расчетную логику в Общие модули с флагом Сервер и Вызов сервера. Это позволит вам использовать один и тот же код как в старых, так и в новых формах, минимизируя дублирование кода.

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

← На главную