Как использовать управляемые формы в режиме обычного приложения толстого клиента?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе постепенного перехода или доработки конфигураций на базе обычных форм (например, УПП 1.3, КА 1.1, ЗУП 2.5 или ББУ 1.0) разработчики часто сталкиваются с необходимостью внедрения управляемых форм без полной смены режима запуска всей базы. Разберем по шагам, как правильно настроить конфигурацию, как устроен механизм выполнения управляемых форм в обычном приложении и какие тонкости клиент-серверного взаимодействия необходимо учитывать.

Обязательные системные настройки конфигурации

Для того чтобы платформа 1С:Предприятие позволяла запускать управляемые формы в сеансе толстого клиента обычного приложения, выполним следующие базовые настройки:

  1. В свойствах корневого элемента дерева метаданных конфигурации проверим и установим свойство «Использовать управляемые формы в обычном приложении». Без этого флага платформа будет игнорировать управляемые формы или генерировать формы старого образца по умолчанию.
  2. Настроим флаги компиляции общих модулей. Если код управляемой формы обращается к экспортным методам общего модуля, у него обязательно должны быть установлены признаки «Клиент (управляемое приложение)» и/или «Сервер». Если модуль скомпилирован исключительно для «Клиент (обычное приложение)», то при вызове его из контекста управляемой формы платформа сгенерирует исключение времени выполнения.

Особенности производительности и первого открытия

Проанализируем поведение интерфейса при первом обращении к управляемой форме. При первом открытии формы в рамках одного сеанса наблюдается небольшая задержка. Это нормальное поведение платформы: в этот момент происходит компиляция описания формы и ее интерфейсных элементов. После первого открытия скомпилированное представление кэшируется в памяти сеанса, и все последующие открытия той же управляемой формы выполняются мгновенно.

Разделение контекста и ограничения платформы

При разработке управляемых форм в режиме обычного приложения важно помнить о строгих границах контекстов исполнения:

  1. Недоступность глобальных переменных: В контексте управляемой формы (как на клиенте, так и на сервере) недоступны переменные и глобальные экспортные процедуры/функции модуля обычного приложения.
  2. Передача данных между формами: На клиент управляемой формы нельзя напрямую передавать специфичные для толстого клиента типы (ТаблицаЗначений, ДокументОбъект, СправочникОбъект). Все передаваемые параметры должны быть простыми типами (ссылки, числа, строки, структуры) либо передаваться через сериализацию во временное хранилище с помощью методов ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища.
  3. Особенности интерфейса: В обычном приложении нет командного интерфейса управляемого режима (панели разделов, панели функций). Управляемые формы открываются в виде свободных окон MDI либо как модальные/блокирующие окна.

Взаимодействие обычных и управляемых форм

Рассмотрим, как организовать обмен данными и открытие форм между двумя разными технологиями интерфейса:

  1. Открытие управляемой формы из обычной: Выполняется стандартной глобальной функцией ОткрытьФорму. Например:
    
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаУправляемая", ПараметрыФормы, ЭтаФорма);
    
  2. Обмен событиями через оповещения: Механизм оповещений является сквозным. Если в управляемой форме вызвать Оповестить("ОбновлениеДанных", ПараметрОповещения), то это оповещение штатно перехватывается в обычной форме внутри процедуры ОбработкаОповещения(ИмяСобытия, Параметр, Источник), и наоборот.
  3. Работа с внешними обработками: При стандартном вызове ВнешниеОбработки.Создать() создается объект толстого клиента. Чтобы гарантированно открыть управляемую форму внешней обработки, используем следующий подход:
    
    ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма.ИмяФормы");
    

Рекомендации по написанию серверного кода

Выясним, как избежать типичных ошибок при написании кода в управляемых формах внутри смешанных конфигураций:

  1. Используем директиву &НаСервереБезКонтекста везде, где не требуется изменение реквизитов формы. Это существенно снижает объем передаваемых данных между клиентом и сервером.
  2. Не применяем синхронные модальные вызовы и устаревшие методы работы с файловой системой толстого клиента внутри кода управляемой формы. Рекомендуется использовать асинхронные конструкции и функции обратного вызова (ОписаниеОповещения), что обеспечивает плавность работы пользовательского интерфейса.
← На главную