Как правильно настроить выполнение функции на сервере в обычном приложении 1С при COM-подключении к файловой базе

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При переводе файловой базы обычного приложения (например, 1С:Управление торговлей 10.3) в клиент-серверный режим (SQL) разработчики нередко сталкиваются с ошибками интеграции. Ситуация часто выглядит так: ранее все пользователи работали в терминальном доступе на одном сервере, и функции COM-подключения спокойно обращались к файловым путям вида D:\Base. После перехода на клиент-серверный вариант и прямого подключения пользователей с локальных компьютеров код перестает работать, так как локальный ПК клиента не имеет прямого доступа к диску сервера.

Попытка решить проблему «в лоб» добавлением директивы &НаСервере перед функцией в общем модуле обычного приложения приводит к ошибке «Метод объекта не обнаружен». Разберем детально, почему это происходит, как устроена модель выполнения кода в обычном приложении и как грамотно перенести подключение к файловой базе на сторону сервера 1С.

Почему возникает ошибка «Метод объекта не обнаружен»

Проанализируем механику работы директив компиляции в платформе 1С:Предприятие:

  1. Директивы компиляции (&НаСервере, &НаКлиенте) предназначены исключительно для модулей управляемых форм и управляемых команд. В обычных формах и в общих модулях конфигурации использовать эти директивы нельзя.
  2. В общих модулях контекст исполнения (где именно будет компилироваться и выполняться код модуля) задается не директивами в тексте, а свойствами (флагами) самого общего модуля в дереве метаданных.
  3. Если добавить &НаСервере перед объявлением метода в общем модуле, платформа не может корректно распарсить заголовок функции, в результате чего экспортный метод не попадает в пространство имен модуля, и при вызове выбрасывается исключение «Метод объекта не обнаружен».

Шаг 1. Правильная настройка свойств общего модуля для серверного вызова

В толстом клиенте обычного приложения действует следующее правило: если у общего модуля включены одновременно флаги Клиент (обычное приложение) и Сервер, то при вызове функции с клиента она по умолчанию будет выполняться на клиенте. Чтобы принудительно перенести исполнение на сервер 1С, необходимо правильно настроить свойства модуля.

Выполним следующие действия:

  1. Создадим отдельный общий модуль (или используем существующий серверный модуль, например, БонКартыСервер).
  2. В свойствах общего модуля установим флаги:
    • Сервер — флаг включен;
    • Вызов сервера — флаг включен (разрешает обращение к серверным методам из клиентского контекста);
    • Клиент (обычное приложение) — флаг выключен;
    • Клиент (управляемое приложение) — флаг выключен.
  3. Удалим директиву &НаСервере из текста модуля перед определением функции.

При таких настройках вызов БонКартыСервер.ПолучитьПодключениеКФайловойБД() с любого клиентского компьютера гарантированно передаст управление на сервер 1С:Предприятия, где локальный диск D:\Base доступен операционной системе.

Шаг 2. Адаптация кода COM-подключения для работы на сервере

При переносе кода COM-соединения на сервер необходимо учесть критические ограничения серверного контекста:

  1. Запрет интерактивных методов: Функция Предупреждение() не может вызываться на сервере, так как серверные процессы 1С не имеют графического интерфейса. Вызов диалоговых окон на сервере приводит к аварийной ошибке «Интерактивные операции недопустимы». Ошибки на сервере нужно логировать в журнал регистрации или передавать на клиент через вызов исключения.
  2. Разрядность COM-коннектора: Если служба сервера 1С 64-разрядная (x86-64), вызов Новый COMОбъект("V83.COMConnector") потребует зарегистрированной 64-битной библиотеки comcntr.dll. Если база запускается под 64-битным сервером, а коннектор 32-битный, возникнет ошибка «Класс не зарегистрирован».
  3. Права учетной записи службы: Служба сервера 1С (обычно пользователь USR1CV8) должна иметь полные права доступа (чтение, запись, изменение) на папку с файловой базой данных на сервере.

Посмотрим на исправленный и безопасный пример серверной функции подключения:


Функция ПолучитьПодключениеКФайловойБД() Экспорт

    КаталогБазыДанных = ПолучитьПредопределенноеЗначение("КаталогБазыДанных");
    Пользователь      = ПолучитьПредопределенноеЗначение("ПользовательИБ");
    Пароль            = ПолучитьПредопределенноеЗначение("ПарольПользователяИБ");
    
    СтрокаПодключения = "file='" + КаталогБазыДанных + "'; usr='" + Пользователь + "'; pwd='" + Пароль + "';";
    
    Попытка
        V83COMConnector = Новый COMОбъект("V83.COMConnector");
        Возврат V83COMConnector.Connect(СтрокаПодключения);
    Исключение
        ТекстОшибки = "Ошибка COM-подключения к файловой базе: " + ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Интеграция.COM", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
        ВызватьИсключение ТекстОшибки;
    КонецПопытки;

КонецФункции

Шаг 3. Вызов метода и обработка результата на клиенте

Теперь в клиентском коде формы или обработки обычного приложения вызываем серверный метод в блоке обработки исключений:


Попытка
    Соединение = БонКартыСервер.ПолучитьПодключениеКФайловойБД();
    // Дальнейшая работа с внешним COM-соединением
Исключение
    Предупреждение("Не удалось подключиться к внешней базе: " + ОписаниеОшибки());
КонецПопытки;

Альтернативные варианты решения

Если перенос логики на сервер 1С затруднен из-за ограничений разрядности COM-коннектора, рассмотрим альтернативные пути:

  1. Общий сетевой ресурс (Shared Folder): Расшарить папку с файловой базой на сервере и в строке подключения указать сетевой UNC-путь вида file='\\ServerName\BaseShare';. В этом случае подключение по-прежнему может выполняться на стороне клиента, если у пользователя клиентской машины есть сетевые права к ресурсу.
  2. Использование HTTP/Web-сервисов: Опубликовать вторую файловую базу на веб-сервере (IIS / Apache) и взаимодействовать через REST API (OData) или собственные HTTP-сервисы. Это исключает зависимость от файлового доступа и COM-библиотек.
← На главную