При переходе с обычных форм (например, 1С 8.1 или Альфа-Авто 4.1) на управляемые формы 1С 8.3 программисты часто сталкиваются с проблемой: переменные, в которых раньше хранились COM-объекты (например, V83.COMConnector для связи с другой базой), внезапно становятся Неопределено. В этой статье мы разберем, почему старые методы больше не работают, и как правильно организовать работу с внешними соединениями в современной архитектуре «1С:Предприятие».
Рассмотрим ситуацию, описанную в вопросе: разработчик пытается сохранить соединение в модуле управляемого приложения. В режиме управляемых форм клиент и сервер — это два разных процесса, которые могут физически находиться на разных компьютерах. Клиентские переменные на сервере не видны, и наоборот. Когда мы вызываем серверную процедуру из модуля формы, контекст клиентского приложения (где была инициализирована переменная) становится недоступен.
Более того, в управляемом приложении серверные переменные модулей (например, модуля объекта или общего модуля) живут ровно столько, сколько длится один серверный вызов. Как только управление возвращается на клиент, всё, что было создано в памяти сервера, уничтожается.
Часто возникает идея «обмануть» систему и поместить COM-объект во временное хранилище или параметр сеанса. Проанализируем, почему это не сработает. Для того чтобы данные могли быть переданы в ПоместитьВоВременноеХранилище или сохранены в базе, они должны быть сериализуемыми. Сериализация — это процесс превращения живого объекта в памяти в последовательность байтов.
Важный технический нюанс: COM-объект — это не данные, а указатель на область памяти в операционной системе Windows. Платформа 1С не может превратить этот «живой» указатель в байты и восстановить его позже. При попытке поместить COMОбъект напрямую или даже внутри Структуры во временное хранилище, вы получите ошибку или значение Неопределено при попытке получения.
Это самый эффективный и рекомендуемый способ кэширования соединений на стороне сервера. Мы воспользуемся механизмом платформы, который специально создан для хранения результатов «тяжелых» операций в памяти сеанса.
Выполним следующие шаги:
ВнешниеСоединенияСервер).Рассмотрим пример кода для такого модуля:
Функция ПолучитьСоединениеСБазойИП() Экспорт
Параметры = "File=""C:\Bases\IP"";Usr=""Admin"";";
Соединитель = Новый COMОбъект("V83.COMConnector");
Попытка
Возврат Соединитель.Connect(Параметры);
Исключение
ЗаписьЖурналаРегистрации("ВнешнееСоединение", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Как это работает: При первом вызове функции ПолучитьСоединениеСБазойИП() 1С создаст COM-объект и установит связь. Платформа запомнит этот объект в специальном кэше. При всех последующих вызовах в рамках того же сеанса пользователя 1С не будет выполнять код внутри функции, а сразу вернет уже готовое соединение из памяти. Это значительно экономит время на авторизацию в удаленной базе.
Если ваша задача — хранить объект для работы с торговым оборудованием (например, фискальным регистратором или сканером), то серверное хранение вам категорически не подходит. Сервер 1С (процесс rphost) обычно работает под технической учетной записью и не имеет доступа к USB или COM-портам локального компьютера пользователя.
В этом случае необходимо использовать переменные в Модуле управляемого приложения с ключевым словом Экспорт или переменные клиентского общего модуля. В управляемом приложении (на клиенте) такие переменные живут всё время, пока открыта программа, и не очищаются между вызовами команд.
Как отмечалось в обсуждении, использование COM-технологий постепенно уходит в прошлое. Основные причины:
COM+.Проанализируем альтернативу: вместо прямого подключения к базе через COM, настройте в базе-приемнике HTTP-сервис. Платформа 1С 8.3 умеет автоматически кэшировать HTTP-соединения на низком уровне. Вам не нужно будет беспокоиться о хранении глобальных переменных — повторные запросы по тому же адресу будут проходить мгновенно. Это гораздо надежнее и масштабируемее для крупных систем.
Чтобы успешно работать с внешними объектами в 1С 8.3, придерживайтесь следующих правил:
COM-объекты между клиентом и сервером через временное хранилище — они не сериализуются.