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