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