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