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