Разработка и Конфигурация · 11 мин
Как из обычной формы сделать управляемую в 1С
Пошаговая инструкция по переводу обычной формы 1С в управляемую: создание формы, перенос кода, работа с реквизитами и типичные ошибки при конвертации.
Перевод обычных форм на управляемые — типовая задача при переходе конфигурации на управляемое приложение или такси-интерфейс. Автоматической кнопки «конвертировать форму» в конфигураторе нет: управляемая форма создаётся заново, а логика и элементы переносятся вручную с переработкой под новую модель.
Главное отличие подходов: обычная форма выполняется целиком на клиенте и напрямую работает с элементами интерфейса, а управляемая разделяет код на клиентскую и серверную части, описывается декларативно и строится платформой автоматически. Поэтому простое копирование кода из старой формы в новую почти никогда не работает.
Ниже разобран практический порядок действий: от анализа старой формы до проверки результата, с типичными ошибками и ограничениями, о которых стоит знать до начала работы.
Чем управляемая форма отличается от обычной
В обычной форме разработчик напрямую размещает элементы на форме, указывает их координаты и обращается к ним из кода через коллекцию «ЭлементыФормы». Весь код модуля выполняется на клиенте, а обращения к данным идут через объектные механизмы без явного разделения контекста.
В управляемой форме интерфейс строится декларативно: вы описываете структуру элементов и их связь с реквизитами, а платформа сама решает, как отрисовать форму на тонком клиенте, веб-клиенте или мобильном клиенте. Код модуля обязательно разделяется директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и другими.
Ещё одно принципиальное отличие — работа с данными. В обычной форме элемент связан с данными объекта напрямую. В управляемой форме данные описываются как реквизиты формы (основной реквизит типа «ДанныеФормыСтруктура» для объекта), а элементы лишь отображают эти реквизиты через свойство «ПутьКДанным».
Подготовка: что проанализировать перед переносом
Прежде чем создавать новую форму, откройте модуль старой обычной формы и выпишите всё, что она делает: обработчики событий, процедуры заполнения, проверки, обращения к элементам формы, работу с табличными частями и вызовы внешних механизмов (печать, обмен, COM-объекты).
Отдельно отметьте код, который обращается к базе данных: запросы, создание объектов, запись документов. В управляемой форме такой код должен выполняться только на сервере — это потребует перестройки логики, если сейчас данные читаются прямо в клиентских обработчиках.
Проверьте количество строк и число обработчиков событий
Найдите в модуле все вхождения «ЭлементыФормы»
Ищите запросы, СоздатьОбъект, запись данных в обработчиках
Проверьте ActiveX, поля HTML, внешние компоненты
Создание управляемой формы в конфигураторе
Откройте конфигуратор, найдите нужный объект (справочник, документ, обработка) и перейдите на закладку «Формы». Нажмите «Добавить» — конструктор форм предложит тип формы. Если конфигурация работает в режиме управляемого приложения, новая форма по умолчанию будет управляемой.
Выберите вид формы (форма элемента, форма списка, форма документа и т.д.) и завершите работу конструктора. Платформа создаст форму с основным реквизитом, связанным с объектом, и базовым набором элементов.
- 1Откройте объект конфигурации, закладка «Формы»
- 2Нажмите «Добавить» и выберите нужный вид формы в конструкторе
- 3Убедитесь, что создалась управляемая форма (в модуле есть директивы &НаКлиенте/&НаСервере)
- 4Назначьте форму основной в свойствах объекта, если она должна открываться по умолчанию
- 5Сохраните конфигурацию и проверьте открытие формы в режиме предприятия
Если объект уже используется в управляемом интерфейсе, часто быстрее вообще не создавать форму вручную: платформа умеет автоматически генерировать форму объекта по умолчанию. Ручная разработка нужна, когда требуется нестандартный состав элементов или особая логика.
Перенос реквизитов и элементов формы
В управляемой форме сначала создаются реквизиты, и только потом элементы, которые их отображают. Откройте панель «Реквизиты» в редакторе формы и добавьте нужные реквизиты с типами: строка, число, таблица значений, динамический список и другие.
Затем перетащите реквизиты в дерево элементов формы — платформа создаст поля ввода, таблицы или надписи с уже заполненным свойством «ПутьКДанным». Для табличных частей объекта отдельные реквизиты создавать не нужно: они доступны через основной реквизит, например «Объект.Товары».
Компоновку элементов делайте через группы: «ГруппаКолонки», «ГруппаСтраницы», обычные группы с горизонтальной или вертикальной группировкой. Платформа сама выровняет элементы под ширину окна и тип клиента, поэтому фиксировать размеры, как в обычной форме, не требуется.
Перенос кода модуля: клиент и сервер
Это самая трудоёмкая часть. Каждый обработчик из старой формы нужно классифицировать: код, работающий с интерфейсом (вопросы пользователю, открытие форм, установка видимости), остаётся на клиенте; код, работающий с данными (запросы, объекты, записи), уходит на сервер.
Типовой приём: клиентский обработчик собирает параметры и вызывает серверную процедуру, которая выполняет работу с данными и возвращает результат. Например, заполнение табличной части по запросу в управляемой форме делается в процедуре &НаСервере, а вызывается из обработчика &НаКлиенте.
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
ЗаполнитьПоОстаткамНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
// запрос к остаткам и заполнение Объект.Товары
КонецПроцедурыОбратите внимание на замену устаревших конструкций: вместо ЭлементыФормы используется Элементы, вместо Вопрос() — асинхронный ПоказатьВопрос() с описанием оповещения, вместо Предупреждение() — ПоказатьПредупреждение(). Модальные вызовы в управляемом приложении по умолчанию запрещены, и это одна из главных причин переписывания кода.
Для обработчиков ожидания вместо ПодключитьОбработчикОжидания с глобальным контекстом используется ПодключитьОбработчикОжидания("ИмяПроцедуры", Интервал) в модуле формы. Для оповещений между формами — Оповестить() и обработчик ОбработкаОповещения.
Типичные ошибки при конвертации
Отдельная группа ошибок связана с сериализацией данных. В управляемой форме между клиентом и сервером нельзя передавать произвольные объекты (например, «СправочникОбъект» или «ТаблицаЗначений» без преобразования). Для передачи используйте примитивные типы, структуры, массивы, а таблицы значений преобразуйте через ЗначениеВСтрокуВнутр или работайте с ними только на сервере.
Проверка результата и ограничения
После переноса проверьте форму во всех клиентах, которые используются в организации: тонкий клиент, веб-клиент, при необходимости мобильный. Управляемая форма может выглядеть по-разному, и часть возможностей (например, некоторые ActiveX-компоненты) в веб-клиенте недоступна в принципе.
Как проверить результат
Нет ошибок во всех директивах компиляции
Ошибки «Процедура или функция не определена» при проверке конфигурации
Форма открывается, данные объекта отображаются
Пустые поля или ошибка обращения к реквизиту
Объект записывается и проводится штатно
Ошибки при записи, потеря табличных частей
Команды выполняются, данные обновляются
Молчаливое отсутствие реакции — серверная процедура не вызвана
Полезно включить в свойствах конфигурации проверку модальности и синхронных вызовов: конфигуратор подсветит все места, где используются запрещённые в управляемом режиме методы. Это быстрый способ найти непереписанные фрагменты.
Как выбрать действие
Частые вопросы
Можно ли автоматически конвертировать обычную форму в управляемую?
Штатного механизма конвертации в платформе нет. Существуют сторонние инструменты частичной автоматизации, но они переносят в основном состав элементов, а код модуля всё равно приходится переписывать вручную из-за разной модели исполнения.
Что делать с обработчиком «ПередЗаписью» из обычной формы?
В управляемой форме есть аналогичные события: «ПередЗаписью» на клиенте и «ПередЗаписьюНаСервере». Проверки данных, требующие обращения к базе, переносите в серверный вариант, интерактивные вопросы пользователю — в клиентский с асинхронным продолжением.
Почему в управляемой форме не виден реквизит объекта?
Данные объекта в управляемой форме хранятся в основном реквизите «Объект». Обращаться к реквизитам нужно как «Объект.ИмяРеквизита», а в элементе формы путь к данным указывается аналогично. Если реквизит не отображается, проверьте свойство «ПутьКДанным» у элемента.
Как открыть управляемую форму с параметрами?
Используйте функцию «ОткрытьФорму» с именем формы и структурой параметров, а для получения результата — «ОповеститьОЗакрытии» или обработчик «ОбработкаВыбора». Модальное открытие через «ОткрытьМодально» в управляемом приложении недоступно.
Нужно ли удалять старую обычную форму после создания управляемой?
Если конфигурация полностью переведена на управляемый режим, обычная форма больше не используется и её можно удалить, чтобы не поддерживать два варианта. Если база ещё работает в смешанном режиме, оставьте обе формы до завершения перехода.
Как перенести печатную кнопку из обычной формы?
Создайте команду формы, в клиентском обработчике вызовите серверную процедуру формирования табличного документа, а результат верните на клиент и покажите через табличный документ в отдельной форме или стандартный механизм печати БСП, если она внедрена.
Что важно запомнить
Управляемая форма создаётся заново, а не конвертируется: сначала реквизиты и элементы, затем переписывание кода с разделением на клиент и сервер. Главные подводные камни — модальные вызовы, обращения к ЭлементыФормы и серверная логика в клиентских процедурах. Работу выполняйте на копии базы и проверяйте результат во всех используемых клиентах.