|
COM-соединение 1С 8.3 - 1С 8.3 Есть ли возможность зайти в отладчик в соединении | ☑ | ||
---|---|---|---|---|
0
kostyaomsk
11.08.15
✎
10:27
|
Хотел спросить форумчан если ли вообще такая возможность отладки когда подключаюсь по СОМ-соединению с помощью обработки из одной базы на платформе 8.3.6 (БП 3.0) к модулю внешнего соединения самописной базы (тоже работающей на платформе 8.3.6) и вызываю из него экспортные процедуры с помощью обработки? Базы пока файловые и находятся на одном ПК, но планируется серверный вариант. До этого времени использовал конструкции приведенные ниже для передачи на выполнение произвольного кода по СОМ-соеднению, а также регистрации ошибок. Вот фрагменты процедур в самописной базе в модуле внешнего соединения:
Функция ИсполнитьВн(КодВыполнить, ВспомПараметр= "") Экспорт ПроверкаБезопасности(); // Защита от попытки выполнения вредоносного кода при внешнем подключении от имени другого пользователя Ответ = "0";//Если ничего не нужно будет возвращать, то при отсутствии ошибок в коде //вернется просто ОК //Т.к. переданный код может быть с ошибками, то завернем его исполнение в попытку. Попытка Выполнить(КодВыполнить); // Выполнение кода как строки на другом компьютере по COM-Соединению (Модуль внешнего соединения базы Весы) Исключение //если все таки ошибка, то вернем ее текст Ответ = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке() ); КонецПопытки; Возврат Ответ; КонецФункции Функция ТестСвязи(ВхПараметр, ВыхПараметр) Экспорт ПроверкаБезопасности(); // Защита от попытки выполнения вредоносного кода при внешнем подключении от имени другого пользователя. ВыхПараметр = "Есть связь с базой весы по COM-Соединению!"; Возврат Истина; КонецФункции Из БП 3.0 выполняю такой фрагмент: Попытка Ком = Новый COMObject("V83.COMConnector"); Соединение = Ком.Connect ("File=""C:\1c\Базы_1С\Весы""; Usr =""КомОбмен""; Pwd =""1"";"); СказатьПользователю("Тест пройден! Есть соедение с базой весов"); Исключение Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке() ); СказатьПользователю("Нет КОМ-соединения с базой Весов! Подробно "+Ошибка); Ком=Неопределено; Возврат; КонецПопытки; Вых = ""; Вх = "1"; Если Соединение.ТестСвязи(Вх, Вых) Тогда СказатьПользователю("Тест связи с конфигурацией весы успешный! Ответ: "+Вых); Иначе СказатьПользователю("Тест связи с конфигурацией весы неудачный! Ответ: "+Вых); КонецЕсли; Понимаю, конечно что в оператор Выполнить(СтрокаКода1С8) зайти не удастся, но есть ли такая возможность при вызове удаленной процедуры модуля внешнего подключения из основной базы Соединение.ТестСвязи(Вх, Вых) зайти в ее код в этой же сессии отладчика в функцию ПроверкаБезопасности() их вызывающей процедуры? Уже смотрел документацию что смог найти по этому вопросу. Ставил везде в обоих конфигурациях опции по разрешению отладки и точки останова. Запускал оба конфигуратора. Есть ли вообще такая возможность в данной ситуации отладить допустим процедуру ПроверкаБезопасности() и дальше на стороне модуля внешнего подключения? |
|||
1
kostyaomsk
11.08.15
✎
10:35
|
На стороне БП 3.0 при подключении можно только отладить код, выполняющийся в этой сессии, перешагнув процедуру. Соединение.ТестСвязи(Вх, Вых)
Уже включал опции отладчика из главного меню "Отладка"->"Подключение" в окне предметы отладки по кнопке "Автоматическое подключение" все галочки: - Клиентские и внешние соединения на сервере; - Web-сервисы на сервере; - HTTP-сервисы на сервере; - Фоновые задания. Кто занимается интеграцией? Думаю, что раз можно подключиться через COM-соединение не только к базам 1С 7.7 и 1С 8.х, но и к сторонним АИС вообще (Excel даже) и передать туда код в виде текста для ТОЙ АИС Полагаю, что все вышеназванные галочки позволяют отладить сеанс в рамках этой базы, а не подключаемой. |
|||
2
alexei366
11.08.15
✎
10:37
|
Ну тогда серверный вариант нужен для базы к которой подключаешься.
Запускаешь оба конфигуратора, в первом делаешь точку останова после установки соединения в обработке, ну и во втором подключаешься через меню отладка к созданному сеансу. Вроде так прокатить должно, естественно служба срвера должна быть запущена в режима отладки |
|||
3
alexei366
11.08.15
✎
10:40
|
(0) Яб на самом деле тестировал бы процедуры сразу во второй базе, а потом бы дописал "Соединение." где надо
|
|||
4
kostyaomsk
11.08.15
✎
10:40
|
Стоп, для простоты вообще все базы файловые и даже работают на одном ПК. Мне интерена сама возможность отладки в такой ситуации. Или принципиально для отладки серверный вариант тогда (всякие ключи -debug и прочие настроки).
Я выясняю принципиально возможна ли такая отладка (может даже использовать сторонние средсва) или это просто глюки ПК, платформы и настроек базы по отладке. Использовать конструкции Попытка Исключение даст только информацию об ошибке? |
|||
5
kostyaomsk
11.08.15
✎
10:41
|
Да я понял уже что нужно во второй базе тестировать, но вот если сложные случаи когда во вторую базу пересылается таблица значений и во второй базе выполняется сложный запрос
|
|||
6
alexei366
11.08.15
✎
10:43
|
(5) Много пишешь, лучше давай конкретику небольшую, там потом сам разовьешь тему
|
|||
7
kostyaomsk
11.08.15
✎
10:51
|
Конструкция вида во второй базе в модуле внешнего соединения тестируется во второй базе, т.к. нет внешних данных:
Функция ТестЗапроса() Попытка Запрос = Новый Запрос; Запрос.текст = "Выбрать * Из Справочники.контрагенты"; Возврат Запрос.Выполнить().Выгрузить(); Исключение текстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке() ); // Можно в журнал событий записать во второй базе - проверял при ошибках не пишется и вернуть для анализа в 1-й базе. КонецПопытки; КонецФункции В первой базе или на ура А что делать тогда если нужно передать таблицу в эту процедуру из первой базы ТЗвх = ... Получение таблицы-значений в 1-й базе ТЗвых = неопределено; Рез = Соединение.ТестЗапросаСоединения(ТЗвх, ТЗвых); А во второй базе в модуле внешнего соединения в процедуре ТестЗапросаСоединения(ТЗвх, ТЗвых) запихиваем ТЗвх в параметр запроса и индексируем (тут надо еще проверить можно ли так делать из-за ошибок платформы), а потом эту временную таблицу соединяем с данными запроса во второй базе, выгружаем в итоговую ТЗ и уже анализируем результаты в 1-й базе |
|||
8
kostyaomsk
11.08.15
✎
10:54
|
Понимаю так, что придется отлаживать во второй базе, с помощью служебных обработок. Вызывать из запущенной 2-й базы и подставлять в качестве параметра ТЗвх те же данные. Это при разработке. А как потом ловить ошибки при поддержке? Куда-то выгружать данные из отладчика 1-й базы ТЗвх, потом запускать вторую со служебной обработкой, которая подставит в качестве параметра сохраненные данные ТЗвх?
|
|||
9
kostyaomsk
11.08.15
✎
10:56
|
Еще вопрос стоит оптимизации. Задача найти допустим те договора, которых нет в базе 2 и потом их дописать. Получается запрос на порции разбивать, передавать массив ключей (кодов договоров примитивный тип) во вторую базу в параметр ТЗвх там уже запросом смотреть если ли они, полученные по сложным правилам из базы 2 с последующей обработкой.
|
|||
10
alexei366
11.08.15
✎
11:05
|
(7) Ну я когда писал нечто подобное использовал сериализацию для передачи таблиц структур и других общих типов (кроме простых) через методы "ЗначениеВСтрокуВнутр" и т.д. Просто думаю фиг он те даст таблицу из первой базы установить как параметр в запрос второй базы без сериализации.
(8) И да когда я делал подобную вещь, то обработка у меня писалась сразу под вторую базу, в ней я её отлаживал, а в рабочем варианте после установки соединения обработка открывалась во второй базе, а первая только вызывала функции и процедуры экспортные обработки. А там уже для отладки можешь в начале процедур обработки все значения в текст файл к примеру выгружать, чтоб потом тестировать. (9) Ну да разбей на порции, можешь даже блокировки ставить на договора чтоб пока выполняется никто поменять удалить не мог) |
|||
11
kostyaomsk
11.08.15
✎
11:05
|
Проверю, конечно после чистки кэшей и презагрузки возможность отладки. Если есть опции для автоматического подключения в отладчике "Клиентские и внешние соединения на сервере" и тем более для других уже задач "Web-сервисы на сервере" как советуете "Запускаешь оба конфигуратора, в первом делаешь точку останова после установки соединения в обработке, ну и во втором подключаешься через меню отладка к созданному сеансу. " когда оба сервера запущены под -debug
Про службу сервера (вариант пока файловый) имеется в виду запуск с ключом -debug и галочками разрешения отладки? В платформе 8.3.6 главное меню "Сервис"-"параметры" вкладка "Дополнительно" галочки: - "устанавливать режим разрешения отладки"; - "начинать отладку при запуске"; |
|||
12
kostyaomsk
11.08.15
✎
11:13
|
Верно, тип то не примитивный таблица значений. Его "склеивать" построчно-поэлементно на приемной стороне Это я так для простоты. Тут уже или в массив структур упаковывать для передачи и прочее
|
|||
13
alexei366
11.08.15
✎
11:18
|
(11) (12) Я так думаю стоит уже пробывать и глядеть, информации пока достаточно (и да я имел ввиду ключ -debug)
|
|||
14
Serginio1
11.08.15
✎
12:12
|
Проще обмен делать через внешние отчеты
v8: 8.2, COM-соединение, C#, dynamic строки v8: Как из одной базы 1C8 через COM/OLE запустить в другой базе внешнюю обработку? |
|||
15
Serginio1
11.08.15
✎
12:13
|
Отладить их сначала на стороне сервера, а затем уже подключать COM.
|
|||
16
alexei366
11.08.15
✎
12:19
|
(14) (15) Таже хрень только я у ся делал чуток поизвращенней - менять конфу куда подключался не мог, поэтому сначало передавал двоичные данные (обработку) на сторону COM соединения, там сохранял во врем каталог (типа могли быть разные компы и т.д, корочь путь мог быть не доступен), дальше уже создавал обработину и вперед)
|
|||
17
kostyaomsk
11.08.15
✎
13:14
|
По поводу отладки заметил почему пошли глюки с подключением: ноут засраный весь, только по профилю 1С была установка кучи платформ и еще забыл что создавал учетную запись для агента сервера, который сейчас не запустить и не исправить ошибки платформы. Короче тут опять админство (1068 не запустить дочерние службы) и более менее понятно почему не запустить с параметром "-debug" в кромандной строке.
"C:\Program Files (x86)\1cv8\8.3.6.2041\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files (x86)\1cv8\srvinfo" alexei366, интересует другое. вы все-таки после передачи обработки на сторону COM соединения из конфигуратора 1-го компа или (из конфигуратора 2-го компа на чьей стороне запускается код из переданной обработки) смогли войти в каждую процедуру через отладчик? В окне стека вызовов кода что появлялось (где исполняется код) НаСервере(порт, имя ПК -в т.ч. удаленного) или ВнешнееСоединение(порт, имя ПК). Такой столь специфический вопрос попался когда нужно иметь на вооружении средства для повседневной отладки. То что можно упросить задачу отладив с тестовыми данными на 2-й базе, а потом уже заниматься сом-соединением понятно, но вот это не вариант для техподдержки. |
|||
18
TormozIT
гуру
11.08.15
✎
14:50
|
Рекомендую почитать статью http://catalog.mista.ru/public/387577/
|
|||
19
kostyaomsk
12.08.15
✎
09:35
|
TormozIT, большое спрасибо. Поставил Вам плюс в публикации за то, что очень подробно рассказали про саму возможность включить отладку в COM-соединении и какие есть трудности.
Одно плохо, решение ваше то очень сильно дорогое (почти как любая отраслевая конфигурация, а выкладывают деньги равные ее стоимости чтоб запустить): оно же для программистов-разработчиков, но Вы, главное объяснили как сделать самим: - Использование хитрого файла " comcntrcfg.xml" в каталоге "conf"; - Правильный путь конфигуратора "...необходимо запускать конфигуратор для отладки с той же (до регистра букв) строкой соединения, что и предмет отладки. "; - Шаманство с настройками DCOM-компонент на сервере (тут правда отовсюду по-крупицам на русском языке что-то попадалось; - Глючность некоторых редакций платформы 8.3 и что только подбирать нужную (пишите что сама возможность отладки только появилась в 8.3); Одним словом, всем большое спасибо что ответили серьезно. Тема действительно очень специфическая, документации в оригинале на английском очень много и она для программистов-разработчиков больше этих самых компонет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |