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