Использование инструментов разработчика для отладки обменов КД 2.0

Пара трюков, благодаря которым жить становится намного проще…

Не буду здесь говорить о штатной отладке через внешнюю обработку «ВыгрузкаЗагрузкаДанныхXML8x.epf» — в ней нет ничего сложного, и осваивается она довольно просто. Но не всегда это удобно — и не всегда это применимо, если говорить про online-обмены. Вы можете просмотреть выгрузку штатным способом, с отбором по плану обмена — но результат может быть отличен от того, который получается при непосредственно обмене. Потому что отлаживаемся через внешнюю обработку, а настроенный обмен работает через ряд служебных обработок, механизм которых в нюансах от нее отличен. Также надо иметь в виду, что базы участники обмена могу иметь разные версии БСП. Поэтому может возникнуть такая ситуация, что отлаживались на одном, а видим другое. Как этого избежать? Отлаживаться по контексту. То есть работая непосредственно с штатным механизмом обмена.

Первое, о чем хочется упомянуть — в принципе когда речь заходит о любых обменах на КД 2.0, это разработка Конвертация данных + Контекстная подсказка. Это такой «апгрейд» КД 2.0, на основе инструментов разработчика. Как показывает практика мало кто о ней знает, а инструмент удобнейший. Отнесем это к части рабочего места: синтакс контроль в правилах, а также контекстная подсказка по именам метаданных — очень крутая вещь, рекомендую.

Но только этим роль ИР здесь не заканчивается. Перед тем как читать дальше — рекомендую ознакомится с механизмом отложенной отладки. Если где-то в правилах используется закрученный алгоритм, и хочется посмотреть результат запроса, или таблицу значений — это очень просто реализуется с их помощью. Теперь немного определюсь с понятиями. 

В основном здесь будет рассматриваться online обмен по com-соединению от базы «Источник» в базу «Приемник». Основная сложность в разработке правил online обмена состоит в том, что штатный механизм требует стандартной выборки. Можно применять произвольный алгоритм — но при этом все отборы и квитирование ложатся на плечи разработчика, поэтому далее буду считать что все ПВД  в рамках online обмена реализованы именно стандартной выборкой. О каких же запросах может идти тогда речь? Дело в том, что практически все обмены имеют какие-то свои, обусловленные методологией сложности  (мне приходилоссь выгружать бизнес процессы в записи регистров сведений, например). Получается что для штатной работы  необходима стандартная выборка, но выгружаемая информация должна иметь другую структуру. Тут-то и приходят на помощь запросы и алгоритмы: ведь если в глобальном событии конвертации «ПередПолучениемИзмененных» реализовать выборку данных, в которой сохранить ключ — т.е. ссылку на выгружаемый объект, то в событии «ПередВыгрузкой» можно спозиционироваться на получившуюся выборку, и делать все что душе угодно. Главное  — оставить ключ исходной выгрузки  — чтобы система после удачного обмена могла произвести квитирование и корректно очистить таблицы изменений.

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

Код алгоритма
Если Ложь Тогда
// Чтобы не ругался синтакс контроль, необходим этот блок в алгоритме "как-бы объявления переменных"
СообщениеЛога = Неопределено;
ОбъектИР = Неопределено;
МодальныйВызов = Неопределено;
КонецЕсли;

Если МодальныйВызов = Неопределено Тогда
МодальныйВызов = Ложь; // Для online обменов, для прочих - удобнее Истина, если работаем в обычном приложении
КонецЕсли;

Попытка
// Бывает такое, что забываю убирать вызов лога, это разумеется может привести к ошибке.
// Чтобы подстраховать себя от этого - всю конструкцию обрамляю в попытку

Если ОбъектИР <> Неопределено Тогда
ЭтоКоллекция = Истина;
Попытка
Просто = ОбъектИР.Ссылка;
ЭтоКоллекция = Ложь;
Исключение
КонецПопытки;

Если ТипЗнч(ОбъектИР) = Тип("Запрос") Тогда
Если МодальныйВызов Тогда
// в обычном режиме при исполнении алгоритма откроется модальное окно с запросом и всеми параметрами
СообщениеЛога = ВнешниеОбработки.Создать("D:ToolsirирПортативный.epf", БезопасныйРежим()).От(ОбъектИР);
Иначе
// лог для отложенной отладки запроса - открывается в консоли запросов
СообщениеЛога = ВнешниеОбработки.Создать("D:ToolsirирПортативный.epf", БезопасныйРежим()).От(ОбъектИР,,,Истина);
КонецЕсли;
Иначе
Если МодальныйВызов Тогда
// в обычном режиме при исполнении алгоритма откроется модальное окно с исследователем объектов
СообщениеЛога = ВнешниеОбработки.Создать("D:ToolsirирПортативный.epf", БезопасныйРежим()).Ис(ОбъектИР, ЭтоКоллекция, Ложь);
Иначе
// лог для отложенной отладки ссылки или коллекции - открывается в исследователе объектов
СообщениеЛога = ВнешниеОбработки.Создать("D:ToolsirирПортативный.epf", БезопасныйРежим()).Ис(ОбъектИР, ЭтоКоллекция, Истина);
КонецЕсли;
КонецЕсли;
КонецЕсли;

