Материал подготовлен совместно с Петром Федотовым
В этой статье мы постараемся рассмотреть основные ошибки, возникающие при обмене данными через коннектор 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».
Далее можно действовать исходя из поставленной перед вами задачи:
Чтобы найти причину, почему XML-файл формируется неправильно, потребуется добавить отладочную информацию в функции коннектора и в XSL-шаблон преобразования. Об этом поговорим более подробно в следующем материале.
Добрый день.
Вопрос по выгрузке данных из 1С в xml-файл.
Насколько я понял, на выгрузку данных из 1С можно повлиять только 2-мя способами:
- задать количество объектов 1С (добавить/удалить);
- с помощью параметра «Время последней выгрузки» влиять на кол-во записей;
Повлиять на содержимое выгружаемых данных (добавить/удалить реквизиты, подготовить данные специальным образом) возможностей нет. Так?
Есть стандартный сценарий "Выполнить подготовку объектов 1С к загрузке в DIRECTUM"
Доброго времени суток.
После выполнения синхронизации по кнопке "Выполнить" остаётся подключение к 1С - в 1С в списке активных подключений показывает активное подключение с типом приложения "COM-соединение". Причём, сколько раз выполнялась синхронизация, столько подключений и висит.
Синхронизировал справочник "Валюты". В настройках простейшее вычисление только для 1 реквизита - GUID:
Подскажите, пожалуйста, как правильно настроить коннектор так, чтобы COM-соединение закрывалось после окончания синхронизации? Или хотя бы использовалось уже существующее соединение (если оно есть), а не создавалось новое.
Параметры системы:
Здравствуйте, подскажите пжл как исправить эту ошибку?
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-файлов и обнаружил, что в файле, формируемом Директумом отсутствуют тэги
если я вставляю их вручную -данные принимаются в 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.)
в какую сторону копать?
сверил структуру данных с реэкспортируемыми - "Директумовские" не имеют тега "Префикс" тип строка возвращает "пустое" значение
Посмотрите в конфигураторе 1С код в этом модуле в данной строке. Возможно, необходимо заполнить какие-то обязательные реквизиты, которые анализируются в этом модуле.
Если какого-то тега не хватает, то добавьте его в XSL-шаблон.
Сергей, добрый день. Удалось решить вашу проблему?
Авторизуйтесь, чтобы написать комментарий