При настройке правил обмена в 1С:Конвертация данных 2.0 (КД 2.0) программисты часто сталкиваются с ситуацией, когда вместо ожидаемого набора документов (например, нескольких операций по разным счетам) в базе-приемнике создается всего один объект. Даже установка флага «Не замещать существующие объекты» не решает проблему — система просто находит первый созданный документ и игнорирует остальные. Разберем, почему это происходит и как правильно настроить правила, чтобы каждый документ выгружался обособленно.
Основная причина «схлопывания» документов кроется в работе внутреннего кэша выгрузки. В КД 2.0 существует коллекция ВыгруженныеОбъекты. Когда система обрабатывает данные, она фиксирует каждый объект. Если для разных порций данных генерируется идентичный Ключ выгружаемых данных или если выгрузка идет без источника (например, из таблицы значений) и ключ не задан явно, система считает, что объект уже был обработан в этой сессии. В результате последующие вызовы просто игнорируются, так как КД «думает», что документ уже выгружен.
Вторая причина — некорректная настройка Полей поиска в Правилах конвертации объектов (ПКО). Если поля поиска (например, Дата и Номер) у разных документов совпадают, то при загрузке система найдет первый созданный документ и обновит его (или пропустит, если стоит запрет на замещение), вместо того чтобы создать новый.
Самый простой и эффективный способ разделить документы на стороне приемника — добавить в поля поиска уникальный признак. Если вы переносите остатки по счетам и для каждого счета должен создаваться отдельный документ ОперацияБух, необходимо сделать так, чтобы поиск находил их по уникальному сочетанию реквизитов.
Дата, Номер и Комментарий).Комментарий или Содержание названием счета или другим уникальным идентификатором.Проанализируем ситуацию: если мы включим Комментарий в поля поиска и будем писать туда номер счета, система при загрузке поймет, что «Операция от 01.01.2023 с комментарием Счет 01» и «Операция от 01.01.2023 с комментарием Счет 02» — это разные объекты.
Если выгрузка происходит без прямого источника (например, мы формируем структуру данных в коде), критически важно управлять кэшем через обработчик ПередВыгрузкой в ПКО. Нам нужно принудительно задать КлючВыгружаемыхДанных, чтобы система видела различие между объектами еще на этапе формирования файла выгрузки.
Рассмотрим пример кода, который можно разместить в обработчике ПередВыгрузкой:
// Формируем уникальный ключ на основе даты и номера счета
КлючВыгружаемыхДанных = Строка(ОбъектКоллекции.Дата) + "_" + Строка(ОбъектКоллекции.Счет);
// Дополнительно можно указать режим записи для документа
РежимЗаписи = "Проведение";
РежимПроведения = "Неоперативный";
Это заставляет механизм конвертации создавать новую запись в коллекции выгруженных объектов для каждой комбинации даты и счета, предотвращая пропуск данных.
Разберем дополнительные моменты, которые влияют на уникальность объектов:
ВыгрузитьПоПравилу рекомендуется явно контролировать этот параметр. Если система решит, что объект уже выгружался, она может передать только ссылку, что приведет к созданию «пустого» документа в приемнике.Содержание) может работать медленно или некорректно, если уникальная часть строки находится в самом конце и выходит за пределы индексируемой длины поля в СУБД. Старайтесь выносить уникальную информацию в начало строки.Чтобы избежать «схлопывания» документов при загрузке, всегда обеспечивайте уникальность данных на двух уровнях: на уровне выгрузки (используя КлючВыгружаемыхДанных в ПКО или ПВД) и на уровне загрузки (настраивая Поля поиска в ПКО). Сочетание этих методов гарантирует, что каждый ваш документ найдет свое место в базе-приемнике без потерь и дублей.