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