Skip to main content

Управляемые формы

Управляемые формы — это не просто новый интерфейс, это другая архитектура разработки с четким разделением клиентской и серверной логики.

Ключевое отличие от обычных форм:

  • Обычные формы → только в толстом клиенте
  • Управляемые формы → во всех клиентах + адаптивный интерфейс

Архитектура и выполнение кода

Модуль формы: клиент-серверная модель

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

Модуль формы работает одновременно на:
├── Клиенте (интерфейс, диалоги)
└── Сервере (бизнес-логика, работа с БД)

Директивы компиляции (ОБЯЗАТЕЛЬНЫ):

ДирективаГде выполняетсяКонтекст формы
&НаКлиентеКлиент✅ Доступен
&НаСервереСервер✅ Доступен
&НаСервереБезКонтекстаСервер❌ Не доступен
&НаКлиентеНаСервереБезКонтекстаКлиент/Сервер❌ Не доступен

Важные правила:

  1. Можно вызывать серверные процедуры из клиентских
  2. НЕЛЬЗЯ вызывать клиентские процедуры из серверных
  3. Без директивы → &НаСервере по умолчанию

Типы данных: два мира

1. Прикладные объекты (только на сервере)

СправочникОбъект.*
ДокументОбъект.*
и т.д.

2. Данные формы (клиент + сервер)

ТипПредставляетПример использования
ДанныеФормыСтруктураПростой объектЭлемент справочника
ДанныеФормыКоллекцияСписокТабличная часть
ДанныеФормыСтруктураСКоллекциейСтруктура + коллекцияНабор записей
ДанныеФормыДеревоИерархияДерево значений

Данные формы – это специальные типы, которые представляют данные прикладных объектов и доступны и на клиенте, и на сервере. Это унифицированное представление для работы в форме.

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

Методы преобразования:

// Глобальные методы
ЗначениеВДанныеФормы() // Объект → Данные формы
ДанныеФормыВЗначение() // Данные формы → Объект

// Методы формы (рекомендуется)
ЗначениеВРеквизитФормы() // Объект → Реквизит формы
РеквизитФормыВЗначение() // Реквизит формы → Объект
  1. Преобразовать данные формы в объект на сервере: РеквизитФормыВЗначение().
  2. Вызвать метод объекта.
  3. Вернуть изменения в форму: ЗначениеВРеквизитФормы().

Важно: Прикладные объекты и методы работы с ними доступны только в серверных методах!

Особенности работы с коллекциями

Ленивая загрузка (порционная передача):

Данные коллекции передаются с сервера на клиент порциями для оптимизации трафика.

Новые порции → только при обращении на клиенте.

Рекомендации для больших коллекций (от 20 строк):

  1. Обход строк → только на сервере
  2. Поиск строк (НайтиСтроки()) → только на сервере

Для больших коллекций всегда используйте явные серверные вызовы для обработки данных, минимизируя таким образом количество обращений к серверу и улучшая производительность формы.

Жизненный цикл формы

События при открытии:

Контекст выполненияМодульСобытиеКогда вызывается
1СерверМодуль менеджераОбработкаПолученияФормыВсегда (первое)
2СерверМодуль менеджераОбработкаПолученияПредставленияТолько для существующих
3СерверМодуль объектаОбработкаЗаполненияТолько для новых
4СерверМодуль объектаПриКопированииПри создании копии
5СерверМодуль формыПриЧтенииНаСервереТолько для существующих
6СерверМодуль формыПриСозданииНаСервереВсегда
7КлиентМодуль формыПриОткрытииВсегда (последнее)

События при закрытии:

  1. Клиент: ПередЗакрытием (можно отменить)

  2. Клиент: ПриЗакрытии (гарантированное закрытие)

Запись документа: полная последовательность

I. ФАЗА ПОДГОТОВКИ (до транзакции)

  1. ПередЗаписью (клиент) - диалог с пользователем
  2. ОбработкаПроверкиЗаполненияНаСервере (сервер, форма)
  3. ОбработкаПроверкиЗаполнения (сервер, объект)
  4. ПередЗаписьюНаСервере (сервер, форма) - заполнение ТекущийОбъект

II. ФАЗА ТРАНЗАКЦИИ

  1. ПередЗаписью (сервер, объект) - главная проверка
  2. ПриУстановкеНовогоНомера (сервер) - автонумерация
  3. ПриЗаписи (сервер, объект) - запись доп. данных (есть ссылка!)
  4. ОбработкаПроведения (сервер) - движения по регистрам
  5. ПриЗаписиНаСервере (сервер, форма) - аналог ПриЗаписи с доступом к форме

III. ФАЗА ЗАВЕРШЕНИЯ (после транзакции)

  1. ПослеЗаписиНаСервере (сервер) - действия при гарантированной записи
  2. ПослеЗаписи (клиент) - обновление интерфейса

Ключевые правила выбора обработчика

ЗадачаГде размещатьПример
Общие проверки при любой записиПередЗаписью (модуль объекта)Проверка условий
Запись доп. данных в транзакцииПриЗаписи (объект)Создание связанных данных
Работа с формой после записиПослеЗаписиНаСервере (форма)Обновление интерфейса
Диалоги с пользователемПередЗапись/ПослеЗаписи (клиент)Запрос подтверждения

Работа с ТекущийОбъект

Где МОЖНО изменять:

  • ПередЗаписьюНаСервере
  • ПриЗаписиНаСервере

Где НЕЛЬЗЯ изменять:

