Как избежать дублирования документов при конвертации данных 1С по номеру и дате?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Торговля и дистрибуция
← На главную

В рамках обмена данными между конфигурациями 1С, например, при переходе с Бухгалтерии 2.0 на Бухгалтерию 3.0, или при интеграции различных систем (Управление торговлей, Бухгалтерия), часто возникают проблемы с дублированием объектов. Особенно остро эта проблема встает, когда используются несколько механизмов обмена, таких как стандартная «Конвертация данных» и самописные обработки через COM-соединение. Рассмотрим, как настроить «Конвертацию данных» для предотвращения создания дублей, обеспечивая поиск и замену существующих документов по их номеру и дате.

Понимание механизма сопоставления объектов в «Конвертации данных»

Прежде чем приступить к настройке, давайте выясним, как «Конвертация данных» (КД) по умолчанию ищет и сопоставляет объекты. Анализируя типовое поведение, мы лучше поймем, почему возникают дубли и как от них избавиться.

  1. По умолчанию, при первой выгрузке или создании нового объекта в базе-приемнике, КД присваивает ему внутренний уникальный идентификатор (УИД) источника. Этот УИД затем сохраняется в специальном регистре сведений «Соответствия объектов информационных баз» в базе-приемнике.
  2. При последующих обменах КД в первую очередь пытается найти объект в базе-приемнике именно по этому сохраненному УИД. Если объект найден по УИД, он будет обновлен.
  3. Проблема дублирования возникает, когда объект уже существует в базе-приемнике (например, был создан вручную, или импортирован другим способом, скажем, через COM-соединение), но его УИД не соответствует УИД из базы-источника (или в регистре сопоставлений просто нет записи для такого УИД). В этом случае КД, не найдя соответствия по УИД, может попытаться создать новый объект, даже если по другим реквизитам (например, номеру и дате) такой документ уже присутствует. Именно такая ситуация, когда самописный обмен через COM-соединение создает документы, а потом «Конвертация данных» при переносе тех же документов создает дубли, является наиболее распространенной.

Настройка поиска и замены объектов по полям в правилах конвертации (ПКО и ПКС)

Для того чтобы «Конвертация данных» корректно искала документы по номеру и дате, а при обнаружении совпадения — заменяла их, а не создавала новые дубли, нам потребуется внести изменения в настройки Правил Конвертации Объектов (ПКО) и Правил Конвертации Свойств (ПКС) для соответствующих типов документов. Рассмотрим по шагам, как это сделать.

  1. Настройки в Правиле Конвертации Объекта (ПКО):

    Откроем ПКО для того типа документа, с которым мы работаем (например, «Реализация товаров и услуг»). Перейдем на вкладку «Прочее» или в раздел «Дополнительные настройки» для загрузки данных. Здесь мы увидим несколько ключевых флажков. Важно установить или проверить следующие:

    • «Искать объект приемника по внутреннему идентификатору объекта источника»: Рекомендуем оставить эту галочку включенной. Это обеспечивает быстрый и надежный поиск для уже сопоставленных объектов. Мы не отказываемся от поиска по УИД полностью, так как это полезно для уже синхронизированных объектов.
    • «Продолжить поиск по полям поиска, если по идентификатору объект приемника не найден»: Этот флажок необходимо обязательно установить. Он дает команду КД, что если объект не был найден по УИД (например, при первом обмене документа, который уже существует в приемнике из другого источника), она должна продолжить попытку поиска, используя поля, которые мы укажем далее.

    Если же мы полностью уверены, что поиск по УИД не нужен или невозможен для данного объекта (что крайне редко и обычно не рекомендуется), можно снять первый флажок. Однако это менее гибкий подход, и в большинстве случаев он не решает проблему "объект с таким кодом уже существует", которая возникает, когда КД пытается создать новый объект с существующим кодом/номером, не имея инструкций по его замене.

  2. Настройки в Правилах Конвертации Свойств (ПКС):

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

    Для каждого из этих полей (Номер и Дата) установим флаг в колонке «Поле поиска». Это явно сообщит системе, что комбинация значений этих полей должна использоваться для идентификации существующего объекта-приемника.

    Таким образом, при загрузке документа, КД сначала попытается найти его по УИД. Если не найдет, то перейдет к поиску по комбинации «Номер» и «Дата». Если документ с таким номером и датой будет обнаружен, то КД обновит его, а не создаст новый. Это основной механизм, который позволяет КД выполнять замену вместо создания дублей при совпадении ключевых реквизитов.

Использование обработчика «ПоляПоиска» для сложной логики сопоставления

В некоторых случаях стандартного поиска по полям (Номер, Дата) может быть недостаточно. Например, если в нашей системе номер и дата не всегда образуют уникальную комбинацию, или требуется учитывать дополнительные условия (например, вид документа, организацию и т.д.). Для таких сценариев «Конвертация данных» предоставляет мощный инструмент — обработчик события ПоляПоиска в Правиле Конвертации Объекта. Этот обработчик позволяет нам программно реализовать собственную, более сложную логику поиска объекта-приемника.

  1. Откроем ПКО для нужного документа.

  2. Перейдем на вкладку «Обработчики событий».

  3. Найдем событие «ПоляПоиска» и откроем его.

  4. В теле обработчика мы можем написать код на встроенном языке 1С.

    Основная задача — найти ссылку на существующий объект в базе-приемнике и присвоить ее переменной СсылкаНаОбъект. Если эта переменная будет содержать ссылку на объект, КД будет его обновлять. Если же она останется Неопределено, КД продолжит работу по своим стандартным правилам или создаст новый объект.

  5. Рассмотрим пример кода для поиска документа по номеру и дате, учитывая важные нюансы:

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

    • Метод НайтиПоНомеру(): Этот метод присутствует у коллекций документов и позволяет найти документ по его номеру и дате.
    • СвойстваПоиска["Номер"] и СвойстваПоиска["Дата"]: Эти параметры передают значения номера и даты из выгружаемого объекта. Обратите внимание, что в исходной теме была ошибка в написании СвойcтваПоиска. Правильное написание — СвойстваПоиска. Мы добавили проверку существования свойств для повышения надежности.
    • Документы.НазваниеДокумента: Замените НазваниеДокумента на точное имя типа документа в вашей конфигурации-приемнике (например, Документы.РеализацияТоваровУслуг, Документы.ПоступлениеТоваровУслуг и т.д.).
    • Если СсылкаНаОбъект будет найдена и присвоена, КД обновит этот объект. Если же останется Неопределено, КД продолжит работу по своим стандартным правилам (создаст новый объект или попробует найти по другим полям, если это разрешено).

Возможные проблемы и рекомендации

Давайте проанализируем потенциальные сложности, которые могут возникнуть при настройке обмена, и предложим рекомендации по их предотвращению:

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

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

← На главную