К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как из обычной формы сделать управляемую в 1С

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

Перевод обычных форм на управляемые — типовая задача при переходе конфигурации на управляемое приложение или такси-интерфейс. Автоматической кнопки «конвертировать форму» в конфигураторе нет: управляемая форма создаётся заново, а логика и элементы переносятся вручную с переработкой под новую модель.

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

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

Чем управляемая форма отличается от обычной

В обычной форме разработчик напрямую размещает элементы на форме, указывает их координаты и обращается к ним из кода через коллекцию «ЭлементыФормы». Весь код модуля выполняется на клиенте, а обращения к данным идут через объектные механизмы без явного разделения контекста.

В управляемой форме интерфейс строится декларативно: вы описываете структуру элементов и их связь с реквизитами, а платформа сама решает, как отрисовать форму на тонком клиенте, веб-клиенте или мобильном клиенте. Код модуля обязательно разделяется директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и другими.

Ещё одно принципиальное отличие — работа с данными. В обычной форме элемент связан с данными объекта напрямую. В управляемой форме данные описываются как реквизиты формы (основной реквизит типа «ДанныеФормыСтруктура» для объекта), а элементы лишь отображают эти реквизиты через свойство «ПутьКДанным».

Подготовка: что проанализировать перед переносом

Прежде чем создавать новую форму, откройте модуль старой обычной формы и выпишите всё, что она делает: обработчики событий, процедуры заполнения, проверки, обращения к элементам формы, работу с табличными частями и вызовы внешних механизмов (печать, обмен, COM-объекты).

Отдельно отметьте код, который обращается к базе данных: запросы, создание объектов, запись документов. В управляемой форме такой код должен выполняться только на сервере — это потребует перестройки логики, если сейчас данные читаются прямо в клиентских обработчиках.

Размер модуля формыДо 500 строк — перенос вручную за 1–2 часа

Проверьте количество строк и число обработчиков событий

Обращения к ЭлементыФормыПотребуется замена на Элементы и реквизиты

Найдите в модуле все вхождения «ЭлементыФормы»

Серверная логика в клиентеНужен перенос в серверные процедуры

Ищите запросы, СоздатьОбъект, запись данных в обработчиках

Нестандартные элементыМогут не иметь прямого аналога

Проверьте ActiveX, поля HTML, внешние компоненты

Создание управляемой формы в конфигураторе

Откройте конфигуратор, найдите нужный объект (справочник, документ, обработка) и перейдите на закладку «Формы». Нажмите «Добавить» — конструктор форм предложит тип формы. Если конфигурация работает в режиме управляемого приложения, новая форма по умолчанию будет управляемой.

Выберите вид формы (форма элемента, форма списка, форма документа и т.д.) и завершите работу конструктора. Платформа создаст форму с основным реквизитом, связанным с объектом, и базовым набором элементов.

Порядок создания формы
  1. 1
    Откройте объект конфигурации, закладка «Формы»
  2. 2
    Нажмите «Добавить» и выберите нужный вид формы в конструкторе
  3. 3
    Убедитесь, что создалась управляемая форма (в модуле есть директивы &НаКлиенте/&НаСервере)
  4. 4
    Назначьте форму основной в свойствах объекта, если она должна открываться по умолчанию
  5. 5
    Сохраните конфигурацию и проверьте открытие формы в режиме предприятия

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

Перенос реквизитов и элементов формы

В управляемой форме сначала создаются реквизиты, и только потом элементы, которые их отображают. Откройте панель «Реквизиты» в редакторе формы и добавьте нужные реквизиты с типами: строка, число, таблица значений, динамический список и другие.

Затем перетащите реквизиты в дерево элементов формы — платформа создаст поля ввода, таблицы или надписи с уже заполненным свойством «ПутьКДанным». Для табличных частей объекта отдельные реквизиты создавать не нужно: они доступны через основной реквизит, например «Объект.Товары».

Компоновку элементов делайте через группы: «ГруппаКолонки», «ГруппаСтраницы», обычные группы с горизонтальной или вертикальной группировкой. Платформа сама выровняет элементы под ширину окна и тип клиента, поэтому фиксировать размеры, как в обычной форме, не требуется.

Перенос кода модуля: клиент и сервер

Это самая трудоёмкая часть. Каждый обработчик из старой формы нужно классифицировать: код, работающий с интерфейсом (вопросы пользователю, открытие форм, установка видимости), остаётся на клиенте; код, работающий с данными (запросы, объекты, записи), уходит на сервер.

