Перейти к основному содержимому

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

Разработчику
Загрузка эмулятора 1С…

Зачем нужны управляемые формы

Управляемая форма — основной способ показать пользователю данные и принять ввод в современных конфигурациях на платформе 8.3. Форма связывает реквизиты (данные) с элементами (поля, кнопки, таблицы) и командами (действия пользователя).

Код формы выполняется в двух контекстах:

  • Клиент — интерфейс, реакция на клики, лёгкая валидация;
  • Сервер — работа с базой, тяжёлые вычисления, запросы.

Разделение контекстов — центральная тема разработки под тонким и веб-клиентом.


Конструирование формы

Реквизиты формы

Реквизит — переменная формы с типом. Реквизиты бывают:

  • Основной — объект, который редактирует форма (документ, элемент справочника, обработка);
  • Дополнительные — служебные данные (фильтры, флаги, ТаблицаЗначений для списка на форме).

Реквизиты создаются в редакторе формы или программно. Имена реквизитов используются в выражениях элементов (Объект.Контрагент, СписокОтбора).

Элементы формы

ЭлементНазначение
Поле вводаРедактирование реквизита
Поле надписиТолько отображение
Поле флажка / переключателяБулево, выбор из вариантов
КнопкаВызов команды
Группа, страницыКомпоновка интерфейса
ТаблицаОтображение ТаблицаЗначений или табличной части
ДекорацияЗаголовки, отступы

Элемент привязывается к пути к данным — строке вида Объект.Реквизит или СписокСтрок.Колонка.

Команды

Команда — именованное действие формы или конфигурации.

  • Локальные — только на этой форме (ВыполнитьРасчёт);
  • Глобальные — из метаданных (стандартные «Записать», «Провести» или добавленные вручную).

Обработчик команды — процедура в модуле формы, обычно с директивой &НаКлиенте.


Клиент и сервер

Директивы компиляции

Перед процедурой или функцией указывают, где будет выполняться код:

&НаКлиенте
Процедура Рассчитать(Команда)
Если НЕ ЗначениеЗаполнено(Объект.Количество) Тогда
Предупреждение("Укажите количество");
Возврат;
КонецЕсли;
Сумма = РассчитатьНаСервере(Объект.Количество, Объект.Цена);
Объект.Сумма = Сумма;
КонецПроцедуры

&НаСервере
Функция РассчитатьНаСервере(Количество, Цена)
Возврат Количество * Цена;
КонецФункции
ДирективаГде выполняетсяТипичные задачи
&НаКлиентеКлиентское приложениеКлики, диалоги, обновление формы
&НаСервереСервер 1СЗапросы, запись в БД, ТаблицаЗначений
&НаСервереБезКонтекстаСервер без привязки к формеОбщие расчёты без доступа к Объект формы

Тонкий и веб-клиент
На клиенте нельзя напрямую обращаться к базе и создавать ТаблицаЗначений. Любая работа с данными — через серверную процедуру или запрос на сервере. Подробнее — в таблицах значений.

Вызов сервера с клиента

Клиентская процедура вызывает серверную по имени. Платформа сериализует параметры, выполняет серверный код и возвращает результат. Ссылочные типы (СправочникСсылка, ДокументОбъект) передаются по правилам платформы — лишние обращения к серверу замедляют форму.

Паттерн: короткий обработчик на клиенте → один вызов сервера → обновление реквизитов формы.


События формы

Частые обработчики в модуле формы:

СобытиеКогда срабатывает
ПриСозданииНаСервереФорма создаётся, можно заполнить реквизиты по умолчанию
ПриОткрытииФорма показана пользователю (клиент)
ПередЗаписью / ПослеЗаписиСохранение объекта
ПриИзменении (элемента)Пользователь изменил поле

Тяжёлую инициализацию (запросы, заполнение таблиц) размещайте в ПриСозданииНаСервере, а не в клиентских обработчиках.


Открытие формы из кода

// Существующий объект
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", Новый Структура("Ключ", СсылкаНаТовар));

// Новый объект
Параметры = Новый Структура;
Параметры.Вставить("ЗначенияЗаполнения", Новый Структура("Наименование", "Новый товар"));
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", Параметры);

Параметры формы передаются вторым аргументом; в модуле формы их читают в ПриСозданииНаСервере через Параметры.Свойство("Имя", Значение).


Типичные ошибки

СимптомПричинаЧто сделать
«Объект недоступен на клиенте»Запрос или запись в &НаКлиентеПеренести код в &НаСервере
Форма «зависает»Длинный цикл или запрос на клиентеСервер + индикатор или фоновое задание
Данные на форме не обновляютсяИзменили объект на сервере без возврата на клиентВернуть значения или перечитать объект
Команда не виднаНе добавлена в командный интерфейс формыПроверить «Командный интерфейс» в редакторе

Связанные материалы


Практика 15 минут

  1. Создайте внешнюю обработку с управляемой формой.
  2. Добавьте реквизит Число и кнопку «Удвоить».
  3. В &НаКлиенте вызовите &НаСервере функцию, которая умножает число на 2.
  4. Выведите результат через Сообщить или поле на форме.
  5. Поставьте точку останова в конфигураторе и пройдите вызов клиент → сервер.

Лаборатория — форма документа (60 минут)

Выполняйте после мини-склада, когда есть документ ПоступлениеТоваров.

ЭтапДействие
1Откройте форму документа → добавьте команду «Пересчитать сумму»
2&НаКлиенте — обработчик вызывает ПересчитатьСуммуНаСервере()
3&НаСервере — цикл по Объект.Товары, сумма в реквизит Объект.СуммаДокумента (добавьте реквизит)
4При изменении Количество в ТЧ — подписка ТоварыКоличествоПриИзменении на клиенте с тем же вызовом
5Добавьте ПередЗаписью на сервере — запрет записи при пустой ТЧ

Критерий: при изменении количества сумма на форме обновляется без записи документа; при пустых строках запись блокируется с сообщением.

Параметры при открытии

В общей форме списка документов добавьте команду «Создать копию» — открытие с параметром:

&НаКлиенте
Процедура СоздатьКопию(Команда)
Параметры = Новый Структура("ЗначенияЗаполнения", Новый Структура("Склад", Объект.Склад));
ОткрытьФорму("Документ.ПоступлениеТоваров.ФормаОбъекта", Параметры);
КонецПроцедуры

Проверка себя

  • Чем реквизит формы отличается от реквизита объекта метаданных?
  • Когда нужна директива &НаСервереБезКонтекста?
  • Почему запрос в обработчике ПриНажатии на клиенте вызовет ошибку в тонком клиенте?

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").