Как выполнить проверку дублей контрагентов перед записью в 1С при импорте из JSON?

Программист 1С v8.3 (Управляемые формы)
← На главную

При регулярном импорте данных о контрагентах из внешних систем, например, через JSON, одной из ключевых задач является предотвращение создания дублирующихся элементов в справочнике. Если процедура импорта выполняется часто (каждые 5-10 минут), крайне важно реализовать эффективный и надежный механизм проверки на дубли, чтобы обеспечить целостность данных и оптимизировать производительность системы.

Мы рассмотрим различные методы проверки дублей, начиная от простых функций поиска по реквизитам и заканчивая более сложными запросами и оптимизациями, а также разберем, как правильно обновлять данные при обнаружении дубля.

Поиск дублей по ключевым реквизитам: НайтиПоНаименованию и НайтиПоРеквизиту

Для начала, давайте рассмотрим наиболее распространенные и простые методы поиска дублей, доступные в 1С. Это методы НайтиПоНаименованию и НайтиПоРеквизиту объекта Справочники.Контрагенты. Эти методы позволяют быстро проверить наличие контрагента по одному из его полей.

Метод НайтиПоНаименованию удобен для поиска по полному или частичному наименованию контрагента. Однако, важно учитывать, что наименования могут содержать лишние пробелы или отличаться регистром. Поэтому, при сравнении наименований, мы всегда рекомендуем использовать функцию СокрЛП() для удаления начальных и конечных пробелов, а также, при необходимости, приводить строки к одному регистру (например, с помощью ВРег()).

Посмотрим на пример использования НайтиПоНаименованию:


Процедура СоздатьКонтрагента(СтруктураСДанными)

    КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка;

    // Подготавливаем наименование для поиска, удаляя лишние пробелы
    ИскомоеНаименование = СокрЛП(СтруктураСДанными.Наименование);

    // Ищем контрагента по наименованию
    КонтрагентСсылка = Справочники.Контрагенты.НайтиПоНаименованию(ИскомоеНаименование);

    Если КонтрагентСсылка.Пустая() Тогда
        // Если контрагент не найден, создаем новый
        КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    Иначе
        // Если контрагент найден, получаем его объект для обновления
        КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
        // Мы можем добавить запись в журнал или сообщение о том, что контрагент будет обновлен
        // Сообщить("Контрагент '" + КонтрагентОбъект.Наименование + "' найден и будет обновлен.");
    КонецЕсли;

    // Далее следует заполнение или обновление реквизитов контрагента
    Если КонтрагентОбъект <> Неопределено Тогда
        // Заполнение реквизитов из СтруктураСДанными
        КонтрагентОбъект.ПометкаУдаления = СтруктураСДанными.ПометкаУдаления;
        КонтрагентОбъект.Наименование = СтруктураСДанными.Наименование;
        // ... другие реквизиты ...
        
        Попытка
            КонтрагентОбъект.Записать();
        Исключение Как Искл
            Сообщить("Ошибка при записи контрагента '" + СтруктураСДанными.Наименование + "': " + Искл.Описание);
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Метод НайтиПоРеквизиту позволяет искать контрагентов по любому реквизиту справочника. Это особенно полезно для поиска по уникальным идентификаторам, таким как ИдентификационныйКодЛичности (ИИН/БИН для юридических и физических лиц), ИНН, КПП или другим полям, которые гарантируют уникальность записи. Однако, при использовании этого метода, мы должны быть очень внимательны к типам данных.

Как было замечено в обсуждении, одной из частых причин, по которой НайтиПоРеквизиту может "не сработать", является несовпадение типов данных между значением, которое мы ищем (например, из JSON), и типом реквизита в конфигурации 1С. Например, если в JSON ИдентификационныйКодЛичности приходит как строка, а в 1С реквизит имеет тип "Число", прямой поиск не даст результата. В таких случаях необходимо выполнить явное преобразование типов.

