Управляемое приложение рассчитано на тонкий клиент и веб-клиент, которые работают через интернет и не имеют доступа к базе. Поэтому код делится на клиентский и серверный. Ошибки контекста самые частые у джунов, и их проверяют на любом собесе.
Архитектура
- Клиенты: тонкий, веб, мобильный, толстый (для обычных форм).
- Кластер серверов 1С: процессы ragent, rmngr, rphost. Код выполняется в рабочих процессах rphost.
- СУБД: MS SQL Server, PostgreSQL, Oracle, IBM Db2. Файловый вариант хранит базу в файле 1Cv8.1CD.
Директивы компиляции в модуле формы
&НаКлиенте: интерфейс, данные формы, без доступа к базе.&НаСервере: сервер, доступна форма (данные передаются с клиента и обратно).&НаСервереБезКонтекста: сервер без данных формы, только параметры. Быстрее.&НаКлиентеНаСервереБезКонтекста: компилируется в обоих контекстах, без формы и без базы. Для чистых вычислений.
Метод без директивы в модуле формы считается серверным.
Что недоступно на клиенте
- Запросы, менеджеры (Справочники, Документы), объекты (СправочникОбъект).
- Чтение реквизитов ссылки через точку:
Объект.Контрагент.ИННна клиенте не работает. - ТаблицаЗначений (в форме вместо неё ДанныеФормыКоллекция).
Ссылку на клиент передать можно, а её реквизиты нужно получить на сервере.
&НаКлиенте
Процедура КодПриИзменении(Элемент)
Объект.Номенклатура = НайтиПоКоду(Код);
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиПоКоду(Код)
Возврат Справочники.Номенклатура.НайтиПоКоду(Код);
КонецФункции
Цена серверного вызова
Каждый вызов это круг по сети, а &НаСервере ещё и передаёт данные формы. Правила:
- считать на клиенте то, что можно (сумма строки = цена × количество);
- объединять несколько вызовов в один;
- использовать без контекста, если форма не нужна;
- настраивать форму в ПриСозданииНаСервере, а не в ПриОткрытии с дополнительным вызовом.
Общие модули
Флаги: Глобальный, Клиент (управляемое приложение), Клиент (обычное приложение), Сервер, Внешнее соединение, Вызов сервера, Привилегированный. Серверный модуль без флага «Вызов сервера» с клиента не вызвать. Флаг «Вызов сервера» не совмещается с клиентскими.
Стандарт именования: ОбщийМодульКлиент, ОбщийМодульСервер, ОбщийМодульВызовСервера, ОбщийМодульКлиентСервер, ОбщийМодульПовтИсп.
Повторное использование возвращаемых значений (на время вызова или сеанса) кеширует результат. Возвращать нужно фиксированные коллекции: иначе вызывающий изменит закешированное значение.
Модальность и асинхронность
В режиме «Не использовать модальность» Вопрос() и Предупреждение() вызывают ошибку. Используют ПоказатьВопрос с ОписаниеОповещения или, с платформы 8.3.18, Асинх и Ждать:
&НаКлиенте
Асинх Процедура Удалить(Команда)
Ответ = Ждать ВопросАсинх("Удалить строку?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
УдалитьНаСервере();
КонецЕсли;
КонецПроцедуры
Даты
ТекущаяДата() на клиенте берёт часы компьютера пользователя. В прикладной логике на сервере используют ТекущаяДатаСеанса().
Частые ошибки
- Справочники.X на клиенте.
- Объект в процедуре без контекста.
- Три серверных вызова подряд в одном обработчике.
- Изменяемая структура из модуля с повторным использованием.
Что спросят на собесе
- Чем &НаСервере отличается от &НаСервереБезКонтекста?
- Почему нельзя прочитать реквизит ссылки на клиенте?
- Какие флаги бывают у общих модулей?
- Как уменьшить число серверных вызовов?
- Как задать вопрос пользователю без модальности?