Как исправить ошибку передачи мутабельного значения при обмене через COM-соединение в 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Рассмотрим распространенную ситуацию: при выполнении обмена данными между базами с использованием правил конвертации через COM-соединение (OLE) возникает прерывание. В частности, на этапе чтения и записи данных в базе-приемнике процесс останавливается на строке вызова метода обработки:


УспешноПереданыДанные = мОбработкаДляЗагрузкиДанных.ПроизвестиЧтениеДанных(СтрокаОшибкиВБазеПриемнике);

При этом в протоколе или журнале регистрации фиксируется ошибка следующего вида: «Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика - 'ПередЗаписью': Попытка передачи с клиента на сервер мутабельного значения 1-го параметра...». Проанализируем причину возникновения этой проблемы и разберем по шагам доступные способы ее решения.

Выясним причину ошибки мутабельного значения

Ошибка передачи мутабельного значения возникает из-за жестких контекстных ограничений платформы 1С. Мутабельные (изменяемые) значения — это сложные типы данных, например, сами объекты документов (как в случае с ошибкой при записи), таблицы значений, списки значений и формы.

Проанализируем контекст выполнения кода при COM-соединении:

  1. При подключении к базе-приемнику через COM-коннектор платформа открывает сеанс с типом клиента ВнешнееСоединение.
  2. Во время загрузки данных обработка создает объект (например, документ «Поступление товаров и услуг») и вызывает метод его записи.
  3. В момент записи срабатывает назначенная в конфигурации подписка на событие (например, ПередЗаписью).
  4. Если эта подписка вызывает процедуру из общего модуля, у которого установлен флажок Сервер, но не установлен флажок ВнешнееСоединение, платформа пытается выполнить вызов с клиента (внешнего соединения) на сервер.
  5. При этом в процедуру передается объект документа (мутабельное значение), что категорически запрещено платформой для межконтекстных вызовов. В результате система генерирует ошибку.

Варианты решения проблемы в базе-приемнике

Чтобы устранить ошибку, нам необходимо скорректировать контекст выполнения обработчика события. Разберем два основных метода.

1. Настройка свойств общего модуля

В конфигураторе базы-приемника необходимо найти общий модуль, в котором располагается процедура обработчика (имя модуля и процедуры обычно указано в тексте ошибки). Посмотрим на свойства этого модуля и установим флаг ВнешнееСоединение. Это позволит коду процедуры выполняться локально, непосредственно в контексте текущего COM-соединения, избегая несанкционированного серверного вызова и передачи объекта между контекстами.

2. Использование директив препроцессора

Если логика, заложенная в подписке на событие, предназначена исключительно для интерактивной работы пользователей и не требуется при автоматической загрузке данных, мы можем ограничить ее выполнение. Для этого обернем код обработчика в инструкции препроцессора:


#Если Не ВнешнееСоединение Тогда
    // Исполняемый код подписки на событие,
    // который будет проигнорирован при обмене через COM
#КонецЕсли

Как отладить загрузку данных через COM-соединение

Часто возникает необходимость посмотреть выполнение кода (например, метода ПроизвестиЧтениеДанных) непосредственно в процессе обмена. Посмотрим, как это сделать правильно, так как отладить выполнение этой строки в базе-источнике не получится — там происходит лишь вызов, а сама запись идет в приемнике.

  1. Если обмен идет по собственным правилам конвертации, рекомендуется сначала выгрузить данные в файл (XML) и произвести загрузку в базу-приемник в обычном режиме предприятия. Это позволит использовать стандартный отладчик и быстро выявить ошибки в правилах или коде базы.
  2. Для отладки непосредственно COM-соединения запустите Конфигуратор базы-приемника. Перейдите в меню подключения предметов отладки и найдите рабочий процесс COM (как правило, это dllhost.exe при использовании коннектора V83.COMConnector). Важно: на сервере приложения или локальной машине должна быть разрешена отладка COM-соединений.

Альтернативные подходы к обмену данными

Ограничение платформы на передачу мутабельных значений обойти невозможно: в качестве параметров между клиентом и сервером могут передаваться только примитивные типы (числа, строки, даты, булево) или сериализуемые структуры.

Если конфигурация базы-приемника закрыта для редактирования, находится на поддержке без возможности снятия, или внесение изменений в общие модули недопустимо, рекомендуется пересмотреть архитектуру обмена. Рассмотрим переход на классический файловый обмен (через XML/JSON файлы) или использование современных веб-сервисов и HTTP-сервисов. В этих сценариях данные передаются в сериализованном виде (в виде текста), а парсинг, создание и запись объектов происходят целиком в серверном контексте базы-приемника. Это полностью исключает конфликт контекстов и ошибку передачи мутабельных значений.

← На главную