Делаю обработку по переносу данных из базы в базу по COM-у. Столкнулся с исключением при попытке записать документ в базе-получателе.
Ошибка маловразумительная, хотелось бы поточнее выйти на причину.
Запустил базу-получатель в режиме отладки с автоматическим подключением внешних соединений на сервере. Но отловить исполняемый код по COM-соединению не могу. Ни процедура ПередЗаписью(), ни ПриЗаписи() не перехватывается. Хотя среди подключенных предметов отладки появляется серверное подключение через COM.
Можно ли и как отловить и отладить код, выполняемый через COM-соединение?
это метод подписки на событие. Причем похоже общий для всех документов. Т.е. смотрите подписку не конкретного нужного документа, а подписку на событие ПриЗаписи для всех документов. Найдите эту процедуру и посмотрите свойства общего модуля (в котором она расположена). Указан флаг ВнешнееСоединение ?
(2) веду. но там все идет хорошо, до строки ДокументCOM.Записать(). И срабатывает исключение.
Ошибка при этом такая:
Ошибка при выполнении обработчика - 'ПриЗаписи'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ДокументОбъектПриЗаписи ()
Но я подключаюсь из серверной процедуры Базы-источника к Базе-приемнику. И соответственно ничего не передаю с клиента.
Что там (в Базе-приемнике) происходит - черный ящик.
(4) предлагаю следующее: документ записывать но не проводить; затем зайти в базу приемник и
1. провести его (если ошибки нет) см 2
2. провести его программно из обработки в базе приемнике (если ошибки нет) см 3
3. проводить в режиме Док.ОбменДанными.Загрузка = Истина
что-нибудь из выше перечисленного может помочь ...
(4) Ну это, вероятнее всего, подписка на событие ПриЗаписи()
Но что там за пробелема с мутабельностью не понятно. Да и отладкой вы это не поймаете, т.к. там должен передаваться ДокументОбъект платформой...
(13) Да, так и есть. Вся хрень происходит после команды Записать() из Базы-источника. И дальше происходит вся движуха по событию ПриЗаписи() в Базе-приемнике. И вот отладка именно в базе-приемнике помогла бы выйти на конкретный модуль/процедуру/функцию где что-то пошло не так. Собственно о чем и прошу помочь - указать как это можно сделать, если конечно можно.
(1) покажите код, где создаете и записываете документ. Скорей всего вы подключаетесь через V83.Application, а не через COMConnector. В этом и проблема.
Если (СокрЛП(Объект.ИмяБазы)="") И (СокрЛП(Объект.ИмяСервера)="") И (СокрЛП(Объект.ПутьКБазе)="") Тогда
СообщениеСообщить("Не настроено подключение к ИБ!");
Возврат 0;
КонецЕсли;
Попытка
Попытка
ИБ = Новый COMObject("V83.COMConnector");
Исключение
СтрСообщения = "Невозможно создать объект '"+"V83.ComConnector"+"'
|Попробуйте зарегистрировать COM-объект командой: regsvr32 (Каталог BIN 1C 8.3)\comcntr.dll";
СообщениеСообщить(СтрСообщения);
Объект.Лог.ДобавитьСтроку(СтрСообщения);
Возврат 0;
КонецПопытки;
ИмяПользователя = Объект.Пользователь;
ПарольПользователя = Объект.Пароль;
Если Объект.ТипБазы=0 Тогда
ПутьКБазе = Объект.ПутьКБазе;
СтрокаПодключения = "File="""+ПутьКБазе+""";Usr="""+ИмяПользователя+""";Pwd="""+ПарольПользователя+"""";
Иначе
Сервер83 = Объект.ИмяСервера;
База83 = Объект.ИмяБазы;
СтрокаПодключения = "Srvr="""+Сервер83+""";Ref="""+База83+""";Usr="""+ИмяПользователя+""";Pwd="""+ПарольПользователя+"""";
КонецЕсли;
(19)Не удалось записать документ ЗаказПоставщику № от 20.06.2022 15:57:51 .({амд_Реализация Документ.РеализацияТоваровУслуг.МодульОбъекта(1101)}: Ошибка при вызове метода контекста (Записать): Произошла исключительная ситуация (1C:Enterprise 8.3.20.1590): Ошибка при выполнении обработчика - 'ПриЗаписи'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ДокументОбъектПриЗаписи ().)
это метод подписки на событие. Причем похоже общий для всех документов. Т.е. смотрите подписку не конкретного нужного документа, а подписку на событие ПриЗаписи для всех документов. Найдите эту процедуру и посмотрите свойства общего модуля (в котором она расположена). Указан флаг ВнешнееСоединение ?
Можно смотреть в журнал регистрации, поставить в попытку "запись объекта" и в исключении делать запись в журнал регистрации с описанием ошибки. И лучше уже забыть про обмен через COM-соединение - это погибель в новых реалиях!
(3) Да, так и делаю. Записываю в Попытке и в Исключении получаю текст ошибки:
Ошибка при выполнении обработчика - 'ПриЗаписи'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ДокументОбъектПриЗаписи ()
Мало что говорит она мне. Подключаюсь и работаю из серверной процедуры модуля объекта Базы-источника. Что там и где передает клиент на сервер в Базе-получателе не понятно.
(5) если нет доступа к конфигуратору/отладчику базы, к которой подключаетесь, то ничего сделать не сможете. Проблема на той стороне.
Возможно в подписке на событие идет обращение к серверному модулю с передачей чего-то "незаконного" :) и не предусмотрели, что возможно выполнение по внешнему соединению (а это разновидность клиента). Т.е. при обычном выполнении модуль объекта выполняется на сервере (в том числе и подписка), а при внешнем соединении, соответственно на клиенте (ВнешнееСоединение). Вот и происходит ошибка при передачи с клиента на сервер мутабельного значения. А при обычной работе происходит передача с сервера на сервер, соответственно и ошибки не будет.
Как минимум нужно убедиться, что подписка на событие расположена в общем модуле, для которого проставлен флаг ВнешнееСоединение.
(17) Доступ к конфигуратору базы-приемника есть. Включаю там отладку с автоматическим подключение внешних соединений. Но включенный замер не перехватывает исполнение кода внешним соединением, хотя оно (внешнее соединение) есть в списке подключенных.
Перелопатил общие модули, которые вызывались из подписки на событие ПриЗаписи. Были несколько без флажка "Внешнее соединение", но их установка не решила проблему. Я так понимаю, что там еще куча процедур/функций вызывается из других модулей. Всем флажок не поставишь. Хотелось бы выйти на конкретный парасик. Но видно нет такого инструмента.
+(6) На всякий случай: надеюсь, базовое ограничение передачи данных через COM у вас выполняется?
через ком передача возможна примитивных типов: число, дата, строка, булево.
все остальное формируется на другой стороне.
если передавать объект, форму и т.п. - выползет как раз вот такая ошибка.
(8) Да, конечно, передаю через КОМ только простые типы. Причем для исключения передачи чего-то недозволенного, сделал тестовое создание документа, передав через КОМ только дату. И абсолютно пустой документ не смог записаться, вывалив ту же самую ошибку.
Столкнулся с такой же проблемой, и в этой ветке уже есть решение (почему-то не отмеченное как решение): комментарии spacecraft от 22.06.2022 17:58, 18:53.
Действительно проблема была в базе-приемнике, а именно в подписке на событие ПриЗаписи, обработчик которого находился в модуле, где не была установлена галка "Внешнее соединение". Установил галку "Внешнее соединение" в свойствах соответствующего общего модуля - и это решило проблему.