ПослеЗаписиНаСервере → транзакция завершена, изменения потеряются. Только для вызова методов объекта.

📌 Когда появляется ссылка для нового объекта: в методе ПриЗаписиНаСервере

Ответы на ключевые вопросы

1. Где установить признак видимости у существующего объекта без проверки на новый объект?

В обработчике ПриЧтенииНаСервере. Этот обработчик вызывается только для существующих объектов, и здесь можно безопасно устанавливать видимость элементов.

2. Во что сериализуется ДанныеФормыКоллекции?

В XML. Все данные формы (включая коллекции) сериализуются в XML для передачи между клиентом и сервером.

3. Какую переменную нужно использовать для обращения на клиенте и на сервере для постоянных значений?

Реквизиты формы. Они доступны и на клиенте, и на сервере, сохраняются на время жизни формы.

4. Переменные модуля формы?

  • &НаКлиенте переменные: существуют с создания до закрытия формы, только на клиенте
  • &НаСервере переменные: существуют только во время выполнения серверной процедуры, уничтожаются после возврата на клиент

5. Параметры формы для чего используются?

  • Для создания формы (передача начальных данных)
  • Для уникальности формы (ключевые параметры)
  • Различают: системные, ключевые (для уникальности), обычные (только при создании)

6. Мы находимся в обработчике событий "ПриСозданииНаСервере" модуля формы. Необходимо обратиться к реквизиту объекта, который имеет тип "ХранилищеЗначения". Как это сделать?

Использовать РеквизитФормыВЗначение() для преобразования данных формы в прикладной объект, затем работать с его реквизитами.

7. Необходимо создать форму списка, где выводится информация из периодического регистра сведений только самые последние значения на текущую дату. Где и как это можно сделать? Два варианта.

  1. В качестве таблицы динамического списка указать регистр среза последних
  2. В обработчике ПриСозданииНаСервере настроить отбор динамического списка на срез последних

8. На форме есть элемент. Необходимо, чтобы по умолчанию видимость была установлена в "Ложь" и пользователь мог включить видимость в пользовательском режиме через "Еще→Изменить форму". Как это сделать?

Установить свойству "ПользовательскаяВидимость" значение "Истина". Это позволит пользователям управлять видимостью через настройки формы.

9. Есть форма, она открывает вторую форму. Во второй форме мы получаем таблицу значений, необходимо данную таблицу значений передать в первую форму, как это сделать?

С использованием временного хранилища. Сохранить таблицу во временное хранилище во второй форме и при закрытии передать идентификатор в первую форму.

10. В модуле формы поместили во временное хранилище таблицу значений, необходимо, чтобы хранилище было удалено, если форму закроют. Как это сделать?

Указать уникальный идентификатор формы при помещении в хранилище, или использовать обработчик ПриЗакрытии для очистки хранилища.

11. Какие обработчики событий в модуле формы включены в транзакции записи?

ПриЗаписиНаСервере выполняется внутри транзакции записи объекта.

12. Отличия ключевых параметров формы от обычных?

  • Ключевые параметры: существуют все время жизни формы, определяют уникальность формы
  • Обычные параметры: существуют только в момент создания формы
  • Системные параметры: предопределены платформой

13. Какой тип имеет объект на форме?

ДанныеФормыСтруктура — набор свойств произвольного типа, представляющий прикладной объект в форме.

14. Чем отличается Объект от ТекущийОбъект в событиях?

  • Объект: реквизит формы типа ДанныеФормыСтруктура
  • ТекущийОбъект: настоящий прикладной объект (например, СправочникОбъект.Номенклатура)

По обработчикам:

  • ПриЧтенииНаСервере: модифицировать Объект, через ТекущийОбъект вызывать методы
  • ПередЗаписьюНаСервере: модифицировать ТекущийОбъект (будет записан в БД)
  • ПриЗаписиНаСервере: использовать ТекущийОбъект.Ссылка (уже есть), Объект только для сравнения
  • ПослеЗаписиНаСервере: ТекущийОбъект изменять бессмысленно, данные уже в Объект

15. Для чего служит флажок реквизита управляемой формы "Основной реквизит"?

  1. Изменяет поведение формы — стандартные команды работают в контексте типа основного реквизита
  2. Изменяет контекст модуля формы — дополняется свойствами и методами типа основного реквизита

16. Что нужно сделать, чтобы при открытии управляемой формы списка справочника курсор сразу стоял на нужной строке списка?

Передать в параметр "Параметры" метода ОткрытьФорму() структуру: Новый Структура("ТекущаяСтрока", НужнаяСсылка)

17. Как реализовать отображение и поведение поля как гиперссылки в ячейке табличной части управляемой формы?

  1. У нужного элемента установить флаги: "Гиперссылка" и "ГиперссылкаЯчейки"
  2. Обработать нажатие в событии таблицы формы "Выбор"

18. В чем опасность изменения видимости элемента на клиенте?

Изменение видимости может потребовать обращения к серверу для пересчета расположения элементов, что снижает производительность.

19. Для чего используют ключевое слово Знач в параметрах метода?

  1. Оптимизация трафика (главная причина)

    • Параметры с Знач не возвращаются на клиент после серверного выполнения
    • Экономия на двойной сериализации больших объектов
  2. Семантика кода

    • Явно показывает, что параметр входной (только для чтения)
    • Упрощает чтение и понимание кода
  3. Частичная защита

    • Предотвращает замену объекта: Объект = Новый Массив() — не вернется
    • НО не защищает от изменения состояния: Объект.Добавить() — изменения видны

Материалы