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

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

При переходе на управляемый интерфейс или при необходимости использовать одну и ту же обработку в разных базах (как на обычных, так и на управляемых формах) разработчики сталкиваются с ограничением платформы: внешнюю обработку с интерфейсом на обычных формах (ОФ) невозможно напрямую открыть в тонком клиенте управляемого приложения (УФ). Разберем причины этого ограничения и рассмотрим, как грамотно сделать универсальную внешнюю обработку без снятия конфигурации с поддержки.

Почему нельзя открыть обычную форму в управляемом режиме напрямую

Выясним причину архитектурных ограничений платформы «1С:Предприятие 8»:

  1. Тип клиентского приложения: обычные формы физически поддерживаются только толстым клиентом. В тонком клиенте и веб-клиенте компонент отрисовки обычных форм отсутствует.
  2. Настройки совместимости конфигурации: запуск внешней обработки с обычной формой в управляемом режиме блокируется платформой на уровне прав и параметров конфигурации, если в свойствах метаданных отключена опция использования обычных форм. В типовых решениях включить этот режим без снятия конфигурации с поддержки невозможно.
  3. Параметр запуска /RunModeOrdinaryApplication: запуск системы с флагом запуска в режиме обычного приложения возможен только для толстого клиента и не подходит для пользователей, работающих исключительно в тонком или веб-клиенте.

Таким образом, единственным надежным решением является разработка универсальной внешней обработки, которая содержит обе формы (обычную и управляемую) и самостоятельно определяет контекст работы пользователя.

Пошаговый план создания универсальной обработки

Разберем по шагам, как модернизировать существующую обработку, сохранив ее работоспособность в старых базах и обеспечив функционирование в новых управляемых конфигурациях.

  1. Добавление управляемой формы: открываем внешнюю обработку в конфигураторе и добавляем новую форму, выбрав тип «Управляемая».
  2. Назначение основных форм: в свойствах обработки указываем обычную форму как основную для обычного приложения, а управляемую — как основную для управляемого приложения. Платформа 1С при интерактивном открытии через меню Файл → Открыть автоматически отобразит нужную форму в зависимости от режима работы пользователя.
  3. Перенос интерфейсной логики: на управляемой форме размещаем аналогичные элементы управления, связываем их с реквизитами формы и пишем обработчики событий с учетом клиент-серверного взаимодействия.
  4. Вынос общей бизнес-логики: основные алгоритмы расчетов, формирования документов и выборок данных переносим в модуль объекта обработки, сделав соответствующие процедуры и функции экспортными.

Особенности написания кода в модулях: директивы и инструкции препроцессора

Проанализируем ключевые различия в структуре программного кода при адаптации обработки.

1. Директивы компиляции в модуле формы:

В модуле управляемой формы обязательны директивы &НаКлиенте, &НаСервере или &НаСервереБезКонтекста. На клиенте выполняется только интерфейсная работа, а все обращения к базе данных и тяжелые вычисления выполняются на сервере.

2. Инструкции препроцессора в модуле объекта:

В модуле объекта обработки директивы компиляции (&НаСервере и т. д.) писать нельзя — это приведет к синтаксической ошибке. Модуль объекта компилируется целиком на стороне сервера или толстого клиента. Для разделения кода по типам клиентов при необходимости используются инструкции препроцессора:


#Если Сервер Или ТолстыйКлиентОбычноеПриложениеКлиент Тогда
Процедура ВыполнитьОсновноеДействие() Экспорт
    // Основная бизнес-логика обработки
КонецПроцедуры
#КонецЕсли

Подводные камни при адаптации логики для управляемых форм

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

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

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

← На главную