20 KiB
sidebar_position, sidebar_label, title
| sidebar_position | sidebar_label | title |
|---|---|---|
| 2 | Управляемые формы | Управляемые формы |
Управляемые формы
🎯 Суть
Управляемые формы — это не просто новый интерфейс, это другая архитектура разработки с четким разделением клиентской и серверной логики.
Ключевое отличие от обычных форм:
- Обычные формы → только в толстом клиенте
- Управляемые формы → во всех клиентах + адаптивный интерфейс
🏗️ Архитектура и выполнение кода
Модуль формы: клиент-серверная модель
Каждая управляемая форма имеет собственный модуль, который выполняется и на клиенте, и на сервере. Для указания места выполнения используются директивы компиляции.
Модуль формы работает одновременно на:
├── Клиенте (интерфейс, диалоги)
└── Сервере (бизнес-логика, работа с БД)
Директивы компиляции (ОБЯЗАТЕЛЬНЫ):
| Директива | Где выполняется | Контекст формы |
|---|---|---|
&НаКлиенте |
Клиент | ✅ Доступен |
&НаСервере |
Сервер | ✅ Доступен |
&НаСервереБезКонтекста |
Сервер | ❌ Не доступен |
&НаКлиентеНаСервереБезКонтекста |
Клиент/Сервер | ❌ Не доступен |
Важные правила:
- Можно вызывать серверные процедуры из клиентских
- НЕЛЬЗЯ вызывать клиентские процедуры из серверных
- Без директивы →
&НаСерверепо умолчанию
🔄 Типы данных: два мира
1. Прикладные объекты (только на сервере)
СправочникОбъект.*
ДокументОбъект.*
и т.д.
2. Данные формы (клиент + сервер)
| Тип | Представляет | Пример использования |
|---|---|---|
ДанныеФормыСтруктура |
Простой объект | Элемент справочника |
ДанныеФормыКоллекция |
Список | Табличная часть |
ДанныеФормыСтруктураСКоллекцией |
Структура + коллекция | Набор записей |
ДанныеФормыДерево |
Иерархия | Дерево значений |
Данные формы – это специальные типы, которые представляют данные прикладных объектов и доступны и на клиенте, и на сервере. Это унифицированное представление для работы в форме.
В контексте формы недоступны методы и свойства основного объекта (например, справочника или документа). Для работы с ними необходимо использовать специальные методы:
Методы преобразования:
// Глобальные методы
ЗначениеВДанныеФормы() // Объект → Данные формы
ДанныеФормыВЗначение() // Данные формы → Объект
// Методы формы (рекомендуется)
ЗначениеВРеквизитФормы() // Объект → Реквизит формы
РеквизитФормыВЗначение() // Реквизит формы → Объект
- Преобразовать данные формы в объект на сервере:
РеквизитФормыВЗначение(). - Вызвать метод объекта.
- Вернуть изменения в форму:
ЗначениеВРеквизитФормы().
Важно: Прикладные объекты и методы работы с ними доступны только в серверных методах!
⚡ Особенности работы с коллекциями
Ленивая загрузка (порционная передача):
Данные коллекции передаются с сервера на клиент порциями для оптимизации трафика.
Новые порции → только при обращении на клиенте.
Рекомендации для больших коллекций (от 20 строк):
- Обход строк → только на сервере
- Поиск строк (
НайтиСтроки()) → только на сервере
Для больших коллекций всегда используйте явные серверные вызовы для обработки данных, минимизируя таким образом количество обращений к серверу и улучшая производительность формы.
📝 Жизненный цикл формы
События при открытии:
| № | Контекст выполнения | Модуль | Событие | Когда вызывается |
|---|---|---|---|---|
| 1 | Сервер | Модуль менеджера | ОбработкаПолученияФормы |
Всегда (первое) |
| 2 | Сервер | Модуль менеджера | ОбработкаПолученияПредставления |
Только для существующих |
| 3 | Сервер | Модуль объекта | ОбработкаЗаполнения |
Только для новых |
| 4 | Сервер | Модуль объекта | ПриКопировании |
При создании копии |
| 5 | Сервер | Модуль формы | ПриЧтенииНаСервере |
Только для существующих |
| 6 | Сервер | Модуль формы | ПриСозданииНаСервере |
Всегда |
| 7 | Клиент | Модуль формы | ПриОткрытии |
Всегда (последнее) |
События при закрытии:
-
Клиент: ПередЗакрытием (можно отменить)
-
Клиент: ПриЗакрытии (гарантированное закрытие)
💾 Запись документа: полная последовательность
I. ФАЗА ПОДГОТОВКИ (до транзакции)
ПередЗаписью(клиент) - диалог с пользователемОбработкаПроверкиЗаполненияНаСервере(сервер, форма)ОбработкаПроверкиЗаполнения(сервер, объект)ПередЗаписьюНаСервере(сервер, форма) - заполнениеТекущийОбъект
II. ФАЗА ТРАНЗАКЦИИ
ПередЗаписью(сервер, объект) - главная проверкаПриУстановкеНовогоНомера(сервер) - автонумерацияПриЗаписи(сервер, объект) - запись доп. данных (есть ссылка!)ОбработкаПроведения(сервер) - движения по регистрамПриЗаписиНаСервере(сервер, форма) - аналогПриЗаписис доступом к форме
III. ФАЗА ЗАВЕРШЕНИЯ (после транзакции)
ПослеЗаписиНаСервере(сервер) - действия при гарантированной записиПослеЗаписи(клиент) - обновление интерфейса
🎯 Ключевые правила выбора обработчика
| Задача | Где размещать | Пример |
|---|---|---|
| Общие проверки при любой записи | ПередЗаписью (модуль объекта) |
Проверка условий |
| Запись доп. данных в транзакции | ПриЗаписи (объект) |
Создание связанных данных |
| Работа с формой после записи | ПослеЗаписиНаСервере (форма) |
Обновление интерфейса |
| Диалоги с пользователем | ПередЗапись/ПослеЗаписи (клиент) |
Запрос подтверждения |
🔧 Работа с ТекущийОбъект
✅ Где МОЖНО изменять:
- ПередЗаписьюНаСервере
- ПриЗаписиНаСервере
❌ Где НЕЛЬЗЯ изменять:
ПослеЗаписиНаСервере → транзакция завершена, изменения потеряются. Только для вызова методов объекта.
📌 Когда появляется ссылка для нового объекта: в методе ПриЗаписиНаСервере
⚡ Ответы на ключевые вопросы
1. Где установить признак видимости у существующего объекта без проверки на новый объект?
Ответ: В обработчике ПриЧтенииНаСервере. Этот обработчик вызывается только для существующих объектов, и здесь можно безопасно устанавливать видимость элементов.
2. Во что сериализуется ДанныеФормыКоллекции?
Ответ: В XML. Все данные формы (включая коллекции) сериализуются в XML для передачи между клиентом и сервером.
3. Какую переменную нужно использовать для обращения на клиенте и на сервере для постоянных значений?
Ответ: Реквизиты формы. Они доступны и на клиенте, и на сервере, сохраняются на время жизни формы.
4. Переменные модуля формы?
Ответ:
&НаКлиентепеременные: существуют с создания до закрытия формы, только на клиенте&НаСерверепеременные: существуют только во время выполнения серверной процедуры, уничтожаются после возврата на клиент
5. Параметры формы для чего используются?
Ответ:
- Для создания формы (передача начальных данных)
- Для уникальности формы (ключевые параметры)
- Различают: системные, ключевые (для уникальности), обычные (только при создании)
6. Мы находимся в обработчике событий "ПриСозданииНаСервере" модуля формы. Необходимо обратиться к реквизиту объекта, который имеет тип "ХранилищеЗначения". Как это сделать?
Ответ: Использовать РеквизитФормыВЗначение() для преобразования данных формы в прикладной объект, затем работать с его реквизитами.
7. Необходимо создать форму списка, где выводится информация из периодического регистра сведений только самые последние значения на текущую дату. Где и как это можно сделать? Два варианта.
Ответ:
- В качестве таблицы динамического списка указать регистр среза последних
- В обработчике
ПриСозданииНаСерверенастроить отбор динамического списка на срез последних
8. На форме есть элемент. Необходимо, чтобы по умолчанию видимость была установлена в "Ложь" и пользователь мог включить видимость в пользовательском режиме через "Еще→Изменить форму". Как это сделать?
Ответ: Установить свойству "ПользовательскаяВидимость" значение "Истина". Это позволит пользователям управлять видимостью через настройки формы.
9. Есть форма, она открывает вторую форму. Во второй форме мы получаем таблицу значений, необходимо данную таблицу значений передать в первую форму, как это сделать?
Ответ: С использованием временного хранилища. Сохранить таблицу во временное хранилище во второй форме и при закрытии передать идентификатор в первую форму.
10. В модуле формы поместили во временное хранилище таблицу значений, необходимо, чтобы хранилище было удалено, если форму закроют. Как это сделать?
Ответ: Указать уникальный идентификатор формы при помещении в хранилище, или использовать обработчик ПриЗакрытии для очистки хранилища.
11. Какие обработчики событий в модуле формы включены в транзакции записи?
Ответ: ПриЗаписиНаСервере выполняется внутри транзакции записи объекта.
12. Отличия ключевых параметров формы от обычных?
Ответ:
- Ключевые параметры: существуют все время жизни формы, определяют уникальность формы
- Обычные параметры: существуют только в момент создания формы
- Системные параметры: предопределены платформой
13. Какой тип имеет объект на форме?
Ответ: ДанныеФормыСтруктура — набор свойств произвольного типа, представляющий прикладной объект в форме.
14. Чем отличается Объект от ТекущийОбъект в событиях?
Ответ:
- Объект: реквизит формы типа
ДанныеФормыСтруктура - ТекущийОбъект: настоящий прикладной объект (например,
СправочникОбъект.Номенклатура)
По обработчикам:
ПриЧтенииНаСервере: модифицироватьОбъект, черезТекущийОбъектвызывать методыПередЗаписьюНаСервере: модифицироватьТекущийОбъект(будет записан в БД)ПриЗаписиНаСервере: использоватьТекущийОбъект.Ссылка(уже есть),Объекттолько для сравненияПослеЗаписиНаСервере:ТекущийОбъектизменять бессмысленно, данные уже вОбъект
15. Для чего служит флажок реквизита управляемой формы "Основной реквизит"?
Ответ:
- Изменяет поведение формы — стандартные команды работают в контексте типа основного реквизита
- Изменяет контекст модуля формы — дополняется свойствами и методами типа основного реквизита
16. Что нужно сделать, чтобы при открытии управляемой формы списка справочника курсор сразу стоял на нужной строке списка?
Ответ: Передать в параметр "Параметры" метода ОткрытьФорму() структуру: Новый Структура("ТекущаяСтрока", НужнаяСсылка)
17. Как реализовать отображение и поведение поля как гиперссылки в ячейке табличной части управляемой формы?
Ответ:
- У нужного элемента установить флаги: "Гиперссылка" и "ГиперссылкаЯчейки"
- Обработать нажатие в событии таблицы формы "Выбор"
18. В чем опасность изменения видимости элемента на клиенте?
Ответ: Изменение видимости может потребовать обращения к серверу для пересчета расположения элементов, что снижает производительность.
19. Для чего используют ключевое слово Знач в параметрах метода?
1. Оптимизация трафика (главная причина)
- Параметры с
Значне возвращаются на клиент после серверного выполнения - Экономия на двойной сериализации больших объектов
2. Семантика кода
- Явно показывает, что параметр входной (только для чтения)
- Упрощает чтение и понимание кода
3. Частичная защита
- Предотвращает замену объекта:
Объект = Новый Массив()— не вернется - НО не защищает от изменения состояния:
Объект.Добавить()— изменения видны