Возможные проблемы и пути их решения при настройке коннектора 1С. Часть 1.

17 18

Материал подготовлен совместно с Петром Федотовым

В этой статье мы постараемся рассмотреть основные ошибки, возникающие при обмене данными через коннектор 1С, способы их расследования и варианты решения.

Иногда возникает ситуация, что коннектор настроен, определены справочники,  участвующие в обмене и ключевые реквизиты, настроены фильтры, а обмен не идет. Что делать в такой ситуации? С чего начать? Первым делом нужно проверить параметры подключения к интегрированной системе: 

Убедитесь, что вы правильно указали параметры подключения: имя сервера, имя базы данных, логин, пароль и имя плана обмена. Параметр InitiateDataExchangeIn1C должен быть установлен в значение «Да», для того чтобы автоматически запустился процесс обмена данными в системе 1С после формирования файлов с данными по плану, заданному в параметре ExchangePlan

Если параметры подключения указаны правильно, а обмен не идет, то стоит проверить настройки плана обмена в конфигураторе 1С: 

Убедитесь, что объекты 1С, с которым вы настроили обмен, присутствует в списке выбранных объектов плана обмена. Также убедитесь, чтобы не стояло галочки «Распределенная информационная база». Излишне полный план обмена увеличивает количество выгружаемых данных, что очень сильно влияет на скорость обмена данными. Поэтому нужно стараться максимально облегчить план обмена только необходимыми объектами. Например, на приведенном выше скриншоте в плане обмена оставлены только необходимые для интеграции объекты 1С (4 справочника и 1 план видов характеристик).

Еще одной распространенной причиной того, что обмен не работает, является то, что забыли пометить в 1С данные к выгрузке вручную или с помощью сценария «Выполнить подготовку объектов 1С к загрузке в DIRECTUM». Сценарий выполняет регистрацию изменений всех настроенных объектов для выбранной интегрированной системы 1С. Регистрация изменений всех настроенных объектов 1С необходима для того, чтобы коннектор учитывал все данные этих объектов, в том числе и измененные до создания плана обмена. Обычно это необходимо при самом первом обмене данными между 1С и DIRECTUM. Если необходимости выгружать все данные нет, то можно просто пересохранить запись справочника 1С или DIRECTUM, чтобы она попала в тестовый обмен. 

Иногда после настройки коннектора 1С и попытке провести первый обмен, в логах обмена появляется ошибка вида:

07.04.2011 09:52:12 Начало выгрузки данных справочников системы DIRECTUM
07.04.2011 09:52:13 Экспорт ДГВ 175128 Change 
07.04.2011 09:52:13 Экспорт ОРГ 175126 Change 
07.04.2011 09:52:14 Завершение выгрузки данных справочников системы DIRECTUM
07.04.2011 09:52:14 Начало загрузки данных объектов в систему "1С81"
07.04.2011 09:52:26 ERROR    Ошибка преобразования данных из формата DIRECTUM в формат системы или загрузки данных в интегрированную систему. (Ошибка преобразования данных XML: [file://C:/DIREXCHANGE1C/Message_002_001.xml][2,3861] Функция "Connector1C81ImportDataToIntegratedSystem": ошибка в строке 176.
Функция "ConnectorImportDataToIntegratedSystem": ошибка в строке 3.
Функция "ConnectorImportDataToIntegratedSystem": ошибка в строке 14.)
07.04.2011 09:52:26 Завершение загрузки данных объектов в систему "1С81"

Причина появления данной ошибки в том, что мы пытаемся загрузить в 1С неправильно сформированный XML-файл с данными обмена. Первым делом необходимо проверить настройки обмена на вкладке «Дополнительные настройки»:

Если все настройки сделаны правильно, а ошибка все равно появляется, то попробуем определить ошибочную запись в XML-файле обмена. В нашем случае это файл Message_002_001.xml. Наименование файлов обмена формируется по принципу Message_КодУзлаСистемыИсточника_КодУзлаСистемыПриемника: 

У меня, в отличие от приведенного выше скриншота, коды узлов были наоборот (001 - Узел 1С, 002 – Узел DIRECTUM), чтобы вы не путались в дальнейшем. Таким образом, видим, что у нас в качестве источника выступает DIRECTUM, а в качестве приемника 1С. Откроем этот файл обмена в Visual Studio и отформатируем его: 

В результате наш отформатированный XML-файл обмена будет выглядеть так:

Сохраним его и попробуем загрузить в 1С с помощью сценария:

  IntegratedSystemCode = "1C81"
  FullFileName = "C:/DIREXCHANGE1C/Message_002_001.xml"
  
  V8App = Connector1C81Get1C80Application(IntegratedSystemCode)
  // Проверить все ли объекты включены в необходимый план обмена
  Object.Environment.SetVar("V8App"; V8App)    
  ExchangePlanName = GetIntegratedSystemParam(IntegratedSystemCode; "ExchangePlan")

  // Создать и проинициализаровать объект ЧтениеХМL
  // Используется VBScript, так как на ISBL невозможно вызывать метод V8App.NewObject("XMLReader")
  ScriptControl = CreateObject("MSScriptControl.ScriptControl")
  ScriptControl.Language = "VBScript"
  ScriptControl.Reset
  ScriptControl.AddObject("V8App"; V8App)    
  XMLReader = ScriptControl.Eval('V8App.NewObject("XMLReader")')
  XMLReader.OpenFile(FullFileName)
  // Создать объект ЧтениеСообшенияОбмена 
  // и начать чтение сообщения
  MessageReader = V8App.ExchangePlans.CreateMessageReader
  MessageReader.BeginRead(XMLReader)
  V8App.ExchangePlans.DeleteChangeRecords(MessageReader.Sender; MessageReader.ReceivedNo)     
  // Читаем данные из сообщения
  while V8App.CanReadXML(XMLReader)
    Data = V8App.ReadXML(XMLReader) 
    Data.ОбменДанными.Отправитель = MessageReader.Sender
    Data.ОбменДанными.Загрузка = TRUE
    Data.Write()
  endwhile    
  // Закончить чтение сообщения и чтение XML
  MessageReader.EndRead() 
  XMLReader.Close
  V8App = NIL
  окно("Загрузка завершена!")

В переменной IntegratedSystemCode нужно указать код интегрированной системы, а в переменной FullFileName путь до сформированного XML-файла с данными для обмена. Сценарий можно доработать, добавив запрос переменной IntegratedSystemCode через InputDialog, FullFileName получать из табличной части по коду системы и добавить обработку исключений, т.к. мы ждем, что появится ошибка. Я по своей натуре существо очень ленивое, поэтому оставил его в таком виде. В результате работы сценария мы получим ошибку: 

Теперь мы видим строку и столбец «[4369,2]» с ошибочными данными в XML-файле обмена Message_002_001.xml. Снова открываем этот файл в Visual Studio и переходим к указанной в ошибке строке: 

Тут сразу видно, что с этой записью что-то не то, но чтобы убедиться в этом окончательно, выгрузим данные из 1С с помощью внешней обработки ВыгрузкаЗагрузкаДанныхXML.epf, которую можно найти на диске ИТС или в интернете. Для этого запускаем 1С Предприятие и через пункт меню Файл\Открыть открываем обработку ВыгрузкаЗагрузкаДанныхXML.epf. Указываем имя файла для выгрузки, отмечаем какой объект 1С необходимо выгрузить и нажимаем кнопку «Выгрузить данные». 

На скриншоте не указан период выгрузки, т.к. у меня база 1С была почти пустая. Если у вас в интегрируемых объектах 1С скопилось много данных (например, за несколько лет), то период выгрузки стоит обязательно указать, иначе такой выгрузкой можно очень сильно подвесить систему. Как правило, чтобы оценить правильность формирования XML-файла с данными, достаточно выгрузить 2-3 записи.

После того, как данные будут выгружены, открываем сформированный XML-файл с выгруженными данными и начинаем сравнивать, чем наша неправильно сформированная запись отличается от выгруженных из 1С. В моем случае правильно сформированная запись для выгрузки должна выглядеть так: 

Сравнив её с ошибочной записью, видим, что почему-то не заполнены некоторые реквизиты значениями по умолчанию:

Для реквизита типа справочник, вместо пустого значения должны были быть нули «00000000-0000-0000-0000-000000000000», для реквизита типа число должен стоять «0», а не пустая строка, для логического реквизита вместо пустой строки должно быть «true» или «false».

Далее можно действовать исходя из поставленной перед вами задачи:

  1. Удалить ошибочную запись из XML-файла обмена, провести загрузку данных с помощью сценария указанного выше и скорректировать «Время последней выгрузки» в настройках интегрированной системы на текущее (чтобы эта запись в обмен больше не попадала).
  2. Дополнить ошибочную запись XML-файла обмена недостающими данными, провести загрузку данных с помощью сценария указанного выше и скорректировать «Время последней выгрузки» в настройках интегрированной системы на текущее (чтобы эта запись в обмен больше не попадала).
  3. Попытаться найти причину, почему XML-файл сформировался неправильно, и устранить её.

Чтобы найти причину, почему XML-файл формируется неправильно, потребуется добавить отладочную информацию в функции коннектора и в XSL-шаблон преобразования. Об этом поговорим более подробно в следующем материале. 

ВыгрузкаЗагрузкаДанныхXML_для_1С81.zip (65,86 Кб)

ВыгрузкаЗагрузкаДанныхXML_для_1С82.zip (67,53 Кб)

Сергей Радыгин

Добрый день.

Вопрос по выгрузке данных из 1С в xml-файл.

Насколько я понял, на выгрузку данных из 1С можно повлиять только 2-мя способами:

- задать количество объектов 1С (добавить/удалить);

- с помощью параметра «Время последней выгрузки» влиять на кол-во записей;

Повлиять на содержимое выгружаемых данных (добавить/удалить реквизиты, подготовить данные специальным образом) возможностей нет. Так?

Дмитрий Тарасов

Есть стандартный сценарий "Выполнить подготовку объектов 1С к загрузке в DIRECTUM"

ОПИСАНИЕ
Сценарий выполняет регистрацию изменений всех настроенных объектов для выбранной интегрированной системы 1С. Список объектов получается из справочника "Настройки обмена данными с интегрированными системами", отфильтрованного по интегрированной системе и типу обмена "Загрузка в DIRECTUM". Регистрация изменений всех настроенных объектов 1С необходима для того, чтобы коннектор учитывал все данные этих объектов, в том числе и измененные до создания плана обмена.
Сценарий необходимо выполнять после первоначальной настройки коннектора и после каждого изменения настройки (в случае добавления новых синхронизируемых объектов 1С или изменения плана обмена).
 
После запуска сценария будет произведен полный обмен данными.
Для тестирования интеграции можно создать тестовую запись в тестируемом справочнике. Затем просто вносите изменения в эту запись и выполняете действие интеграции по кнопке "Выполнить". После этого проверяете результат и корректируете настройки в случае необходимости.
Сергей Радыгин

Доброго времени суток.

После выполнения синхронизации по кнопке "Выполнить" остаётся подключение к 1С - в 1С в списке активных подключений показывает активное подключение с типом приложения "COM-соединение". Причём, сколько раз выполнялась синхронизация, столько подключений и висит. 

Синхронизировал справочник "Валюты". В настройках простейшее вычисление только для 1 реквизита - GUID:

  GUID = '[Ref]'
  Result = GUID

Подскажите, пожалуйста, как правильно настроить коннектор так, чтобы COM-соединение закрывалось после окончания синхронизации? Или хотя бы использовалось уже существующее соединение (если оно есть), а не создавалось новое.

Параметры системы:

  DIRECTUM Версия: 4.9.1
  IS-Builder 7.10.2.2211
  Версия коннектора: 4.9.0.1005
  1С:Предприятие 8.2 (8.2.17.169) УПП редакция 1.2 (1.2.25.1 (UC08.76)), Клевер
 
Спасибо.
 

 

Альфия Юмаева

Здравствуйте, подскажите пжл как исправить эту ошибку?   

12.12.2013 09:55:10 Начало выгрузки данных объектов системы "1Cv82"
12.12.2013 09:55:13 ERROR    Ошибка выгрузки данных из интегрированной системы или преобразования данных из формата системы в формат DIRECTUM. (Узел не является узлом распределенной ИБ. Функция "Connector1C82ExportDataFromIntegratedSystem": ошибка в строке 74.
Функция "ConnectorExportDataFromIntegratedSystem": ошибка в строке 1.
Функция "ConnectorExportDataFromIntegratedSystem": ошибка в строке 9.)
12.12.2013 09:55:13 Завершение выгрузки данных объектов системы "1Cv82"
12.12.2013 09:55:13 Начало загрузки данных справочников в систему DIRECTUM
12.12.2013 09:55:13 Завершение загрузки данных справочников в систему DIRECTUM

 

Дмитрий Тарасов

Возможно, когда вы создавали план обмена в конфигураторе 1С, забыли снять галочку "Распределенная информационная система":

Дмитрий Тарасов

Ух как картинку скукожило :) На всякий случай, вот уменьшенный вариант:

Альфия Юмаева

Дмитрий, галочки там нет

Петр Федотов

проверьте ещё параметр "DistributedInformationBase" в настройках справочника интегрированные системы

Дмитрий Тарасов

В итоге проблему получилось решить и если да, то что помогло?

Альфия Юмаева

Дмитрий, в параметре  "DistributedInformationBase" было значение "Да".

Альфия Юмаева

Петр, спасибо)

Владимир Ермаков

добрый день, Дмитрий!

при выгрузке данных из Директум в 1с получил описанную в Вашей статье проблему.

начал сверять структуры выгружаемых/загружаемых xml-файлов и обнаружил, что в файле, формируемом Директумом отсутствуют тэги

false и  d341d3be-b3b1-11dc-a100-0011d85708ff

если я вставляю их вручную  -данные принимаются в 1с через предлагаемый сценарий нормально. 

как мне изменить структуру данных формируемого xml-файла?

заранее спасибо

Владимир

 

 

Владимир Ермаков

уточнение: данные переносятся между справочниками Директум.Организации и 1с.Контрагенты

коды xsl сформированы Директумом.

Директум Стандарт  Версия: 5.0.0.1106

 

IsBuilder

Версия клиентской части: 7.11.0.2503

Версия серверной части: 7.11.0.2602

