- Правильно выбирать между
&НаКлиенте,&НаСервереи&НаСервереБезКонтекста - Различать элементы, реквизиты и команды формы
- Обрабатывать события формы и строить немодальные диалоги
Лейла открывает документ в браузере в бакинском офисе, а база данных находится на сервере в дата-центре в другом городе. Каждый «разговор» между компьютером Лейлы и сервером занимает время. Поэтому в 1С для каждой процедуры нужно указать, где она выполняется: на клиенте (компьютере пользователя) или на сервере.
Директивы компиляции
| Директива | По-английски | Где выполняется | Данные формы |
|---|---|---|---|
&НаКлиенте | &AtClient | на клиенте | доступны |
&НаСервере | &AtServer | на сервере вместе с формой | доступны, но передаются на сервер |
&НаСервереБезКонтекста | &AtServerNoContext | на сервере, только с параметрами | недоступны |
&НаКлиентеНаСервереБезКонтекста | &AtClientAtServerNoContext | и на клиенте, и на сервере | недоступны |
На клиенте можно работать только с интерфейсом. Запросы, объектная модель (Справочники.Товары.СоздатьЭлемент()), ТаблицаЗначений и получение реквизита через точку от ссылки (Товар.Цена) доступны только на сервере. Код, нарушающий это правило, либо не скомпилируется, либо упадёт при выполнении.
Как устроена управляемая форма
- Реквизиты — данные формы. В форме объекта основной реквизит —
Объект:Объект.Дата,Объект.Товары. - Элементы — то, что видно на экране: поля, таблицы, группы, кнопки. Они привязываются к реквизитам.
- Команды — действия пользователя; у каждой команды есть процедура Действие.
- Модуль — код формы: обработчики событий и вспомогательные процедуры, каждая со своей директивой.
- 1Создай форму
Открой документ
ПриходТовара, на закладкеФормынажмиДобавить, выбериФорма документаиГотово. Откроется редактор формы. - 2Добавь команду
На закладке
Командысоздай новую команду (например,Очистить), кнопкой-лупой у свойстваДействиесоздай обработчик, затем перетащи команду мышью в командную панель формы. - 3Подключи событие
Выдели колонку
Товарв таблице и нажми лупу у событияПриИзменениив свойствах — в модуле появится процедураТоварыТоварПриИзменении.
События формы и вызовы сервера
При открытии формы сначала на сервере срабатывает ПриСозданииНаСервере (здесь читают параметры и готовят данные), затем на клиенте — ПриОткрытии. При записи вызываются ПередЗаписью (клиент) и ПередЗаписьюНаСервере (сервер). В примере ниже при выборе товара его цена получается с сервера.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.Комментарий = "Создан из формы";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыТоварПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТекущиеДанные.Цена = ЦенаТовара(ТекущиеДанные.Товар);
ТекущиеДанные.Сумма = ТекущиеДанные.Количество * ТекущиеДанные.Цена;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЦенаТовара(Товар)
Возврат Товар.Цена; // через точку от ссылки - только на сервере
КонецФункцииЦенаТовара — внеконтекстный вызов: на сервер уходит только ссылка, а не вся форма.Немодальные диалоги
Браузеры не любят модальные окна, поэтому в современных конфигурациях вместо старого Вопрос() используют ПоказатьВопрос(). Ответ приходит в обработчик оповещения, который описывается объектом ОписаниеОповещения; процедура-обработчик должна быть Экспорт.
&НаКлиенте
Процедура Очистить(Команда)
Оповещение = Новый ОписаниеОповещения("ОчиститьЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Очистить табличную часть?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецПроцедурыЭтотОбъект — форма, в которой находится обработчик. В новых версиях платформы то же самое можно написать и с помощью слов Асинх и Ждать.Главное
- У каждой процедуры формы есть директива:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекста. - Запросы, объекты,
ТаблицаЗначенийи обращение через точку от ссылки — только на сервере. - Форма = реквизиты (данные) + элементы (вид) + команды (действия) + модуль.
ПриСозданииНаСервересрабатывает первым на сервере,ПриОткрытии— затем на клиенте.- Сокращай вызовы сервера: не вызывай в цикле, предпочитай внеконтекстные вызовы.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.