Имя: Пароль:
1C
1С v8
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
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);
Одним словом, всем большое спасибо что ответили серьезно. Тема действительно очень специфическая, документации в оригинале на английском очень много и она для программистов-разработчиков больше этих самых компонет.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс