Перейти к содержанию
Educora
Средний18 мин7 / 14

Клиент-сервер и управляемые формы

Управляй тем, где выполняется код, с помощью директив компиляции, разберись с элементами, реквизитами и командами управляемой формы, обрабатывай события вроде `ПриСозданииНаСервере` и экономно используй вызовы сервера.

Проверь себя
В этом уроке ты узнаешь
  • Правильно выбирать между &НаКлиенте, &НаСервере и &НаСервереБезКонтекста
  • Различать элементы, реквизиты и команды формы
  • Обрабатывать события формы и строить немодальные диалоги

Лейла открывает документ в браузере в бакинском офисе, а база данных находится на сервере в дата-центре в другом городе. Каждый «разговор» между компьютером Лейлы и сервером занимает время. Поэтому в 1С для каждой процедуры нужно указать, где она выполняется: на клиенте (компьютере пользователя) или на сервере.

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

ДирективаПо-английскиГде выполняетсяДанные формы
&НаКлиенте&AtClientна клиентедоступны
&НаСервере&AtServerна сервере вместе с формойдоступны, но передаются на сервер
&НаСервереБезКонтекста&AtServerNoContextна сервере, только с параметраминедоступны
&НаКлиентеНаСервереБезКонтекста&AtClientAtServerNoContextи на клиенте, и на серверенедоступны

На клиенте можно работать только с интерфейсом. Запросы, объектная модель (Справочники.Товары.СоздатьЭлемент()), ТаблицаЗначений и получение реквизита через точку от ссылки (Товар.Цена) доступны только на сервере. Код, нарушающий это правило, либо не скомпилируется, либо упадёт при выполнении.

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

  • Реквизиты — данные формы. В форме объекта основной реквизит — Объект: Объект.Дата, Объект.Товары.
  • Элементы — то, что видно на экране: поля, таблицы, группы, кнопки. Они привязываются к реквизитам.
  • Команды — действия пользователя; у каждой команды есть процедура Действие.
  • Модуль — код формы: обработчики событий и вспомогательные процедуры, каждая со своей директивой.
  1. 1
    Создай форму

    Открой документ ПриходТовара, на закладке Формы нажми Добавить, выбери Форма документа и Готово. Откроется редактор формы.

  2. 2
    Добавь команду

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

  3. 3
    Подключи событие

    Выдели колонку Товар в таблице и нажми лупу у события ПриИзменении в свойствах — в модуле появится процедура ТоварыТоварПриИзменении.

События формы и вызовы сервера

При открытии формы сначала на сервере срабатывает ПриСозданииНаСервере (здесь читают параметры и готовят данные), затем на клиенте — ПриОткрытии. При записи вызываются ПередЗаписью (клиент) и ПередЗаписьюНаСервере (сервер). В примере ниже при выборе товара его цена получается с сервера.

1C
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Объект.Ссылка.Пустая() Тогда
        Объект.Комментарий = "Создан из формы";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыТоварПриИзменении(Элемент)
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
    ТекущиеДанные.Цена = ЦенаТовара(ТекущиеДанные.Товар);
    ТекущиеДанные.Сумма = ТекущиеДанные.Количество * ТекущиеДанные.Цена;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЦенаТовара(Товар)
    Возврат Товар.Цена;  // через точку от ссылки - только на сервере
КонецФункции
ЦенаТовара — внеконтекстный вызов: на сервер уходит только ссылка, а не вся форма.

Немодальные диалоги

Браузеры не любят модальные окна, поэтому в современных конфигурациях вместо старого Вопрос() используют ПоказатьВопрос(). Ответ приходит в обработчик оповещения, который описывается объектом ОписаниеОповещения; процедура-обработчик должна быть Экспорт.

1C
&НаКлиенте
Процедура Очистить(Команда)
    Оповещение = Новый ОписаниеОповещения("ОчиститьЗавершение", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Очистить табличную часть?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьЗавершение(Ответ, ДополнительныеПараметры) Экспорт
    Если Ответ = КодВозвратаДиалога.Да Тогда
        Объект.Товары.Очистить();
    КонецЕсли;
КонецПроцедуры
ЭтотОбъект — форма, в которой находится обработчик. В новых версиях платформы то же самое можно написать и с помощью слов Асинх и Ждать.

Главное

  • У каждой процедуры формы есть директива: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста.
  • Запросы, объекты, ТаблицаЗначений и обращение через точку от ссылки — только на сервере.
  • Форма = реквизиты (данные) + элементы (вид) + команды (действия) + модуль.
  • ПриСозданииНаСервере срабатывает первым на сервере, ПриОткрытии — затем на клиенте.
  • Сокращай вызовы сервера: не вызывай в цикле, предпочитай внеконтекстные вызовы.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какая директива выполняет код на сервере, не передавая туда данные формы?