Разберем пример поиска по ИдентификационныйКодЛичности с учетом преобразования типов:


Процедура СоздатьКонтрагента(СтруктураСДанными)

    КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка;
    КонтрагентОбъект = Неопределено;

    // Значение ИИН/БИН, которое пришло в структуре данных
    ПередаваемыйИИН = СтруктураСДанными.ИдентификационныйКодЛичности;

    // Определяем ожидаемый тип реквизита "ИдентификационныйКодЛичности" в 1С
    // Создаем временную пустую ссылку, чтобы получить доступ к метаданным реквизита
    ТипРеквизитаИИН = ТипЗнч(Справочники.Контрагенты.ПустаяСсылка.ИдентификационныйКодЛичности);

    // Проверяем тип пришедшего значения и приводим его к типу реквизита 1С, если необходимо
    Если ТипЗнч(ПередаваемыйИИН) <> ТипРеквизитаИИН Тогда
        Попытка
            Если ТипРеквизитаИИН = Тип("Число") Тогда
                ПередаваемыйИИН = Число(ПередаваемыйИИН);
            ИначеЕсли ТипРеквизитаИИН = Тип("Строка") Тогда
                ПередаваемыйИИН = Строка(ПередаваемыйИИН);
            КонецЕсли;
        Исключение
            // Если преобразование не удалось (например, строка "abc" в число),
            // то устанавливаем Неопределено, чтобы избежать некорректного поиска
            Сообщить("Внимание! Не удалось преобразовать ИИН/БИН '" + СтруктураСДанными.ИдентификационныйКодЛичности + "' к ожидаемому типу.");
            ПередаваемыйИИН = Неопределено;
        КонецПопытки;
    КонецЕсли;

    // Выполняем поиск по ИИН/БИН, если значение корректно
    Если ПередаваемыйИИН <> Неопределено Тогда
        КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИдентификационныйКодЛичности", ПередаваемыйИИН);
    КонецЕсли;

    // Если по ИИН не нашли, или ИИН не был предоставлен/корректен,
    // пробуем найти по наименованию как дополнительный критерий
    Если КонтрагентСсылка.Пустая() Тогда
        ИскомоеНаименование = СокрЛП(СтруктураСДанными.Наименование);
        КонтрагентСсылка = Справочники.Контрагенты.НайтиПоНаименованию(ИскомоеНаименование);
    КонецЕсли;

    // Определяем, будем ли создавать новый элемент или обновлять существующий
    Если КонтрагентСсылка.Пустая() Тогда
        КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    Иначе
        КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
    КонецЕсли;

    // Заполнение или обновление реквизитов
    Если КонтрагентОбъект <> Неопределено Тогда
        // ... (все остальные реквизиты) ...
        КонтрагентОбъект.ИдентификационныйКодЛичности = ПередаваемыйИИН; // Используем уже обработанное значение
        КонтрагентОбъект.Наименование = СтруктураСДанными.Наименование;
        // ... (другие реквизиты) ...
        
        Попытка
            КонтрагентОбъект.Записать();
        Исключение Как Искл
            Сообщить("Ошибка при записи контрагента '" + СтруктураСДанными.Наименование + "': " + Искл.Описание);
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Комплексный подход к поиску дублей и использование запросов

Хотя методы НайтиПоНаименованию и НайтиПоРеквизиту просты в использовании, они могут быть недостаточно эффективны при большом объеме данных или при необходимости поиска по сложной комбинации реквизитов. Например, для юридических лиц надежным идентификатором является комбинация ИНН и КПП, а для физических лиц или ИП — ИНН или/и паспортные данные. В таких сценариях мы настоятельно рекомендуем использовать механизм запросов 1С.

Запросы позволяют нам гибко строить условия поиска, объединяя несколько полей с помощью логических операторов. Это обеспечивает высокую производительность и точность, особенно если поля, по которым мы ищем, проиндексированы.

