Переход с обычных форм на управляемые часто вызывает дискомфорт у разработчиков «старой закалки». Основная проблема заключается не в изменении внешнего вида интерфейса, а в кардинальной смене архитектурной парадигмы. Если раньше мы работали в рамках одного процесса, где форма и данные объекта были неразрывно связаны, то в управляемом приложении мы сталкиваемся с жестким разделением на клиентскую и серверную части. В этой статье мы разберем основные концепции, которые позволят вам быстро вникнуть в суть дела и перестать действовать «вслепую».
Первое и самое важное, что нам необходимо осознать: на клиенте в управляемых формах (УФ) объекта не существует. Забудьте о возможности вызвать СправочникОбъект.Записать() прямо из модуля формы. Рассмотрим, как это работает теперь.
Вместо объекта форма оперирует типом ДанныеФормыСтруктура. Это «легкая» проекция данных, которая может отображаться в интерфейсе. Чтобы выполнить привычные действия (провести, записать, рассчитать), нам необходимо передать эти данные на сервер, преобразовать их в объект базы данных, выполнить действие и вернуть результат обратно. Проанализируем этот мост между формой и базой данных:
Для преобразования одного в другое используются специальные методы:
РеквизитФормыВЗначение("Объект") — превращает данные формы в реальный объект на сервере.
ЗначениеВРеквизитФормы(Объект, "Объект") — обновляет данные на форме после манипуляций с объектом.
Разберем по шагам, как управлять контекстом выполнения кода. В управляемом приложении каждая процедура или функция должна быть помечена директивой. От этого зависит скорость работы вашей обработки.
&НаКлиенте. Здесь мы описываем только логику интерфейса: открытие окон, вопросы пользователю, работу с файлами на диске клиента. Доступ к базе данных отсюда закрыт.
&НаСервере. Здесь доступна вся мощь платформы. Однако помните: при вызове серверного метода с клиента передается весь контекст формы. Если в форме много реквизитов и табличных частей, такая передача данных («гоняние пакетов») вызовет те самые тормоза, на которые часто жалуются пользователи.
&НаСервереБезКонтекста. Это наиболее оптимальный вариант для расчетов. В этот метод передаются только те параметры, которые вы явно указали. Контекст формы не передается, что делает вызов максимально быстрым. Выясним на примере, как это выглядит в коде:
&НаКлиенте
Процедура РассчитатьЦену(Команда)
Результат = ПолучитьЦенуНаСервере(Объект.Товар);
Объект.Цена = Результат;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуНаСервере(ТоварСсылка)
Возврат Ценообразование.ПолучитьАктуальнуюЦену(ТоварСсылка);
КонецФункции
В данном примере мы не передаем всю форму на сервер, а отправляем только ссылку на товар, что экономит ресурсы сети и время пользователя.
В управляемых формах мы больше не рисуем интерфейс по пикселям. Мы создаем структуру. Посмотрим на дерево элементов формы: оно состоит из групп, страниц и полей. Система сама решает, как расположить элементы в зависимости от разрешения монитора пользователя или типа клиента (тонкий, веб или мобильный).
Это требует привыкания, но дает огромный плюс: ваши формы автоматически становятся адаптивными. Чтобы сгруппировать элементы, мы используем тип Группа (горизонтальная или вертикальная). Настройка внешнего вида теперь сводится к управлению свойствами этих групп.
Рассмотрим типичную задачу: загрузка товаров из файла. В ОФ мы бы просто открыли диалог и начали чтение. В УФ процесс разделен на этапы из-за клиент-серверной модели:
ЧтениеXLS или ЧтениеТекста).Проанализируем пример кода для помещения файла в хранилище:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
ПараметрыЗагрузки = Новый ПараметрыПередачиФайла;
НачатьПомещениеФайлаНаСервер(Новый ОписаниеОповещения("ПослеЗагрузки", ЭтотОбъект), , , , ПараметрыЗагрузки);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗагрузки(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ОбработатьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
Многие современные конфигурации (УТ 11, ERP) кажутся медленными именно из-за избыточных вызовов сервера с контекстом. Проанализируем ситуацию: если на каждое изменение реквизита в строке табличной части стоит обработчик &НаСервере, форма будет «лагать» при вводе данных. Старайтесь максимально использовать расчеты на клиенте или вызовы БезКонтекста.
Также важно упомянуть БСП (Библиотеку стандартных подсистем). Это фреймворк, на котором построены все типовые решения. Для быстрого освоения не нужно учить ее всю. Достаточно запомнить несколько полезных методов, которые избавляют от написания лишних запросов:
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ИмяРеквизита") — позволяет получить данные, не читая весь объект целиком. Это работает быстрее, чем создание запроса вручную.ОбщегоНазначенияКлиентСервер.СообщитьПользователю() — правильный способ вывода сообщений, привязанных к конкретным полям формы.Если вам нужно быстро вникнуть в суть, не читая многотомные руководства, рекомендуем следующий план действий:
ПриСозданииНаСервере — именно там происходит основная инициализация данных формы.Помните: в управляемых формах 1С вы переходите от программирования «дизайна» к программированию «потоков данных». Как только вы научитесь разделять, что должно происходить в интерфейсе, а что в базе данных, разработка станет для вас такой же простой и быстрой, как в старые времена 7.7 или ОФ 8.2.