Управляемые формы
Управляемые формы — это не просто новый интерфейс, это другая архитектура разработки с четким разделением клиентской и серверной логики.
Ключевое отличие от обычных форм:
- Обычные формы → только в толстом клиенте
- Управляемые формы → во всех клиентах + адаптивный интерфейс
Архитектура и выполнение кода
Модуль формы: клиент-серверная модель
Каждая управляемая форма имеет собственный модуль, который выполняется и на клиенте, и на сервере. Для указания места выполнения используются директивы компиляции.
Модуль формы работает одновременно на:
├── Клиенте (интерфейс, диалоги)
└── Сервере (бизнес-логика, работа с БД)
Директивы компиляции (ОБЯЗАТЕЛЬНЫ):
| Директива | Где выполняется | Контекст формы |
|---|---|---|
&НаКлиенте | Клиент | ✅ Доступен |
&НаСервере | Сервер | ✅ Доступен |
&НаСервереБезКонтекста | Сервер | ❌ Не доступен |
&НаКлиентеНаСервереБезКонтекста | Клиент/Сервер | ❌ Не доступен |
Важные правила:
- Можно вызывать серверные процедуры из клиентских
- НЕЛЬЗЯ вызывать клиентские процедуры из серверных
- Без директивы →
&НаСерверепо умолчанию
Типы данных: два мира
1. Прикладные объекты (только на сервере)
СправочникОбъект.*
ДокументОбъект.*
и т.д.
2. Данные формы (клиент + сервер)
| Тип | Представляет | Пример использования |
|---|---|---|
ДанныеФормыСтруктура | Простой объект | Элемент справочника |
ДанныеФормыКоллекция | Список | Табличная часть |
ДанныеФормыСтруктураСКоллекцией | Структура + коллекция | Набор записей |
ДанныеФормыДерево | Иерархия | Дерево значений |
Данные формы – это специальные типы, которые представляют данные прикладных объектов и доступны и на клиенте, и на сервере. Это унифицированное представление для работы в форме.
В контексте формы недоступны методы и свойства основного объекта (например, справочника или документа). Для работы с ними необходимо использовать специальные методы:
Методы преобразования:
// Глобальные методы
ЗначениеВДанныеФормы() // Объект → Данные формы
ДанныеФормыВЗначение() // Данные формы → Объект
// Методы формы (рекомендуется)
ЗначениеВРеквизитФормы() // Объект → Реквизит формы
РеквизитФормыВЗначение() // Реквизит формы → Объект
- Преобразовать данные формы в объект на сервере:
РеквизитФормыВЗначение(). - Вызвать метод объекта.
- Вернуть изменения в форму:
ЗначениеВРеквизитФормы().
Важно: Прикладные объекты и методы работы с ними доступны только в серверных методах!
Особенности работы с коллекциями
Ленивая загрузка (порционная передача):
Данные коллекции передаются с сервера на клиент порциями для оптимизации трафика.
Новые порции → только при обращении на клиенте.
Рекомендации для больших коллекций (от 20 строк):
- Обход строк → только на сервере
- Поиск строк (
НайтиСтроки()) → только на сервере
Для больших коллекций всегда используйте явные серверные вызовы для обработки данных, минимизируя таким образом количество обращений к серверу и улучшая производительность формы.
Жизненный цикл формы
События при открытии:
| № | Контекст выполнения | Модуль | Событие | Когда вызывается |
|---|---|---|---|---|
| 1 | Сервер | Модуль менеджера | ОбработкаПолученияФормы | Всегда (первое) |
| 2 | Сервер | Модуль менеджера | ОбработкаПолученияПредставления | Только для существующих |
| 3 | Сервер | Модуль объекта | ОбработкаЗаполнения | Только для новых |
| 4 | Сервер | Модуль объекта | ПриКопировании | При создании копии |
| 5 | Сервер | Модуль формы | ПриЧтенииНаСервере | Только для существующих |
| 6 | Сервер | Модуль формы | ПриСозданииНаСервере | Всегда |
| 7 | Клиент | Модуль формы | ПриОткрытии | Всегда (последнее) |
События при закрытии:
-
Клиент: ПередЗакрытием (можно отменить)
-
Клиент: ПриЗакрытии (гарантированное закрытие)
Запись документа: полная последовательность
I. ФАЗА ПОДГОТОВКИ (до транзакции)
ПередЗаписью(клиент) - диалог с пользователемОбработкаПроверкиЗаполненияНаСервере(сервер, форма)ОбработкаПроверкиЗаполнения(сервер, объект)ПередЗаписьюНаСервере(сервер, форма) - заполнениеТекущийОбъект
II. ФАЗА ТРАНЗАКЦИИ
ПередЗаписью(сервер, объект) - главная провер каПриУстановкеНовогоНомера(сервер) - автонумерацияПриЗаписи(сервер, объект) - запись доп. данных (есть ссылка!)ОбработкаПроведения(сервер) - движения по регистрамПриЗаписиНаСервере(сервер, форма) - аналогПриЗаписис доступом к форме
III. ФАЗА ЗАВЕРШЕНИЯ (после транзакции)
ПослеЗаписиНаСервере(сервер) - действия при гарантированной записиПослеЗаписи(клиент) - обновление интерфейса
Ключевые правила выбора обработчика
| Задача | Где размещать | Пример |
|---|---|---|
| Общие проверки при любой записи | ПередЗаписью (модуль объекта) | Проверка условий |
| Запись доп. данных в транзакции | ПриЗаписи (объект) | Создание связанных данных |
| Работа с формой после записи | ПослеЗаписиНаСервере (форма) | Обновление интерфейса |
| Диалоги с пользователем | ПередЗапись/ПослеЗаписи (клиент) | Запрос подтверждения |
Работа с ТекущийОбъект
✅ Где МОЖНО изменять:
- ПередЗаписьюНаСервере
- ПриЗаписиНаСервере
❌ Где НЕЛЬЗЯ изменять:
ПослеЗаписиНаСервере → транзакция завершена, изменения потеряются. Только для вызова методов объекта.
📌 Когда появляется ссылка для нового объекта: в методе ПриЗаписиНаСервере
Ответы на ключевые вопросы
1. Где установить признак видимости у существующего объекта без проверки на новый объект?
В обработчике ПриЧтенииНаСервере. Этот обработчик вызывается только для существующих объектов, и здесь можно безопасно устанавливать видимость элементов.
2. Во что сериализуется ДанныеФормыКоллекции?
В XML. Все данные формы (включая коллекции) сериализуются в XML для передачи между клиентом и сервером.
3. Какую переменную нужно использовать для обращения на клиенте и на сервере для постоянных значений?
Реквизиты формы. Они доступны и на клиенте, и на сервере, сохраняются на время жизни формы.
4. Переменные модуля формы?
&НаКлиентепеременные: существуют с со здания до закрытия формы, только на клиенте&НаСерверепеременные: существуют только во время выполнения серверной процедуры, уничтожаются после возврата на клиент
5. Параметры формы для чего используются?
- Для создания формы (передача начальных данных)
- Для уникальности формы (ключевые параметры)
- Различают: системные, ключевые (для уникальности), обычные (только при создании)