В процессе настройки обмена данными между конфигурациями Управление торговлей (УТ 10.3 / 2.2) и Бухгалтерия предприятия (БП 3.0) часто возникает задача консолидации данных. Типичный пример: в УТ ведется детальный учет по нескольким договорам с одной организацией, а в бухгалтерской базе необходимо все операции «схлопнуть» на один основной договор. Рассмотрим, как реализовать механизм связи «многие к одному» правильно, используя инструменты «Конвертации данных 2.0» (КД).
По умолчанию механизмы обмена в 1С приоритетно используют УИД (Уникальный Идентификатор). Если объект один раз был выгружен и сопоставлен, система всегда будет находить именно его, игнорируя ваши изменения в кодах или наименованиях. Проанализируем ситуацию автора: в УТ создан реквизит КодЭлементаБУ, который должен служить ключом для поиска в БП. Однако простое отключение поиска по УИД часто приводит к созданию дублей или подстановке последнего созданного объекта. Это происходит из-за того, что логика поиска в правилах конвертации объектов (ПКО) срабатывает раньше, чем вы успеваете программно подменить ссылку в документе.
Для того чтобы система принудительно искала договор по вашему спец-реквизиту, необходимо настроить ПКО для справочника ДоговорыКонтрагентов. Выясним, как правильно прописать алгоритм в обработчике «Поля поиска». Этот код выполняется на стороне приемника (БП) в момент загрузки.
Алгоритм действий:
КодЭлементаБУ (в источнике) в поле Код (в приемнике).
Если НомерВарианта = 1 Тогда
// Пытаемся найти договор по коду, который мы передали в поле "Код"
ИскомыйКод = СвойстваПоиска.Получить("Код");
Если ЗначениеЗаполнено(ИскомыйКод) Тогда
СсылкаНаОбъект = Справочники.ДоговорыКонтрагентов.НайтиПоКоду(ИскомыйКод);
Если Не СсылкаНаОбъект.Пустая() Тогда
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Важно помнить: поиск по коду должен быть однозначным. Если в БП есть договоры с одинаковыми кодами для разных контрагентов, добавьте в поиск владельца (Контрагента).
Как справедливо отмечено в обсуждении на форуме (сообщение 15), иногда проще не менять логику самого справочника, а управлять тем, какой договор передается из документа. Разберем ситуацию, когда мы хотим, чтобы в документе Реализация товаров и услуг всегда подставлялся «правильный» договор.
В ПКО документа для свойства ДоговорКонтрагента в обработчике «Перед выгрузкой» проанализируем следующий подход:
// Проверяем, заполнен ли наш специальный код в текущем договоре документа
Если ЗначениеЗаполнено(Источник.ДоговорКонтрагента.КодЭлементаБУ) Тогда
// Вместо текущего договора передаем структуру для поиска нужного объекта в БП
ИмяПКО = "ДоговорыКонтрагентов";
Значение = Источник.ДоговорКонтрагента.КодЭлементаБУ;
// В данном случае мы можем использовать отдельное ПКО, настроенное на поиск по коду
ВыполнитьПравило(Источник.ДоговорКонтрагента, , , , "Договоры_ПоКоду");
Отказ = Истина; // Отменяем стандартную выгрузку, так как выгрузили через ВыполнитьПравило
КонецЕсли;
Рассмотрим подробнее преимущество этого метода: вы не ломаете синхронизацию справочника «в лоб», а точечно указываете документам, какой объект использовать. Это позволяет избежать «схлопывания» справочников там, где это не нужно.
Проанализируем важный технический момент: если документы уже выгружались ранее, в базе БП созданы записи в регистре сведений СоответствиеОбъектовИнформационныхБаз (или СоответствиеОбъектовДляОбмена). Пока эти записи существуют, система будет «помнить» старую связь по УИД.
Чтобы новые правила вступили в силу для старых объектов:
Автор темы выразил опасение (сообщение 22), что новые правила изменят договоры в старых документах. Чтобы этого избежать, используем проверку даты документа. В ПКО документов (например, та же Реализация) в обработчике «При загрузке» (на стороне БП) добавим проверку:
ДатаНачалаНовогоУчета = '20230101000000'; // Пример даты
Если Объект.Дата < ДатаНачалаНовогоУчета Тогда
// Если документ из прошлого, запрещаем его модификацию при загрузке
Отказ = Истина;
КонецЕсли;
Этот метод гарантирует, что обмен будет обрабатывать только актуальные документы, оставляя историческую первичку в неизменном виде.
При объединении договоров в конфигурациях для Казахстана (УТ 2.2 и БП 3.0) крайне важно учитывать валюту договора. В БП невозможно провести документ, если валюта документа отличается от валюты договора. Рассмотрим ситуацию: в УТ у вас два договора в тенге (KZT), а один в долларах (USD). Если вы попытаетесь «схлопнуть» их в один договор БП с валютой KZT, документы по USD-договору не проведутся.
Рекомендация: всегда добавляйте проверку соответствия валют в ваши алгоритмы подмены. Если КодЭлементаБУ ведет на договор с другой валютой, такая замена должна блокироваться или логироваться как ошибка.
Для успешной реализации задачи «многие к одному» мы рекомендуем комбинированный подход: создание «виртуального» ПКО для поиска договора только по коду и использование обработчика Перед выгрузкой в правилах конвертации свойств документов. Это обеспечит гибкость и сохранит целостность данных в обеих информационных базах.