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