Отладка 1С по COM-коннектору?

1. 232 20.06.22 17:48 Сейчас в теме
Приветствую, коллеги!

Делаю обработку по переносу данных из базы в базу по COM-у. Столкнулся с исключением при попытке записать документ в базе-получателе.
Ошибка маловразумительная, хотелось бы поточнее выйти на причину.
Запустил базу-получатель в режиме отладки с автоматическим подключением внешних соединений на сервере. Но отловить исполняемый код по COM-соединению не могу. Ни процедура ПередЗаписью(), ни ПриЗаписи() не перехватывается. Хотя среди подключенных предметов отладки появляется серверное подключение через COM.
Можно ли и как отловить и отладить код, выполняемый через COM-соединение?
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Vitaly1C8 20.06.22 17:54 Сейчас в теме
(1) почему не ведете отладку на стороне где создается COM-объект ?
4. SanchoD 232 20.06.22 18:23 Сейчас в теме
(2) веду. но там все идет хорошо, до строки ДокументCOM.Записать(). И срабатывает исключение.
Ошибка при этом такая:

Ошибка при выполнении обработчика - 'ПриЗаписи'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ДокументОбъектПриЗаписи ()

Но я подключаюсь из серверной процедуры Базы-источника к Базе-приемнику. И соответственно ничего не передаю с клиента.
Что там (в Базе-приемнике) происходит - черный ящик.
6. ishelper 20.06.22 18:33 Сейчас в теме
(1)
Ошибка маловразумительная
Такой же (маловразумительный) ответ устроит?
(4)
Попытка передачи с клиента на сервер мутабельного значения
Гуглить не пробовали? Бывает полезно, например:
https://infostart.ru/1c/articles/123256/
https://forum.infostart.ru/forum9/topic197506/
12. SanchoD 232 20.06.22 22:31 Сейчас в теме
(6) Смотрел. Не нашел ответа что мне надо исправить. Для этого и хотел пошагово пройтись по исполняемому в базе-получателе коду.
7. nikolasx 33 20.06.22 18:36 Сейчас в теме
(4) Да, в этих ссылка и есть ответ на ваши ошибки https://infostart.ru/1c/articles/123256/
9. Vitaly1C8 20.06.22 21:47 Сейчас в теме
(4) предлагаю следующее: документ записывать но не проводить; затем зайти в базу приемник и
1. провести его (если ошибки нет) см 2
2. провести его программно из обработки в базе приемнике (если ошибки нет) см 3
3. проводить в режиме Док.ОбменДанными.Загрузка = Истина
что-нибудь из выше перечисленного может помочь ...
10. SanchoD 232 20.06.22 22:09 Сейчас в теме
(9) Это все еще до проведения заканчивается ошибкой, при записи.
13. unknown181538 70 21.06.22 00:05 Сейчас в теме
(4) Ну это, вероятнее всего, подписка на событие ПриЗаписи()
Но что там за пробелема с мутабельностью не понятно. Да и отладкой вы это не поймаете, т.к. там должен передаваться ДокументОбъект платформой...
15. SanchoD 232 21.06.22 09:27 Сейчас в теме
(13) Да, так и есть. Вся хрень происходит после команды Записать() из Базы-источника. И дальше происходит вся движуха по событию ПриЗаписи() в Базе-приемнике. И вот отладка именно в базе-приемнике помогла бы выйти на конкретный модуль/процедуру/функцию где что-то пошло не так. Собственно о чем и прошу помочь - указать как это можно сделать, если конечно можно.
14. winapi 39 21.06.22 00:13 Сейчас в теме
(1) покажите код, где создаете и записываете документ. Скорей всего вы подключаетесь через V83.Application, а не через COMConnector. В этом и проблема.
16. SanchoD 232 21.06.22 17:00 Сейчас в теме
(14) Вот так подключаюсь:

&НаСервере
Функция Подключение(V8)

Если (СокрЛП(Объект.ИмяБазы)="") И (СокрЛП(Объект.ИмяСервера)="") И (СокрЛП(Объект.ПутьКБазе)="") Тогда
СообщениеСообщить("Не настроено подключение к ИБ!");
Возврат 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="""+ПарольПользователя+"""";
КонецЕсли;

V8 = ИБ.Connect(СтрокаПодключения);
СтрСообщения = "Подключена база. ("+ТекущаяДата()+")";
СообщениеСообщить(СтрСообщения);
Возврат 1;
Исключение
СтрСообщения = "Не удалось подключиться к базе.";
СообщениеСообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;

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

А вот про V83.Application спасибо. Возможно что так взлетит.
19. ignorant 22.06.22 16:39 Сейчас в теме
(1)
			Попытка
				ОбъектДокумент.Записать (БазаПолучатель.РежимЗаписиДокумента.Запись);
			Исключение
				Сообщить ("Не записан Документ : " + ОписаниеОшибки());
			КонецПопытки;
