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

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

Управляемая форма в 1С: что это и как с ней работать

Управляемая форма 1С: что это такое, чем отличается от обычной формы, как работает клиент-серверное взаимодействие, директивы &НаКлиенте и &НаСервере, примеры кода.

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

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

Управляемые формы появились в платформе 8.2 и стали стандартом для всех современных конфигураций: «Управление торговлей 11», «ERP», «Зарплата и управление персоналом 3», «Бухгалтерия предприятия 3.0». Понимание их устройства обязательно для любого разработчика и полезно для внедренцев, которые дорабатывают типовые решения.

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

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

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

КритерийОбычная формаУправляемая форма
Описание интерфейсаКоординаты элементов в редактореДекларативная структура, авторазметка
Исполнение кодаНа клиенте, без явного разделенияЯвное разделение &НаКлиенте / &НаСервере
Работа с даннымиПрямой доступ к объектуДанные формы (ДанныеФормыСтруктура и др.)
КлиентыТолстый клиент WindowsТонкий, веб-, мобильный клиент
АктуальностьУстаревший механизмСтандарт для современных конфигураций

Клиент-серверная модель: сердце управляемых форм

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

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

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

Директивы компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста

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

&НаКлиенте — код исполняется на клиенте: обработчики событий элементов, работа с интерфейсом, оповещения, диалоги. Здесь нет доступа к запросам и объектам базы. &НаСервере — код исполняется на сервере в контексте формы: доступны реквизиты формы и её данные, можно выполнять запросы и записывать объекты. &НаСервереБезКонтекста — серверный код без доступа к данным формы; такие вызовы дешевле, потому что не передают на сервер всё состояние формы.

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

&НаКлиенте

Процедура КоличествоПриИзменении(Элемент)

ПересчитатьСуммуСтроки();

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста

Процедура ПересчитатьСуммуСтроки()

// расчёт без обращения к серверу

КонецПроцедуры

&НаСервереБезКонтекста

Функция ПолучитьЦену(Номенклатура)

// запрос к базе на сервере

КонецФункции

Частая ошибка новичков — писать &НаСервере там, где хватило бы &НаСервереБезКонтекста. Контекстный серверный вызов сериализует и передаёт всё состояние формы туда и обратно. Если процедуре не нужны реквизиты формы — всегда выбирайте вариант без контекста.
ПЗ
Практическое замечание

Данные формы и работа с реквизитами

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

Чтобы превратить данные формы в полноценный объект и записать его в базу, используются методы РеквизитФормыВЗначение() и обратно ЗначениеВРеквизитФормы(). Эти методы доступны только на сервере в контексте формы. Типовой сценарий доработки: получить объект, изменить то, что нельзя изменить через данные формы, записать, вернуть данные обратно в форму.

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

Как программно изменить объект в форме документа
  1. 1
    В серверной процедуре вызовите РеквизитФормыВЗначение("Объект") — получите объект документа
  2. 2
    Внесите нужные изменения в объект (табличные части, свойства)
  3. 3
    Вызовите объект.Записать() при необходимости сохранить в базу
  4. 4
    Верните данные в форму: ЗначениеВРеквизитФормы(Объект, "Объект")
  5. 5
    Проверьте, что форма отображает актуальные данные и не потеряла введённые пользователем значения

Основные события формы и порядок их вызова

Жизненный цикл управляемой формы начинается не на клиенте, а на сервере. Сначала вызывается ПриСозданииНаСервере — здесь формируются начальные данные, заполняются реквизиты, настраивается условное оформление. Только после этого форма передаётся клиенту и вызывается ПриОткрытии — здесь выполняются клиентские действия: подключение обработчиков ожидания, проверки оборудования.

При записи документа цепочка такая: клиентское ПередЗаписью (можно задать вопрос пользователю и отменить запись), затем серверные ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере и завершающее клиентское ПослеЗаписи.

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

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

Динамические списки на управляемых формах

Формы списков справочников и документов построены на механизме динамических списков — реквизите формы типа «ДинамическийСписок», который выполняет запрос и отображает результат с автоматической постраничной подгрузкой. Разработчик может задать произвольный запрос, отборы, сортировку и группировку, не создавая собственный механизм выборки.

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

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

Когда управляемая форма не нужна и какие есть ограничения

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

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

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

Как выбрать подход

Нужно показать или отредактировать объект типовой структурыИспользуйте автоматически генерируемую форму объекта без доработок
Нужен нестандартный сценарий ввода или рабочее место пользователяСоздайте собственную управляемую форму обработки или общую форму
Нужно только вывести данные для анализаИспользуйте отчёт на СКД — форма не потребуется
Форма должна работать в веб-клиентеИзбегайте модальных вызовов и проверяйте код на доступность всех используемых методов в веб-клиенте
Итог

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

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

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

Можно ли в управляемой форме обратиться к запросу из клиентской процедуры?

Нет, объект «Запрос» недоступен на клиенте. Нужно создать серверную процедуру (&НаСервере или &НаСервереБезКонтекста), выполнить запрос там и вернуть на клиент результат в виде массива структур или другого сериализуемого типа.

Чем &НаСервере отличается от &НаСервереБезКонтекста на практике?

Контекстный вызов передаёт на сервер все данные формы и возвращает их обратно, что дорого на больших формах. Вариант «БезКонтекста» передаёт только параметры вызова. Если процедуре не нужны реквизиты формы — всегда используйте &НаСервереБезКонтекста.

Почему изменения, сделанные через РеквизитФормыВЗначение, не видны на форме?

Метод возвращает копию данных в виде объекта. Изменения в этом объекте не отражаются в форме автоматически — после правок нужно вызвать ЗначениеВРеквизитФормы(Объект, "Объект"), чтобы вернуть данные обратно в форму.

Работают ли управляемые формы в веб-клиенте?

Да, это одно из главных назначений механизма. Но нужно избегать модальных окон, недоступных в веб-клиенте методов и расширений работы с файлами без соответствующей проверки. Тестировать форму стоит сразу в том клиенте, где её будут использовать.

Как открыть форму с отбором из другой формы?

При открытии передайте структуру параметров с ключом «Отбор»: ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", Новый Структура("Отбор", Новый Структура("Владелец", ТекКонтрагент))). Платформа сама применит отбор к динамическому списку без дополнительного кода.

Нужно ли изучать обычные формы современному разработчику?

Для новых разработок — нет, все современные конфигурации используют управляемые формы. Знание обычных форм может пригодиться только при сопровождении старых конфигураций на платформе 8.0–8.1 или при миграции с них.