Рассмотрим пример запроса для поиска контрагента по комбинации ИНН и КПП (или только по ИНН, если КПП отсутствует):


Процедура СоздатьКонтрагента(СтруктураСДанными)

    КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка;
    КонтрагентОбъект = Неопределено;

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Контрагенты.Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.ИНН = &ИНН
        |    И Контрагенты.КПП = &КПП"; // Или другое условие, если КПП может отсутствовать

    // Устанавливаем параметры запроса
    Запрос.УстановитьПараметр("ИНН", СтруктураСДанными.ИНН);
    Запрос.УстановитьПараметр("КПП", СтруктураСДанными.КПП); // Если КПП может быть пустым, нужно корректировать условие

    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Если Выборка.Следующий() Тогда
            КонтрагентСсылка = Выборка.Ссылка;
        КонецЕсли;
    КонецЕсли;

    // Если по ИНН+КПП не нашли, можно добавить поиск по ИИН или Наименованию
    Если КонтрагентСсылка.Пустая() И СтруктураСДанными.Свойство("ИдентификационныйКодЛичности") Тогда
        // Подготовка ИИН с учетом типов, как в предыдущем примере
        ПередаваемыйИИН = СтруктураСДанными.ИдентификационныйКодЛичности;
        // ... (логика преобразования типа для ПередаваемыйИИН) ...
        Если ПередаваемыйИИН <> Неопределено Тогда
            КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИдентификационныйКодЛичности", ПередаваемыйИИН);
        КонецЕсли;
    КонецЕсли;

    Если КонтрагентСсылка.Пустая() Тогда
        КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    Иначе
        КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
        // Сообщить("Контрагент найден по реквизитам и будет обновлен.");
    КонецЕсли;

    // Заполнение или обновление реквизитов
    Если КонтрагентОбъект <> Неопределено Тогда
        // ... (все реквизиты) ...
        Попытка
            КонтрагентОбъект.Записать();
        Исключение Как Искл
            Сообщить("Ошибка при записи контрагента '" + СтруктураСДанными.Наименование + "': " + Искл.Описание);
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Для случая, когда КПП может отсутствовать или быть не обязательным, мы можем изменить запрос, чтобы он сначала искал по ИНН и КПП, а затем, если КПП не указан, только по ИНН. Или же использовать конструкцию, где КПП является необязательным:


Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Ссылка
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.ИНН = &ИНН
    |    И (Контрагенты.КПП = &КПП И &КПП <> """") // Ищем по КПП, только если оно указано
    |    ИЛИ (Контрагенты.КПП = &КПП_Пустое И &КПП = """") // Если КПП пустое, ищем по пустым КПП
    |    ИЛИ (&КПП = """")"; // Если переданное КПП пустое, то игнорируем его при поиске

Запрос.УстановитьПараметр("ИНН", СтруктураСДанными.ИНН);
Запрос.УстановитьПараметр("КПП", СтруктураСДанными.КПП);
Запрос.УстановитьПараметр("КПП_Пустое", "");
    
// ... дальнейшая обработка запроса

Такой запрос может стать сложным. Альтернативным и часто более читаемым решением является выполнение нескольких запросов или использование условных конструкций в коде 1С, чтобы динамически формировать параметры запроса или использовать разные условия поиска.

Обработка найденных дублей: обновление или пропуск

Когда мы успешно находим дубликат контрагента, перед нами встает выбор: что делать дальше? Обычно мы рассматриваем несколько основных сценариев:

  1. Обновление существующего элемента: Это наиболее распространенный сценарий при синхронизации данных. Если дубликат найден, мы получаем существующий объект контрагента и обновляем его реквизиты данными, пришедшими из внешней системы. Это гарантирует, что информация в нашей базе всегда актуальна.
  2. Пропуск записи: Если мы не хотим обновлять информацию о контрагенте или уверены, что данные в нашей базе являются первичными, мы можем просто пропустить запись дубля. Этот вариант подходит, когда внешняя система служит лишь источником новых записей, но не источником для обновления уже существующих.
  3. Логирование: В любом из вышеперечисленных случаев крайне полезно фиксировать информацию о найденных дублях и предпринятых действиях (например, "Контрагент обновлен", "Контрагент пропущен") в журнале регистрации 1С или в специальном регистре сведений. Это позволяет отслеживать процесс синхронизации и оперативно реагировать на возможные проблемы.

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

Оптимизация производительности при частых импортах

Учитывая, что процедура импорта будет выполняться каждые 5-10 минут, мы должны уделить особое внимание оптимизации производительности. Медленная процедура может привести к чрезмерной нагрузке на сервер и замедлению работы всей системы.

  1. Индексирование реквизитов: Убедитесь, что все реквизиты, по которым осуществляется поиск (например, ИНН, КПП, ИдентификационныйКодЛичности, Наименование), проиндексированы в вашей конфигурации 1С. Индексирование значительно ускоряет выполнение запросов и методов поиска, так как базе данных не приходится сканировать всю таблицу. Это фундаментальный шаг для повышения производительности.
  2. Пакетная обработка: Вместо обработки каждого контрагента по одному в цикле, рассмотрите возможность пакетной обработки. Это может быть реализовано несколькими способами:
    • Временные таблицы в запросах: Если вы получаете большой массив данных, вы можете загрузить его во временную таблицу в запросе, а затем выполнить один сложный запрос, который найдет все дубликаты и/или новые элементы. Это значительно снижает количество обращений к базе данных.
    • Сбор данных и однократная запись: Можно сначала пройти по всем данным из JSON, определить, какие контрагенты являются новыми, а какие нужно обновить, собрать эти списки, а затем выполнить запись или обновление одним пакетом, если это возможно для вашей логики. Например, собирать объекты в массив и выполнять их запись в отдельной транзакции.
  3. Кэширование: Если список контрагентов относительно стабилен и вы импортируете только часть данных или проверяете дубликаты по уже известным идентификаторам, рассмотрите возможность кэширования уже загруженных контрагентов в памяти (например, в Соответствии ИИН -> СсылкаНаКонтрагента) на короткий период времени. Это позволит избежать повторных обращений к базе данных для уже проверенных или недавно добавленных элементов в рамках одного сеанса или регламентного задания. Однако, при частых изменениях данных или очень большом объеме справочника, кэширование может потребовать слишком много памяти или приводить к несогласованности данных, поэтому его применение требует тщательного анализа.

Использование уникальных идентификаторов из внешней системы

Наиболее надежным и эффективным способом проверки дублей при интеграции с внешней системой является использование ее собственного уникального идентификатора. Если исходная база данных присваивает каждому контрагенту уникальный идентификатор (например, GUID), крайне рекомендуется хранить этот идентификатор в вашей базе 1С. Для этого можно создать дополнительный реквизит справочника "Контрагенты", например, с именем ИдентификаторВнешнейСистемы.

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


Процедура СоздатьКонтрагента(СтруктураСДанными)

    КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка;

    // Предполагаем, что СтруктураСДанными содержит поле "ИдентификаторВнешнейСистемы"
    Если СтруктураСДанными.Свойство("ИдентификаторВнешнейСистемы") И ЗначениеЗаполнено(СтруктураСДанными.ИдентификаторВнешнейСистемы) Тогда
        // Ищем контрагента по уникальному идентификатору из внешней системы
        КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИдентификаторВнешнейСистемы", СтруктураСДанными.ИдентификаторВнешнейСистемы);
    КонецЕсли;

    // Если по внешнему ID не нашли, можно перейти к поиску по другим реквизитам
    Если КонтрагентСсылка.Пустая() Тогда
        // Здесь можно добавить логику поиска по ИИН, ИНН+КПП или наименованию,
        // как мы рассматривали ранее, чтобы найти "старые" дубликаты,
        // у которых еще нет заполненного "ИдентификаторВнешнейСистемы".
        // Если такой дубль найден, то при обновлении можно заполнить ему "ИдентификаторВнешнейСистемы".
        // ...
        Сообщить("Контрагент с внешним ID '" + СтруктураСДанными.ИдентификаторВнешнейСистемы + "' не найден, ищем по другим реквизитам или создаем.");
        
        // Например, поиск по ИИН, если внешний ID не помог или отсутствует
        Если СтруктураСДанными.Свойство("ИдентификационныйКодЛичности") И ЗначениеЗаполнено(СтруктураСДанными.ИдентификационныйКодЛичности) Тогда
            ПередаваемыйИИН = СтруктураСДанными.ИдентификационныйКодЛичности;
            // ... (логика преобразования типа для ПередаваемыйИИН) ...
            Если ПередаваемыйИИН <> Неопределено Тогда
                КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИдентификационныйКодЛичности", ПередаваемыйИИН);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

    КонтрагентОбъект = Неопределено;
    Если КонтрагентСсылка.Пустая() Тогда
        КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    Иначе
        КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
        // При первом обнаружении существующего контрагента без внешнего ID,
        // мы можем присвоить ему ИдентификаторВнешнейСистемы
        Если Не ЗначениеЗаполнено(КонтрагентОбъект.ИдентификаторВнешнейСистемы) И ЗначениеЗаполнено(СтруктураСДанными.ИдентификаторВнешнейСистемы) Тогда
            КонтрагентОбъект.ИдентификаторВнешнейСистемы = СтруктураСДанными.ИдентификаторВнешнейСистемы;
        КонецЕсли;
    КонецЕсли;

    // Заполнение или обновление реквизитов
    Если КонтрагентОбъект <> Неопределено Тогда
        // ... (все остальные реквизиты) ...
        КонтрагентОбъект.Наименование = СтруктураСДанными.Наименование;
        КонтрагентОбъект.ИдентификаторВнешнейСистемы = СтруктураСДанными.ИдентификаторВнешнейСистемы; // Убеждаемся, что ID всегда актуален
        // ...
        Попытка
            КонтрагентОбъект.Записать();
        Исключение Как Искл
            Сообщить("Ошибка при записи контрагента '" + СтруктураСДанными.Наименование + "': " + Искл.Описание);
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Поиск по неточным совпадениям (фаззи-поиск)

В некоторых случаях данные могут поступать из разных источников и содержать опечатки, сокращения или незначительные различия в наименованиях. В таких ситуациях простые методы точного поиска могут быть неэффективны, и мы можем рассмотреть применение методов неточного поиска (фаззи-поиска).

Фаззи-поиск использует специальные алгоритмы сравнения строк, такие как расстояние Левенштейна (показывает минимальное количество операций, необходимых для преобразования одной строки в другую) или сходство Джаро-Винклера (оценивает схожесть двух строк). Эти алгоритмы позволяют найти контрагентов с похожими, но не идентичными наименованиями.

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

Парсинг JSON с несколькими массивами

Отдельно, автор темы задал вопрос о том, как передавать и парсить JSON, содержащий несколько массивов. Это распространенная задача при обмене данными, когда требуется передать связанные, но структурно разные наборы информации за один раз.

Чтобы передать два или более массивов в одном JSON, мы можем обернуть их в корневую структуру (объект JSON). Каждое свойство этой структуры будет содержать один из массивов.

Рассмотрим пример формирования такой JSON-строки на стороне-источнике:


// Предположим, у нас уже есть два массива данных:
// СозданныйМассивКонтрагентов (МассивСтруктур, где каждая структура - это данные контрагента)
// СозданныйМассивДругихДанных (МассивСтруктур с данными другого типа)

// 1. Создаем корневую структуру, которая будет содержать наши массивы
СтруктураПередаваемыхДанных = Новый Структура;

// 2. Вставляем наши массивы как свойства этой структуры
СтруктураПередаваемыхДанных.Вставить("КонтрагентМассив", СозданныйМассивКонтрагентов);
СтруктураПередаваемыхДанных.Вставить("ДругойМассив", СозданныйМассивДругихДанных);

// 3. Создаем объект ЗаписьJSON для сериализации структуры в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(); // Указываем, что запись будет производиться в строку

// 4. Записываем нашу корневую структуру в JSON
ЗаписатьJSON(ЗаписьJSON, СтруктураПередаваемыхДанных);

// 5. Получаем готовую JSON-строку
РезультатJSON = ЗаписьJSON.Закрыть();

// Пример ResultJSON будет выглядеть примерно так:
// {"КонтрагентМассив": [{"Наименование": "Контрагент1", ...}, {"Наименование": "Контрагент2", ...}],
//  "ДругойМассив": [{"ID": 1, "Значение": "X"}, {"ID": 2, "Значение": "Y"}]}

Теперь, когда мы получаем такую JSON-строку в 1С, нам необходимо правильно ее распарсить, чтобы получить доступ к каждому массиву по отдельности.

Посмотрим на пример процедуры парсинга JSON с несколькими массивами:


Процедура ЗагрузитьДанныеИзJSON(СтрокаJSON)Экспорт

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

    // 1. Прочитываем JSON-строку. Если корневой элемент JSON - объект (фигурные скобки {}),
    //    ПрочитатьJSON вернет Структуру (или Соответствие, если использовать второй параметр Истина).
    //    В нашем случае ожидаем корневой элемент - объект, содержащий два свойства-массива.
    ОбъектИзJSON = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();

    // 2. Проверяем, что полученный объект действительно является структурой
    Если ТипЗнч(ОбъектИзJSON) = Тип("Структура") Тогда
        // 3. Получаем первый массив по его имени (ключу)
        Если ОбъектИзJSON.Свойство("КонтрагентМассив") Тогда
            МассивКонтрагентов = ОбъектИзJSON.КонтрагентМассив;
            Сообщить("Найдено " + МассивКонтрагентов.Количество() + " контрагентов.");

            // Теперь мы можем пройтись по каждому элементу массива контрагентов
            Для Каждого СтрокаКонтрагентаСтруктура Из МассивКонтрагентов Цикл
                // И передать его в процедуру обработки контрагента
                СоздатьКонтрагента(СтрокаКонтрагентаСтруктура);
            КонецЦикла;
        Иначе
            Сообщить("В JSON не найден массив 'КонтрагентМассив'.");
        КонецЕсли;

        // 4. Аналогично получаем второй массив по его имени (ключу)
        Если ОбъектИзJSON.Свойство("ДругойМассив") Тогда
            МассивДругихДанных = ОбъектИзJSON.ДругойМассив;
            Сообщить("Найдено " + МассивДругихДанных.Количество() + " элементов других данных.");
            
            // Здесь мы можем аналогично обработать элементы МассивДругихДанных
            // Например:
            // Для Каждого СтрокаДругихДанныхСтруктура Из МассивДругихДанных Цикл
            //     ОбработатьДругиеДанные(СтрокаДругихДанныхСтруктура);
            // КонецЦикла;
        Иначе
            Сообщить("В JSON не найден массив 'ДругойМассив'.");
        КонецЕсли;
    Иначе
        Сообщить("Полученные данные JSON не являются ожидаемой структурой с массивами.");
    КонецЕсли;

КонецПроцедуры

Таким образом, мы успешно разобрались, как отправлять и получать данные, упакованные в нескольких массивах внутри одной JSON-структуры. Это обеспечивает гибкость и эффективность при обмене комплексными данными между системами.

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

← На главную