При переходе на современные технологии перед разработчиками 1С нередко встает задача: опубликовать старую конфигурацию на обычных (неуправляемых) формах в веб-клиенте. Как известно, обычные формы физически не могут работать в веб-интерфейсе — платформа их просто не отобразит. Единственный рабочий сценарий в этом случае — разработать для веб-пользователей специализированное рабочее место (АРМ) на управляемых формах, а саму конфигурацию запускать в режиме управляемого приложения.
Однако при реализации этого подхода разработчики часто сталкиваются с техническими трудностями: при старте системы открывается пустой рабочий стол, попытки открыть форму стандартными методами вызывают ошибки компиляции, а интерфейс «Такси» перегружает веб-страницу лишними боковыми панелями. В этой статье мы подробно разберем, как решить эти проблемы, правильно настроить запуск АРМ и скрыть ненужные элементы интерфейса.
Типичная ошибка новичков при попытке открыть управляемую форму в модуле управляемого приложения выглядит следующим образом:
Процедура ПриНачалеРаботыСистемы()
Обработки.АРМ_WEB_пользователя.ПолучитьФорму("Форма").Открыть();
КонецПроцедуры
При запуске системы в веб-клиенте программа выдает критический сбой: {МодульУправляемогоПриложения(3,2)}: Переменная не определена (Обработки). Давайте проанализируем ситуацию и разберем, почему так происходит.
Дело в том, что процедура ПриНачалеРаботыСистемы() выполняется на клиенте. В управляемом интерфейсе на стороне клиента менеджеры прикладных объектов (такие как Справочники, Документы, Обработки) недоступны. Контекст клиента максимально облегчен для обеспечения высокой скорости работы в браузере. Попытка обратиться к свойству Обработки приводит к закономерной ошибке компиляции, так как клиент ничего не знает о метаданных конфигурации напрямую.
Также важно помнить, что вы не можете получить форму на сервере (например, вызвав серверный общий модуль) и передать её на клиент. Объект формы не сериализуется и не может пересекать границу «клиент-сервер».
Для открытия управляемых форм на клиенте в платформе 1С предусмотрен специализированный метод ОткрытьФорму(). Этот метод принимает на вход строковое имя формы, инициализирует её создание на сервере и корректно отображает пользователю на клиенте.
Разберем по шагам, как применить это решение. Нам потребуется изменить код в модуле управляемого приложения следующим образом:
Процедура ПриНачалеРаботыСистемы()
// Открываем форму обработки по её полному пути в метаданных
ОткрытьФорму("Обработка.АРМ_WEB_пользователя.Форма.Форма");
КонецПроцедуры
При таком подходе платформа сама берет на себя все клиент-серверные взаимодействия: обращается к серверу, генерирует структуру формы и возвращает её в веб-браузер пользователя. Это простое и надежное решение для быстрого старта.
Хотя вызов ОткрытьФорму() в процедуре ПриНачалеРаботыСистемы() решает задачу, его нельзя назвать идеальным с точки зрения методологии платформы 1С. При таком открытии АРМ запускается как отдельное вспомогательное окно поверх пустого рабочего стола. В веб-клиенте это может приводить к неприятным графическим багам (например, форма может отображаться некорректно по ширине, пока пользователь вручную не изменит размер окна браузера).
Рассмотрим более элегантный способ — назначение формы АРМ в качестве Начальной страницы (Рабочего стола) конфигурации. В этом случае форма будет открываться платформой автоматически, занимая всё доступное пространство экрана, без лишних рамок окон.
Выполним настройку по шагам в Конфигураторе:
АРМ_WEB_пользователя и добавьте её в колонку начальной страницы.ПриНачалеРаботыСистемы().Теперь при авторизации в веб-клиенте пользователь сразу увидит готовое рабочее место, развернутое на весь экран, без каких-либо задержек и графических искажений.
По умолчанию интерфейс «Такси» выводит на экран панель разделов и панель инструментов (меню функций, историю, поиск). Для узкоспециализированного веб-АРМ эти панели только засоряют экранное пространство. Существует два способа убрать левую панель: интерактивный и программный.
Если веб-интерфейс создается для всех пользователей этой базы одинаковым, проще всего отключить панели глобально:
Если база используется одновременно и в тонком клиенте (где панели нужны), и в веб-клиенте (где их нужно скрыть), применим гибкую программную настройку.
Сначала создадим общий модуль. Назовем его, например, РаботаСИнтерфейсомКлиента. В свойствах модуля обязательно установим галочки «Сервер» и «Вызов сервера». Напишем в нем процедуру работы с системным хранилищем настроек:
Процедура СкрытьПанелиДляВебКлиента() Экспорт
// Инициализируем новые пустые настройки интерфейса
Настройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
НастройкиСостава = Новый НастройкиСоставаИнтерфейсаКлиентскогоПриложения;
// Оставляем состав панелей пустым. При необходимости сюда можно добавить,
// например, только верхнюю панель открытых окон:
// НастройкиСостава.Верх.Добавить(Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельОткрытых"));
Настройки.УстановитьСостав(НастройкиСостава);
// Перезаписываем системные настройки интерфейса текущего пользователя
ХранилищеСистемныхНастроек.Сохранить(
"Общее/НастройкиИнтерфейсаКлиентскогоПриложения",
"",
Настройки
);
КонецПроцедуры
Теперь настроим вызов этой процедуры при старте системы. В Модуле управляемого приложения дополним предопределенную процедуру следующим кодом:
Процедура ПриНачалеРаботыСистемы()
#Если ВебКлиент Тогда
// Очищаем состав панелей на сервере
РаботаСИнтерфейсомКлиента.СкрытьПанелиДляВебКлиента();
// Принудительно обновляем интерфейс текущего сеанса на клиенте
ОбновитьИнтерфейс();
#КонецЕсли
КонецПроцедуры
Важное примечание: Если в вашей конфигурации используется БСП (Библиотека стандартных подсистем), она может автоматически переопределять и сбрасывать настройки интерфейса при первом входе нового пользователя. В таком случае программное управление составом панелей следует внедрять в общий модуль ПользователиПереопределяемый в процедуру ПриУстановкеНачальныхНастроек.
Используя предложенные методики, мы получаем полностью готовое к работе, быстрое и чистое веб-пространство для пользователей конфигурации на обычных формах.