Если СообщениеЛога <> Неопределено Тогда
АдресЛога = "D:Лог.txt";

ТекстДокумент = Новый ТекстовыйДокумент;
ТекстДокумент.Прочитать(АдресЛога);
// Вся разница в текстах алгоритма только в этой строчке - "выгрузка" для выгрузки, "загрузка" для загрузки
ТекстДокумент.ДобавитьСтроку("" + ТекущаяДата() + ", выгрузка: " + СообщениеЛога);
ТекстДокумент.Записать(АдресЛога);
КонецЕсли;

Исключение
КонецПопытки;


//Примеры вызова:

ОбъектИР = Запрос.ДополнительныеСвойстваКонтрагентов;
Выполнить(Алгоритмы.ЛогВыгрузки);

//..

ОбъектИР = Параметры; // т.е. глобальные параметры конвертации
Выполнить(Алгоритмы.ЛогВыгрузки); // Откроется исследователь объектов

//Иногда не надо вызывать ИР, а нужно быстро что-то посмотреть:
СообщениеЛога = НазначениеПлатежа + ", сформировано по " + Объект.Ссылка;
Выполнить(Алгоритмы.ЛогЗагрузки); // Откроется исследователь объектов

Далее в нужном месте вызывается этот алгоритм, и:

  • для онлайн обмена — формируется строка сообщения отложенной отладки, помещается в лог, потом берется оттуда, и отправляется в ИР.
  • для прочих обменов и обменов через ВыгрузкаЗагрузкаXML82.epf — можно выставить параметр МодальныйВызов = Истина, и при выгрузке сразу можно видеть модальное окно с требуемым контекстом. Но здесь есть нюанс: окно мы будем видеть в источнике, с контекстом источника. Чтобы получить запрос, который выполняется в удаленной базе надо модальный вызов запрещать, и пользоваться логом.

Еще выручает порой вот такой метод ИР:

обр = ВнешниеОбработки.Создать("D:ToolsirМодулиирОбщий.epf", Ложь);
обр.СохранитьЗначениеВФайлЛкс(МояТаблица, ПолноеИмяФайла, Сжатие = Ложь, УровеньСжатия = Неопределено);
// Здесь специально оставил значения параметров, чтобы было ясно что это

Обычно я применяю его, если надо как-то детально проанализировать коллекцию, или передать эту коллекцию в параметр запроса удаленной базы. Т.е. таблицу собрали в одной базе, а параметром хочется ее засунуть в запрос другой  базы — иногда очень выручает.

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

<config xmlns="http://v8.1c.ru/v8/comcntrcfg">
<debugconfig debug="true" protocol="tcp" debuggerURL="tcp://localhost"/>
</config>

Перезапускать сервер 1С не нужно. После этого можно в базе приемнике включать флаг «Остановка по ошибке», в настройках отладки ставить флаг «Отладка Автоматическое подключение Клиентские и внешние соединения на сервере» и запускать обмен. В случае выброса исключения вы сможете проанализировать контекст удаленной базы.

Если по отладке хочется останавливаться в базе источнике, то надо учитывать, что online обмены выполняются в фоне. Можно конечно зайти в предметы отладки, и включить фоновые задания (Отладка Подключение Автоматическое подключение поставить флаг «Фоновые задания»). Но чтобы не материться всякий раз, когда контекст отладки перехватывается параллельно работающим процессом — можно использовать те параметры запуска, о которых позаботились разработчики БСП — запускать базу с ключом «РежимОтладки» (Сервис Параметры Запуск 1С: предприятия Параметр запуска = «РежимОтладки», подробнее — доступные параметры запуска приложения). Тогда обмены не будут запускаться в фоне, и можно отлаживаться  более просто.

Конечно, кому-то все это может показаться сложным. Но это гораздо удобнее, чем отлаживаться через штатную внешнюю обработку. Попробуйте сами)

3 Comments

  1. Amur_MVS

    Спасибо!

    Reply
  2. artbear

    Спасибо за использование ИР.

    Очень их люблю

    Reply
  3. unichkin

    (2) Для меня ИР в v8 стали неким аналогом опенконфа в v7 🙂

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *