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