Урок по треку Разработка на 1С 6 мин

Клиент, сервер и контекст исполнения

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

Управляемое приложение рассчитано на тонкий клиент и веб-клиент, которые работают через интернет и не имеют доступа к базе. Поэтому код делится на клиентский и серверный. Ошибки контекста самые частые у джунов, и их проверяют на любом собесе.

Архитектура

  • Клиенты: тонкий, веб, мобильный, толстый (для обычных форм).
  • Кластер серверов 1С: процессы ragent, rmngr, rphost. Код выполняется в рабочих процессах rphost.
  • СУБД: MS SQL Server, PostgreSQL, Oracle, IBM Db2. Файловый вариант хранит базу в файле 1Cv8.1CD.

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

  • &НаКлиенте: интерфейс, данные формы, без доступа к базе.
  • &НаСервере: сервер, доступна форма (данные передаются с клиента и обратно).
  • &НаСервереБезКонтекста: сервер без данных формы, только параметры. Быстрее.
  • &НаКлиентеНаСервереБезКонтекста: компилируется в обоих контекстах, без формы и без базы. Для чистых вычислений.

Метод без директивы в модуле формы считается серверным.

Что недоступно на клиенте

  • Запросы, менеджеры (Справочники, Документы), объекты (СправочникОбъект).
  • Чтение реквизитов ссылки через точку: Объект.Контрагент.ИНН на клиенте не работает.
  • ТаблицаЗначений (в форме вместо неё ДанныеФормыКоллекция).

Ссылку на клиент передать можно, а её реквизиты нужно получить на сервере.

&НаКлиенте
Процедура КодПриИзменении(Элемент)
	Объект.Номенклатура = НайтиПоКоду(Код);
КонецПроцедуры

&НаСервереБезКонтекста
Функция НайтиПоКоду(Код)
	Возврат Справочники.Номенклатура.НайтиПоКоду(Код);
КонецФункции

Цена серверного вызова

Каждый вызов это круг по сети, а &НаСервере ещё и передаёт данные формы. Правила:

  • считать на клиенте то, что можно (сумма строки = цена × количество);
  • объединять несколько вызовов в один;
  • использовать без контекста, если форма не нужна;
  • настраивать форму в ПриСозданииНаСервере, а не в ПриОткрытии с дополнительным вызовом.

Общие модули

Флаги: Глобальный, Клиент (управляемое приложение), Клиент (обычное приложение), Сервер, Внешнее соединение, Вызов сервера, Привилегированный. Серверный модуль без флага «Вызов сервера» с клиента не вызвать. Флаг «Вызов сервера» не совмещается с клиентскими.

Стандарт именования: ОбщийМодульКлиент, ОбщийМодульСервер, ОбщийМодульВызовСервера, ОбщийМодульКлиентСервер, ОбщийМодульПовтИсп.

Повторное использование возвращаемых значений (на время вызова или сеанса) кеширует результат. Возвращать нужно фиксированные коллекции: иначе вызывающий изменит закешированное значение.

Модальность и асинхронность

В режиме «Не использовать модальность» Вопрос() и Предупреждение() вызывают ошибку. Используют ПоказатьВопрос с ОписаниеОповещения или, с платформы 8.3.18, Асинх и Ждать:

&НаКлиенте
Асинх Процедура Удалить(Команда)
	Ответ = Ждать ВопросАсинх("Удалить строку?", РежимДиалогаВопрос.ДаНет);
	Если Ответ = КодВозвратаДиалога.Да Тогда
		УдалитьНаСервере();
	КонецЕсли;
КонецПроцедуры

Даты

ТекущаяДата() на клиенте берёт часы компьютера пользователя. В прикладной логике на сервере используют ТекущаяДатаСеанса().

Частые ошибки

  • Справочники.X на клиенте.
  • Объект в процедуре без контекста.
  • Три серверных вызова подряд в одном обработчике.
  • Изменяемая структура из модуля с повторным использованием.

Что спросят на собесе

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

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.