Дмитрий Тарасов

Владимир, вы наверное забыли указать в дополнительных настройках обмена, что справочник является иерархическим. Или можно просто добавить недостающие теги в XSL-шаблон для данного справочника. Возможно вам поможет вот эта статья: Возможные проблемы и пути их решения при настройке коннектора 1С. Часть 3.

Владимир Ермаков

большое спасибо за совет. все заработало.

столкнулся с другой проблемой:

обмен Директум.НашиОрганизации и 1с.Организации идет только из 1с.

обратно - ошибка преобразования данных:

ERROR                Ошибка преобразования данных из формата DIRECTUM в формат системы или загрузки данных в интегрированную систему. (Ошибка при выполнении обработчика - 'ПередЗаписью'
{ОбщийМодуль.ПроцедурыОбменаДаннымиПоОрганизации.Модуль(1084)}: Ошибка при вызове метода контекста (Добавить)
Несоответствие типов (параметр номер '1') Функция "Connector1C82ImportDataToIntegratedSystem": ошибка в строке 182.
Функция "ConnectorImportDataToIntegratedSystem": ошибка в строке 3.
Функция "ConnectorImportDataToIntegratedSystem": ошибка в строке 14.)

в какую сторону копать?

 

Владимир Ермаков

сверил структуру данных с реэкспортируемыми - "Директумовские" не имеют тега "Префикс" тип строка возвращает "пустое" значение

Дмитрий Тарасов
{ОбщийМодуль.ПроцедурыОбменаДаннымиПоОрганизации.Модуль(1084)}

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

сверил структуру данных с реэкспортируемыми - "Директумовские" не имеют тега "Префикс" тип строка возвращает "пустое" значение

Если какого-то тега не хватает, то добавьте его в XSL-шаблон.

Ольга Белюга

Сергей, добрый день. Удалось решить вашу проблему?

Авторизуйтесь, чтобы написать комментарий