ОписаниеОшибки() покажите
20. SanchoD 232 22.06.22 17:23 Сейчас в теме
(19)Не удалось записать документ ЗаказПоставщику № от 20.06.2022 15:57:51 .({амд_Реализация Документ.РеализацияТоваровУслуг.МодульОбъекта(1101)}: Ошибка при вызове метода контекста (Записать): Произошла исключительная ситуация (1C:Enterprise 8.3.20.1590): Ошибка при выполнении обработчика - 'ПриЗаписи'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ДокументОбъектПриЗаписи ().)
21. spacecraft 22.06.22 17:58 Сейчас в теме
(20)
ДокументОбъектПриЗаписи

это метод подписки на событие. Причем похоже общий для всех документов. Т.е. смотрите подписку не конкретного нужного документа, а подписку на событие ПриЗаписи для всех документов. Найдите эту процедуру и посмотрите свойства общего модуля (в котором она расположена). Указан флаг ВнешнееСоединение ?
3. nikolasx 33 20.06.22 18:00 Сейчас в теме
Можно смотреть в журнал регистрации, поставить в попытку "запись объекта" и в исключении делать запись в журнал регистрации с описанием ошибки. И лучше уже забыть про обмен через COM-соединение - это погибель в новых реалиях!
5. SanchoD 232 20.06.22 18:26 Сейчас в теме
(3) Да, так и делаю. Записываю в Попытке и в Исключении получаю текст ошибки:

Ошибка при выполнении обработчика - 'ПриЗаписи'
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ДокументОбъектПриЗаписи ()

Мало что говорит она мне. Подключаюсь и работаю из серверной процедуры модуля объекта Базы-источника. Что там и где передает клиент на сервер в Базе-получателе не понятно.
17. spacecraft 21.06.22 18:53 Сейчас в теме
(5) если нет доступа к конфигуратору/отладчику базы, к которой подключаетесь, то ничего сделать не сможете. Проблема на той стороне.
Возможно в подписке на событие идет обращение к серверному модулю с передачей чего-то "незаконного" :) и не предусмотрели, что возможно выполнение по внешнему соединению (а это разновидность клиента). Т.е. при обычном выполнении модуль объекта выполняется на сервере (в том числе и подписка), а при внешнем соединении, соответственно на клиенте (ВнешнееСоединение). Вот и происходит ошибка при передачи с клиента на сервер мутабельного значения. А при обычной работе происходит передача с сервера на сервер, соответственно и ошибки не будет.

Как минимум нужно убедиться, что подписка на событие расположена в общем модуле, для которого проставлен флаг ВнешнееСоединение.
unknown181538; +1 Ответить
18. SanchoD 232 22.06.22 11:04 Сейчас в теме
(17) Доступ к конфигуратору базы-приемника есть. Включаю там отладку с автоматическим подключение внешних соединений. Но включенный замер не перехватывает исполнение кода внешним соединением, хотя оно (внешнее соединение) есть в списке подключенных.
Перелопатил общие модули, которые вызывались из подписки на событие ПриЗаписи. Были несколько без флажка "Внешнее соединение", но их установка не решила проблему. Я так понимаю, что там еще куча процедур/функций вызывается из других модулей. Всем флажок не поставишь. Хотелось бы выйти на конкретный парасик. Но видно нет такого инструмента.
8. ishelper 20.06.22 18:58 Сейчас в теме
+(6) На всякий случай: надеюсь, базовое ограничение передачи данных через COM у вас выполняется?
через ком передача возможна примитивных типов: число, дата, строка, булево.
все остальное формируется на другой стороне.
если передавать объект, форму и т.п. - выползет как раз вот такая ошибка.
11. SanchoD 232 20.06.22 22:12 Сейчас в теме
(8) Да, конечно, передаю через КОМ только простые типы. Причем для исключения передачи чего-то недозволенного, сделал тестовое создание документа, передав через КОМ только дату. И абсолютно пустой документ не смог записаться, вывалив ту же самую ошибку.
Оставьте свое сообщение
Вакансии
Консультант-аналитик 1С
Москва
зарплата от 120 000 руб. до 190 000 руб.
Полный день

Ведущий аналитик-разработчик 1С
Москва
зарплата от 230 000 руб. до 270 000 руб.
Полный день

1С:Эксперт по производительности
Москва
зарплата от 400 000 руб. до 950 000 руб.
Полный день

Ведущий аналитик 1С (ERP, ЗУП)
Краснодар
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Тверь
зарплата от 150 000 руб. до 250 000 руб.
Полный день