«Ошибка проверки данных XDTO» — ошибка 1С, которую платформа выдаёт, когда данные не подходят под схему: XDTO-пакет конфигурации, формат обмена EnterpriseData или WSDL веб-сервиса. Не заполнено обязательное свойство, строка длиннее разрешённого, значения нет в перечислении — и объект не уходит в другую базу. Разберём, как по тексту дойти до свойства и фасета, как найти объект в синхронизации и как проверить объект XDTO заранее. Основы фабрики и пакетов — в статье XDTO 1С: что это.
Данные XDTO 1С сверяет со схемой при чтении XML и при явном вызове Проверить(). Типичные места:
WSПрокси расходится с WSDL.ОбъектXDTO.Проверить(), ФабрикаXDTO.ПрочитатьXML().В 1С 8.3 ошибка XDTO называет не реквизит базы, а свойство и тип схемы. Сопоставить их — первый шаг.
Текст многострочный: объект, цепочка свойств, в конце нарушение. Шаблоны строк взяты из ресурсов платформы 8.3.27, многоточия — места подстановки.
| Строка в тексте | Что из неё взять |
|---|---|
| Структура объекта '…' не соответствует типу: {URI}Имя | Путь внутри сообщения и тип схемы. URI — пакет и версия формата, например http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8 |
| Проверка свойства '…': и строки «форма», «имя», «тип» | Какое свойство не прошло. Блоков бывает несколько: от внешнего свойства к вложенному |
| Значение: '…' не соответствует простому типу: … | Значение в кавычках и тип, под который оно не подошло |
Последняя строка — само нарушение, варианты собраны в таблице причин ниже. Схематично так выглядит сообщение о длинном ИНН: в пакете EnterpriseData 1.8 у ИНН в ключевых свойствах контрагента maxLength = 12, у КПП — 9.
Ошибка проверки данных XDTO:
Структура объекта '/КлючевыеСвойства' не соответствует типу: {http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8}КлючевыеСвойстваКонтрагент
Проверка свойства 'ИНН':
форма: Элемент
имя: ИНН
тип: …
Значение: '7701234567890' не соответствует простому типу: …
Несоответствие фасету … = '12'
Читайте снизу вверх: нарушение, свойство, объект. Тип из фигурных скобок найдите в конфигураторе: Общие → XDTO-пакеты, пакет с этим пространством имён (в УТ 11.4 — EnterpriseData_1_8_6, EnterpriseData_1_10_3 и другие версии). В свойствах типа видны ограничения.
«Ошибка преобразования данных XDTO» — другая ошибка: XML не читается в тип из-за имени элемента, порядка или пространства имён. «Несоответствие типов XDTO» обычно значит, что в свойство передали значение не того вида.
| Нарушение в тексте | Причина | Что делать |
|---|---|---|
| Отсутствует обязательное свойство | Пустое обязательное свойство. В EnterpriseData 1.8 у номенклатуры обязательна единица измерения, у контрагента — «ЮридическоеФизическоеЛицо» | Заполнить реквизит. Если пусто законно — подставить значение в обработчике: типовой обработчик номенклатуры в УТ 11.4 подставляет «шт» (код 796) |
| Несоответствие фасету … = '…' | Строка длиннее предела. В EnterpriseData 1.8 пределы стоят в основном на кодах: ИНН — 12, КПП — 9, ОКПО — 10 | Коды исправить в базе, текст в своих интеграциях обрезать по maxLength |
| Значение не соответствует значениям фасета перечисления | Значения нет в списке допустимых | Проверить правило конвертации перечисления и версию формата |
| Значение не соответствует образцу | Не подходит под шаблон (pattern) | Привести значение к шаблону |
| Значение: '…' не соответствует простому типу — с dateTime, decimal или boolean | Дата или число переданы строкой не в том виде | Присваивать Дату и Число или брать XMLСтрока() |
| Количество значений свойства (0) меньше заданного в модели (1) | Пустой список, где нужен хотя бы один элемент | Дозаполнить объект или не выгружать его |
| Свойство не может содержать неопределенное значение | Неопределено в свойстве без признака nillable | Заполнить свойство или не устанавливать его |
БСП записывает проблему каждого объекта в регистр предупреждений. В УТ 11.4: НСИ и администрирование → Администрирование → Синхронизация данных, ссылка «Предупреждения при синхронизации данных». В списке есть колонки «Объект», «Описание», «Тип» и команды «Открыть объект», «Журнал регистрации в указанное время». Ошибкам XDTO соответствуют два типа:
Описание первого типа строится по шаблону БСП:
Не удалось выполнить конвертацию в объект формата "Справочник.Контрагенты":
Справочник.Контрагенты
КлючевыеСвойства
ЮридическоеФизическоеЛицо: не заполнено обязательное поле.
Дополнительная информация:
Направление: Отправка.
ПОД: …
ПКО: Справочник_Контрагенты.
Объект: … (e1cib/data/Справочник.Контрагенты?ref=…).
Подробнее см. в журнале регистрации.
В строке «Объект» — представление и навигационная ссылка на элемент. Такая ошибка завершает отправку со статусом ошибки. В режиме пропуска объектов с ошибками проверки по схеме обмен завершается с предупреждениями, а невыгруженные объекты снова регистрируются к отправке. Для узла режим включает ОбменДаннымиXDTOСервер.ПропускатьОбъектыСОшибкамиПроверкиПоСхеме(Узел, Истина).
Полный текст платформы пишется в журнал регистрации: имена событий начинаются с «Обмен данными», уровень «Ошибка», при включённом пропуске — «Предупреждение». При отправке БСП кладёт ссылку на объект в поле «Данные». Где журнал в разных конфигурациях — в статье где в 1С журнал регистрации.
При получении ошибка чтения прерывает загрузку сообщения на проблемном объекте. Если объект прочитан, но упал в обработчике, в строке «Объект» будут тип формата и ключевые свойства: наименование, код, номер, дата. По ним объект ищут и исправляют в базе-отправителе.
Когда предупреждений сотни, их удобнее выгрузить кодом. Функции серверные, нужны права на регистр и журнал. Запрос можно отладить в консоли запросов.
// Поиск объектов с ошибками XDTO в синхронизации (БСП, обмен через EnterpriseData).
// Серверный код; нужны права на регистр предупреждений и журнал регистрации.
// Предупреждения, записанные при отправке. Узел = Неопределено - по всем синхронизациям.
Функция ПредупрежденияXDTOПриОтправке(Узел = Неопределено, НачалоПериода = '00010101') Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Предупреждения.ДатаВозникновения КАК ДатаВозникновения,
| Предупреждения.УзелИнформационнойБазы КАК Узел,
| Предупреждения.ПроблемныйОбъект КАК Объект,
| Предупреждения.ТипПроблемы КАК ТипПроблемы,
| Предупреждения.Причина КАК Причина
|ИЗ
| РегистрСведений.РезультатыОбменаДанными КАК Предупреждения
|ГДЕ
| Предупреждения.ТипПроблемы В (&ТипыПроблем)
| И НЕ Предупреждения.Пропущена
| И Предупреждения.ДатаВозникновения >= &НачалоПериода
| И (&ВсеУзлы ИЛИ Предупреждения.УзелИнформационнойБазы = &Узел)
|
|УПОРЯДОЧИТЬ ПО
| ДатаВозникновения УБЫВ";
ОшибкаОбработчика = Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных;
ТипыПроблем = Новый Массив;
ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта);
ТипыПроблем.Добавить(ОшибкаОбработчика);
Запрос.УстановитьПараметр("ТипыПроблем", ТипыПроблем);
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("ВсеУзлы", Узел = Неопределено);
Запрос.УстановитьПараметр("Узел", Узел);
ТаблицаПредупреждений = Запрос.Выполнить().Выгрузить();
// Ошибка обработчика может быть любой: из них оставляем только те, где есть XDTO.
Результат = ТаблицаПредупреждений.СкопироватьКолонки();
Для Каждого СтрокаПредупреждения Из ТаблицаПредупреждений Цикл
Если СтрокаПредупреждения.ТипПроблемы <> ОшибкаОбработчика
Или СтрНайти(СтрокаПредупреждения.Причина, "XDTO") > 0 Тогда
ЗаполнитьЗначенияСвойств(Результат.Добавить(), СтрокаПредупреждения);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Записи журнала регистрации об ошибках XDTO в обмене: и отправка, и получение.
// В колонке Данные при отправке БСП оставляет ссылку на проблемный объект.
Функция ОшибкиXDTOВЖурналеОбмена(НачалоПериода, КонецПериода) Экспорт
Уровни = Новый Массив;
Уровни.Добавить(УровеньЖурналаРегистрации.Ошибка);
Уровни.Добавить(УровеньЖурналаРегистрации.Предупреждение);
Отбор = Новый Структура("ДатаНачала, ДатаОкончания, Уровень", НачалоПериода, КонецПериода, Уровни);
Записи = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(Записи, Отбор, "Дата, Событие, Уровень, Данные, Комментарий");
Результат = Записи.СкопироватьКолонки();
Для Каждого Запись Из Записи Цикл
// Имя события содержит план обмена и действие, поэтому сравниваем начало строки.
Если СтрНачинаетсяС(Запись.Событие, "Обмен данными")
И СтрНайти(Запись.Комментарий, "XDTO") > 0 Тогда
ЗаполнитьЗначенияСвойств(Результат.Добавить(), Запись);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Из ошибок обработчиков остаются только записи со словом «XDTO». Отбор журнала по событию принимает точные имена, а в имени события обмена есть план обмена и действие, поэтому проверяем начало строки. Период берите узкий: журнал большой базы выгружается долго.
В своих интеграциях объект лучше проверить до отправки. Функция вызывает проверку платформы, а если та упала, обходит объект и возвращает строки вида «Заказ/Клиент/ИНН = "7701234567890": длина 13, по схеме не больше 12». Код серверный.
// Проверка объекта XDTO по схеме с понятным списком нарушений.
// Серверный код: общий модуль (флаг «Сервер») или модуль объекта обработки.
// ОбработкаОшибок - с 8.3.17; на старых платформах - глобальная КраткоеПредставлениеОшибки().
// Возвращает массив строк «путь: что не так». Пустой массив - объект прошёл проверку.
Функция ОшибкиПроверкиXDTO(ОбъектXDTO) Экспорт
Ошибки = Новый Массив;
Попытка
ОбъектXDTO.Проверить();
Исключение
ТекстПлатформы = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
СобратьНарушенияXDTO(ОбъектXDTO, ОбъектXDTO.Тип().Имя, Ошибки);
// Обход не нашёл причину (например, нарушен порядок свойств) - отдаём текст платформы.
Если Ошибки.Количество() = 0 Тогда
Ошибки.Добавить(ТекстПлатформы);
КонецЕсли;
КонецПопытки;
Возврат Ошибки;
КонецФункции
Процедура СобратьНарушенияXDTO(ОбъектXDTO, Путь, Ошибки)
Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл
ПутьСвойства = Путь + "/" + Свойство.Имя;
Если Свойство.ВерхняяГраница = 1 Тогда
Если ОбъектXDTO.Установлено(Свойство) Тогда
ПроверитьЭлементXDTO(ОбъектXDTO.ПолучитьXDTO(Свойство), Свойство, ПутьСвойства, Ошибки);
ИначеЕсли Свойство.НижняяГраница > 0 Тогда
Ошибки.Добавить(ПутьСвойства + ": обязательное свойство не заполнено");
КонецЕсли;
Продолжить;
КонецЕсли;
// Списковое свойство: верхняя граница больше 1 или -1 (без ограничения).
Список = ОбъектXDTO.ПолучитьСписок(Свойство);
Количество = ?(Список = Неопределено, 0, Список.Количество());
Если Количество < Свойство.НижняяГраница Тогда
Ошибки.Добавить(СтрШаблон("%1: элементов %2, по схеме нужно не меньше %3",
ПутьСвойства, XMLСтрока(Количество), XMLСтрока(Свойство.НижняяГраница)));
КонецЕсли;
Если Свойство.ВерхняяГраница > 0 И Количество > Свойство.ВерхняяГраница Тогда
Ошибки.Добавить(СтрШаблон("%1: элементов %2, по схеме не больше %3",
ПутьСвойства, XMLСтрока(Количество), XMLСтрока(Свойство.ВерхняяГраница)));
КонецЕсли;
Для Индекс = 0 По Количество - 1 Цикл
ПроверитьЭлементXDTO(Список.ПолучитьXDTO(Индекс), Свойство,
ПутьСвойства + "[" + XMLСтрока(Индекс + 1) + "]", Ошибки);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьЭлементXDTO(Элемент, Свойство, Путь, Ошибки)
Если Элемент = Неопределено Тогда
Если Не Свойство.ВозможноПустое Тогда
Ошибки.Добавить(Путь + ": пустое значение (nil), а схема его не допускает");
КонецЕсли;
ИначеЕсли ТипЗнч(Элемент) = Тип("ОбъектXDTO") Тогда
СобратьНарушенияXDTO(Элемент, Путь, Ошибки);
ИначеЕсли ТипЗнч(Элемент) = Тип("ЗначениеXDTO") Тогда
Нарушение = НарушениеОграниченийXDTO(Элемент.ЛексическоеЗначение, Свойство.Тип);
Если Не ПустаяСтрока(Нарушение) Тогда
Ошибки.Добавить(СтрШаблон("%1 = ""%2"": %3", Путь, Лев(Элемент.ЛексическоеЗначение, 100), Нарушение));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Описание нарушенного ограничения или пустая строка, если значение подходит под тип.
Функция НарушениеОграниченийXDTO(ЛексическоеЗначение, ТипЗначения)
Если ТипЗнч(ТипЗначения) <> Тип("ТипЗначенияXDTO") Тогда
Возврат "";
КонецЕсли;
Попытка
ТипЗначения.Проверить(ЛексическоеЗначение);
Возврат "";
Исключение
ТекстПлатформы = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Длина = СтрДлина(ЛексическоеЗначение);
Ограничение = ЗначенияФасетаXDTO(ТипЗначения, ВидФасетаXDTO.МаксДлина);
Если Ограничение.Количество() > 0 И Длина > Число(Ограничение[0]) Тогда
Возврат СтрШаблон("длина %1, по схеме не больше %2", XMLСтрока(Длина), Ограничение[0]);
КонецЕсли;
Ограничение = ЗначенияФасетаXDTO(ТипЗначения, ВидФасетаXDTO.МинДлина);
Если Ограничение.Количество() > 0 И Длина < Число(Ограничение[0]) Тогда
Возврат СтрШаблон("длина %1, по схеме не меньше %2", XMLСтрока(Длина), Ограничение[0]);
КонецЕсли;
Ограничение = ЗначенияФасетаXDTO(ТипЗначения, ВидФасетаXDTO.Длина);
Если Ограничение.Количество() > 0 И Длина <> Число(Ограничение[0]) Тогда
Возврат СтрШаблон("длина %1, по схеме ровно %2", XMLСтрока(Длина), Ограничение[0]);
КонецЕсли;
Ограничение = ЗначенияФасетаXDTO(ТипЗначения, ВидФасетаXDTO.Перечисление);
Если Ограничение.Количество() > 0 И Ограничение.Найти(ЛексическоеЗначение) = Неопределено Тогда
Возврат "значения нет в перечислении: " + СтрСоединить(Ограничение, ", ");
КонецЕсли;
Ограничение = ЗначенияФасетаXDTO(ТипЗначения, ВидФасетаXDTO.Образец);
Если Ограничение.Количество() > 0 Тогда
Возврат "не подходит под шаблон " + Ограничение[0];
КонецЕсли;
// Остальное - вид даты, числа, булева или разрядность числа: нужен текст платформы.
Возврат ТекстПлатформы;
КонецФункции
// Значения фасета заданного вида. Ограничение может быть объявлено у базового типа,
// поэтому поднимаемся по цепочке, пока не дойдём до встроенного типа XML Schema.
Функция ЗначенияФасетаXDTO(ТипЗначения, ВидФасета) Экспорт
Значения = Новый Массив;
ТекущийТип = ТипЗначения;
Пока ТипЗнч(ТекущийТип) = Тип("ТипЗначенияXDTO")
И ТекущийТип.URIПространстваИмен <> "http://www.w3.org/2001/XMLSchema" Цикл
Если ТекущийТип.Фасеты <> Неопределено Тогда
Для Каждого ТекущийФасет Из ТекущийТип.Фасеты Цикл
Если ТекущийФасет.Вид = ВидФасета Тогда
Значения.Добавить(ТекущийФасет.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Значения.Количество() > 0 Тогда
Прервать;
КонецЕсли;
ТекущийТип = ТекущийТип.БазовыйТип;
КонецЦикла;
Возврат Значения;
КонецФункции
// Пример вызова: своя выгрузка проверяет объект перед записью в XML.
Процедура ЗаписатьОбъектXDTOСПроверкой(ЗаписьXML, ОбъектXDTO) Экспорт
Ошибки = ОшибкиПроверкиXDTO(ОбъектXDTO);
Если Ошибки.Количество() > 0 Тогда
ВызватьИсключение "Объект " + ОбъектXDTO.Тип().Имя + " не соответствует схеме:"
+ Символы.ПС + СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
КонецПроцедуры
ОбъектXDTO.Проверить() — проверка платформой; обход запускается, только если она упала.ПолучитьXDTO(), списковое — через ПолучитьСписок(), которое для неспискового свойства вызывает исключение. Ветки разделены по ВерхняяГраница.ТипЗначения.Проверить(ЛексическоеЗначение) проверяет значение со всеми фасетами; дальше код только уточняет, какой фасет нарушен.ЗначенияФасетаXDTO() поднимается по БазовыйТип: ограничение может быть объявлено у базового типа. Перечисление — несколько фасетов одного вида, поэтому результат — массив.Коды не режут: обрезанный ИНН всё равно неверный. В EnterpriseData 1.8 ограничения длины стоят в основном на кодах — ИНН, КПП, ОКПО, ОКАТО, ОКТМО, номерах счетов, а в УТ 11.4 у контрагента ИНН, КПП и код по ОКПО той же длины, что и в формате. Поэтому в типовом обмене ошибка длины обычно идёт от доработки. Обрезка нужна в своих интеграциях: во внешних схемах нередко ограничены и наименования, и комментарии. Процедура ниже заполняет объект XDTO из структуры и укорачивает строки по maxLength.
// Заполняет простые свойства объекта XDTO из структуры: ключ - имя свойства.
// Строки длиннее maxLength укорачиваются, описания обрезок - в массиве Обрезанные.
// Фабрика - та, что создала объект: ФабрикаXDTO для пакетов конфигурации,
// свойство ФабрикаXDTO у WSПрокси для веб-сервиса. ЗначенияФасетаXDTO - из листинга выше.
Процедура ЗаполнитьОбъектXDTOСОбрезкой(ОбъектXDTO, Данные, Фабрика, Обрезанные) Экспорт
Свойства = ОбъектXDTO.Свойства();
Для Каждого КлючИЗначение Из Данные Цикл
Свойство = Свойства.Получить(КлючИЗначение.Ключ);
Если Свойство = Неопределено Тогда
ВызватьИсключение СтрШаблон("В типе %1 нет свойства %2", ОбъектXDTO.Тип().Имя, КлючИЗначение.Ключ);
КонецЕсли;
Значение = КлючИЗначение.Значение;
// Пустые значения не устанавливаем; списки и вложенные объекты заполняются отдельно.
Если Значение = Неопределено Или Свойство.ВерхняяГраница <> 1
Или ТипЗнч(Свойство.Тип) <> Тип("ТипЗначенияXDTO") Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Укороченная = СтрокаПоДлинеСвойстваXDTO(Значение, Свойство);
Если Укороченная <> Значение Тогда
Обрезанные.Добавить(СтрШаблон("%1: %2 -> %3 симв.", Свойство.Имя,
XMLСтрока(СтрДлина(Значение)), XMLСтрока(СтрДлина(Укороченная))));
Значение = Укороченная;
КонецЕсли;
КонецЕсли;
// Шаблон и перечисление платформа проверит сама; если ошибка случится здесь - добавим имя свойства.
Попытка
ОбъектXDTO.Установить(Свойство, Фабрика.Создать(Свойство.Тип, Значение));
Исключение
ВызватьИсключение СтрШаблон("Свойство %1 = ""%2"": %3", Свойство.Имя, Значение,
ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Строка, укороченная до maxLength свойства. Нет ограничения - строка без изменений.
Функция СтрокаПоДлинеСвойстваXDTO(Значение, Свойство) Экспорт
Если ТипЗнч(Свойство.Тип) <> Тип("ТипЗначенияXDTO") Тогда
Возврат Значение;
КонецЕсли;
МаксДлина = ЗначенияФасетаXDTO(Свойство.Тип, ВидФасетаXDTO.МаксДлина);
Если МаксДлина.Количество() = 0 Или СтрДлина(Значение) <= Число(МаксДлина[0]) Тогда
Возврат Значение;
КонецЕсли;
Возврат СокрП(Лев(Значение, Число(МаксДлина[0])));
КонецФункции
WSПрокси, и тип из неё глобальная ФабрикаXDTO не примет.Создать(), а остальные фасеты проверяет платформа. Исключение дополняем именем свойства и значением, чтобы ошибку было видно сразу.Обрезанные пишите в журнал регистрации: о компромиссе должен знать тот, кто ведёт данные.Обработчик типового обмена дорабатывают в расширении, без снятия с поддержки: заимствуют общий модуль МенеджерОбменаЧерезУниверсальныйФормат и добавляют обработчик после типового «ПриОтправкеДанных» (в УТ 11.4 и КА 2.5 для номенклатуры — ПКО_Справочник_Номенклатура_Отправка_ПриОтправкеДанных). Там данные ещё лежат структурой ДанныеXDTO с вложенной «КлючевыеСвойства», и значение попадает в объект до проверки схемы. Пример — в статье Конвертация данных 1С.
Исключение Сообщить("Ошибка XDTO") выбрасывает путь, свойство и фасет. Сохраняйте ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) или результат ОшибкиПроверкиXDTO().Формат() схеме не подходит: в тексте будет «не соответствует простому типу» с dateTime или decimal.Нет: объект, который не соответствует схеме, вторая база не прочитает. Максимум — режим пропуска: остальные данные уходят, проблемные ждут исправления в списке предупреждений.
Обновление меняет правила конвертации и список версий формата; версия обмена хранится в узле (реквизит ВерсияФорматаОбмена). Новые правила заполняют свойства иначе, и первыми падают объекты с нестандартными данными. Обновите обе программы и разберите оставшиеся предупреждения.
В конфигураторе: Общие → XDTO-пакеты → пакет версии формата → тип, например КлючевыеСвойстваКонтрагент → свойство. Из кода — ЗначенияФасетаXDTO(): тип через ФабрикаXDTO.Тип(URI, "КлючевыеСвойстваКонтрагент"), свойство через Свойства.Получить("ИНН").
Как правило, нет: неверные данные сформировал отправитель. Найдите объект по типу и ключевым свойствам из журнала получателя, исправьте у отправителя и повторите синхронизацию. Исключение — ваши обработчики получения: в их тексте стоит «Направление: Получение».
Если ошибки идут потоком после обновления или в обмене много доработанных правил, разбор журнала и правку обработчиков в расширении быстрее сделает программист, который уже чинил такие обмены. Для интеграций с сайтом и внешними сервисами посмотрите услугу обмен 1С с сайтом, для синхронизации между базами разместите задачу на площадке: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.