Типовой приём: клиентский обработчик собирает параметры и вызывает серверную процедуру, которая выполняет работу с данными и возвращает результат. Например, заполнение табличной части по запросу в управляемой форме делается в процедуре &НаСервере, а вызывается из обработчика &НаКлиенте.

bsl
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
    ЗаполнитьПоОстаткамНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
    // запрос к остаткам и заполнение Объект.Товары
КонецПроцедуры

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

Для обработчиков ожидания вместо ПодключитьОбработчикОжидания с глобальным контекстом используется ПодключитьОбработчикОжидания("ИмяПроцедуры", Интервал) в модуле формы. Для оповещений между формами — Оповестить() и обработчик ОбработкаОповещения.

Типичные ошибки при конвертации

Типичные ошибки
01
Копирование модуля обычной формы целиком — код не компилируется из-за модальных вызовов и обращений к ЭлементыФормы
02
Вызов серверных методов объекта (Записать, Провести) из клиентской процедуры — ошибка компиляции или падение в веб-клиенте
03
Обращение к реквизитам объекта напрямую без префикса Объект. — в управляемой форме данные лежат в реквизите «Объект»
04
Использование Вопрос() и ОткрытьФормуМодально() — модальный режим запрещён, нужны асинхронные аналоги с оповещениями
05
Перенос логики в обработчик ПриОткрытии вместо ПриСозданииНаСервере — инициализация данных должна выполняться на сервере до открытия формы

Отдельная группа ошибок связана с сериализацией данных. В управляемой форме между клиентом и сервером нельзя передавать произвольные объекты (например, «СправочникОбъект» или «ТаблицаЗначений» без преобразования). Для передачи используйте примитивные типы, структуры, массивы, а таблицы значений преобразуйте через ЗначениеВСтрокуВнутр или работайте с ними только на сервере.

Проверка результата и ограничения

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

Контрольные точки

Как проверить результат

Компиляция модуля формы
Норма

Нет ошибок во всех директивах компиляции

Тревожный признак

Ошибки «Процедура или функция не определена» при проверке конфигурации

Открытие формы
Норма

Форма открывается, данные объекта отображаются

Тревожный признак

Пустые поля или ошибка обращения к реквизиту

Запись объекта
Норма

Объект записывается и проводится штатно

Тревожный признак

Ошибки при записи, потеря табличных частей

Работа команд
Норма

Команды выполняются, данные обновляются

Тревожный признак

Молчаливое отсутствие реакции — серверная процедура не вызвана

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

Маршрут решения

Как выбрать действие

Форма простая, без нестандартной логикиУдалите старую форму и положитесь на автоматически генерируемую платформой
Форма содержит много серверной логикиВынесите логику в общий модуль и вызывайте из серверных процедур формы
Используются внешние компоненты или ActiveXПроверьте поддержку в нужных клиентах; при отсутствии — пересмотрите решение задачи
Форма открывается из многих мест конфигурацииСохраните имя формы и параметры открытия, чтобы не менять вызывающий код

Частые вопросы

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

Штатного механизма конвертации в платформе нет. Существуют сторонние инструменты частичной автоматизации, но они переносят в основном состав элементов, а код модуля всё равно приходится переписывать вручную из-за разной модели исполнения.

Что делать с обработчиком «ПередЗаписью» из обычной формы?

В управляемой форме есть аналогичные события: «ПередЗаписью» на клиенте и «ПередЗаписьюНаСервере». Проверки данных, требующие обращения к базе, переносите в серверный вариант, интерактивные вопросы пользователю — в клиентский с асинхронным продолжением.

Почему в управляемой форме не виден реквизит объекта?

Данные объекта в управляемой форме хранятся в основном реквизите «Объект». Обращаться к реквизитам нужно как «Объект.ИмяРеквизита», а в элементе формы путь к данным указывается аналогично. Если реквизит не отображается, проверьте свойство «ПутьКДанным» у элемента.

Как открыть управляемую форму с параметрами?

Используйте функцию «ОткрытьФорму» с именем формы и структурой параметров, а для получения результата — «ОповеститьОЗакрытии» или обработчик «ОбработкаВыбора». Модальное открытие через «ОткрытьМодально» в управляемом приложении недоступно.

Нужно ли удалять старую обычную форму после создания управляемой?

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

Как перенести печатную кнопку из обычной формы?

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

Итог

Что важно запомнить

Управляемая форма создаётся заново, а не конвертируется: сначала реквизиты и элементы, затем переписывание кода с разделением на клиент и сервер. Главные подводные камни — модальные вызовы, обращения к ЭлементыФормы и серверная логика в клиентских процедурах. Работу выполняйте на копии базы и проверяйте результат во всех используемых клиентах.