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

Обмен - Перенос данных из 1C8 в 1C8

nt

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

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

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

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

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

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

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

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

Попытка
    // Бывает такое, что забываю убирать вызов лога, это разумеется может привести к ошибке. 
    // Чтобы подстраховать себя от этого - всю конструкцию обрамляю в попытку
    
    Если ОбъектИР <> Неопределено Тогда      
        ЭтоКоллекция = Истина;
        Попытка
            Просто = ОбъектИР.Ссылка;        
            ЭтоКоллекция = Ложь;
        Исключение
        КонецПопытки;
        
        Если ТипЗнч(ОбъектИР) = Тип("Запрос") Тогда  
            Если МодальныйВызов Тогда 
                // в обычном режиме при исполнении алгоритма откроется модальное окно с запросом и всеми параметрами
                СообщениеЛога = ВнешниеОбработки.Создать("D:\Tools\ir\ирПортативный.epf", БезопасныйРежим()).От(ОбъектИР);
            Иначе
                // лог для отложенной отладки запроса - открывается в консоли запросов
                СообщениеЛога = ВнешниеОбработки.Создать("D:\Tools\ir\ирПортативный.epf", БезопасныйРежим()).От(ОбъектИР,,,Истина);
            КонецЕсли;
        Иначе           
            Если МодальныйВызов Тогда 
                // в обычном режиме при исполнении алгоритма откроется модальное окно с исследователем объектов
                СообщениеЛога = ВнешниеОбработки.Создать("D:\Tools\ir\ирПортативный.epf", БезопасныйРежим()).Ис(ОбъектИР, ЭтоКоллекция, Ложь);
            Иначе
                // лог для отложенной отладки ссылки или коллекции - открывается в исследователе объектов 
                СообщениеЛога = ВнешниеОбработки.Создать("D:\Tools\ir\ирПортативный.epf", БезопасныйРежим()).Ис(ОбъектИР, ЭтоКоллекция, Истина);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;    
    
    Если СообщениеЛога <> Неопределено Тогда   
        АдресЛога = "D:\Лог.txt";
        
        ТекстДокумент = Новый ТекстовыйДокумент;
        ТекстДокумент.Прочитать(АдресЛога);
        // Вся разница в текстах алгоритма только в этой строчке - "выгрузка" для выгрузки, "загрузка" для загрузки
        ТекстДокумент.ДобавитьСтроку("" + ТекущаяДата() + ", выгрузка: " + СообщениеЛога);
        ТекстДокумент.Записать(АдресЛога);
    КонецЕсли;
    
Исключение
КонецПопытки;


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

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

//..

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

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

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

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

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

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

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

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

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

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

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

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

62

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. Amur_MVS 104 15.05.17 10:43 Сейчас в теме
2. artbear 1084 26.05.17 17:07 Сейчас в теме
Спасибо за использование ИР.
Очень их люблю
3. unichkin 1023 26.05.17 18:33 Сейчас в теме
(2) Для меня ИР в v8 стали неким аналогом опенконфа в v7 :)
Оставьте свое сообщение