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