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