При работе с бесшовной интеграцией между 1С:ERP и 1С:Документооборот (ДО) часто возникают ситуации, когда данные в базе-приемнике начинают вести себя непредсказуемо. Одной из типичных проблем является самопроизвольная очистка реквизитов пользователя (например, должности или графика работы) в 1С:ДО при передаче документов из ERP. Рассмотрим подробно, как проанализировать эту ситуацию, настроить отладку веб-сервисов и найти «виновника» в программном коде.
Прежде чем приступать к технической отладке, проанализируем механизм работы интеграции. Когда мы создаем или изменяем объект в ERP, система инициирует вызов веб-сервиса DMService на стороне Документооборота. В рамках этого вызова передается пакет данных в формате XDTO.
Проблема очистки полей чаще всего связана с тем, что в ERP включена синхронизация данных текущего пользователя. Если в базе ERP у пользователя не заполнены реквизиты Должность или График работы, или они заполнены в формате, который не сопоставляется с данными ДО, система формирует пустые значения в XDTO-пакете. При получении такого пакета 1С:Документооборот воспринимает отсутствие данных как команду к обновлению и затирает существующие значения в справочнике Пользователи. Ситуация проявляется именно для текущего сеанса, так как интеграция обновляет данные именно того сотрудника, под которым выполняется действие. Для воспроизведения и проверки такого поведения под нужной учетной записью можно использовать обработку для запуска 1С под любым пользователем без пароля.
Если стандартная отладка через конфигуратор затруднена (например, из-за жестких настроек безопасности или особенностей работы фоновых заданий на платформе 8.3.19), воспользуемся методом программного логирования. Разберем по шагам, как это реализовать.
Найдем в конфигурации «1С:Документооборот» место, где происходит изменение данных. В нашем случае это может быть модуль справочника Пользователи или соответствующий регистр сведений. В процедуре ПриЗаписи или ПередЗаписью установим перехватчик, который будет записывать стек вызовов в журнал регистрации, если записываются пустые значения.
Рассмотрим пример кода для записи стека:
Попытка
// Искусственно вызываем исключение, чтобы получить доступ к информации об ошибке
ВызватьИсключение "Лог стека вызовов";
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ТекстСтека = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
// Записываем полученный стек в Журнал регистрации
ЗаписьЖурналаРегистрации("ОтладкаИнтеграции",
УровеньЖурналаРегистрации.Предупреждение,
,
,
ТекстСтека);
КонецПопытки;
Этот метод позволяет увидеть всю цепочку процедур и функций, приведших к записи объекта. Проанализировав журнал регистрации, мы сможем точно определить, какая процедура веб-сервиса передала пустые значения.
Для тех, кто предпочитает классическую отладку «в живую», необходимо правильно подготовить серверную среду. Работа через IIS (Internet Information Services) требует специфических настроек.
Во-первых, убедимся, что сервер 1С запущен в режиме отладки. Для этого в строке запуска службы 1C:Enterprise 8.3 Server Agent должен присутствовать флаг -debug. Если сервер работает на Linux, соответствующие изменения вносятся в конфигурационный файл /etc/sysconfig/srv1cv83.
Во-вторых, настроим параметры публикации на веб-сервере. Проанализируем файл web.config, который находится в каталоге публикации базы ДО. В нем должна быть разрешена отладка. Однако более важным является настройка самого Конфигуратора в базе «1С:Документооборот»:
Важный нюанс: начиная с платформы 8.3.7, рекомендуется использовать протокол HTTP для отладки вместо TCP/IP. Это значительно стабильнее при работе через прокси-серверы и IIS. Убедитесь, что в настройках отладки выбран именно HTTP.
Если вы столкнулись с багом платформы 8.3.19, когда фоновые задания «пролетают» мимо точек останова, воспользуемся механизмом отладки по идентификатору назначения. Это позволит отладчику сфокусироваться на конкретном потоке данных, а если традиционная интеграция слишком сложна в отладке — применить роботизацию действий пользователя для переноса данных между системами.
Разберем, как это сделать программно. В коде ERP, непосредственно перед вызовом функций интеграции, добавим установку идентификатора:
// Устанавливаем уникальный ключ для текущего сеанса отладки
Отладка.УстановитьИдентификаторНазначенияОтладки("DEBUG_ERP_TO_DO");
После этого в Конфигураторе 1С:ДО в окне «Подключение» (меню Отладка — Подключение) укажите этот же идентификатор DEBUG_ERP_TO_DO в настройках отбора. Теперь система будет игнорировать посторонние фоновые процессы и остановится именно на вашем вызове.
Если в ходе анализа выяснилось, что ERP действительно передает пустые поля, а времени на переписывание логики формирования XDTO-пакетов нет, можно прибегнуть к административной настройке. Рассмотрим, как это сделать:
Пользователи.Должность и График работы установлены флаги обновления, снимем их.После отключения этих флагов ERP перестанет посылать команды на обновление данных полей в ДО. Это позволит сохранить корректные данные в Документообороте, даже если в ERP они не заполнены или отличаются по структуре. Таким образом, мы исключим «затирание» данных, сохранив при этом общую работоспособность бесшовной интеграции. В качестве альтернативы встроенным средствам синхронизации можно настроить автоматический обмен данными между базами 1С по расписанию.