При настройке переноса данных и остатков между конфигурациями 1С с помощью конфигурации «Конвертация данных 2.1» разработчики часто сталкиваются с ситуацией, когда существующий в приемнике счет дублируется. Даже если в источнике и приемнике счета имеют одинаковый код, одинаковое наименование и являются предопределенными, при загрузке создается новый непредопределенный элемент плана счетов с тем же кодом. Проанализируем, почему возникает эта ошибка, и разберем все способы настройки правил обмена для гарантированного сопоставления счетов.
Выясним причину некорректного поиска при загрузке плана счетов. В платформе 1С и механизмах КД 2.1 на поведение алгоритма поиска влияют следующие факторы:
ИмяПредопределенныхДанных. Если переносится обычный реквизит Код без указания имени предопределенного элемента, созданный объект становится пользовательским.Родитель. При несовпадении родительского счета дочерний счет не будет найден.Разберем по шагам базовую настройку правила конвертации объекта для плана счетов:
Если сопоставление по внутренним GUID не требуется (базы не были созданы копированием), полностью снимаем флаг Искать объект по внутреннему идентификатору и оставляем только поиск по ключевым полям.
Если поиск по GUID нужен, обязательно включаем подчиненный флаг Искать по полям поиска, если не найден по внутреннему идентификатору.
Код (или комбинации Код и ИмяПредопределенныхДанных).Если стандартный поиск по полям дает сбой из-за форматирования кода, масок или иерархии, наиболее надежным решением является явный поиск через обработчик ПоляПоиска в ПКО плана счетов. Рассмотрим реализацию такого алгоритма:
Если Не ПустаяСтрока(СвойстваПоиска.Код) Тогда
// Ищем счет в базе-приемнике напрямую через менеджер плана счетов
НайденныйСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СвойстваПоиска.Код);
Если ЗначениеЗаполнено(НайденныйСчет) Тогда
СсылкаНаОбъект = НайденныйСчет;
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
В этом коде мы переопределяем стандартный поиск платформы: если по переданному коду счет найден в плане счетов приемника, мы присваиваем переменной СсылкаНаОбъект найденную ссылку и устанавливаем флаг ПрекратитьПоиск = Истина, что предотвращает дальнейшие попытки поиска и создание дублей.
Посмотрим на пример переноса счетов с учетом платформенного механизма предопределенных данных. Для гарантированного сопоставления с предопределенным счетом в ПКО необходимо передавать реквизит ИмяПредопределенныхДанных:
ИмяПредопределенныхДанных.ПередВыгрузкой свойства получаем имя предопределенного счета:
Значение = Источник.ИмяПредопределенныхДанных;
При загрузке платформа сопоставит объект с соответствующим предопределенным счетом метаданных приемника, даже если у них незначительно различаются наименования.
Если счета в базе-источнике и базе-приемнике имеют разные коды или переносятся по сложной аналитике, создадим правило конвертации значений (ПКЗ):
Чтобы исключить возможность создания новых элементов плана счетов при любых ошибках сопоставления, настроим обработчик ПриЗагрузке в ПКО плана счетов:
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
// Если счет не найден по коду, прерываем создание нового элемента
Сообщить("Счет с кодом " + СвойстваПоиска.Код + " не найден в приемнике! Создание отменено.");
Отказ = Истина;
ИначеЕсли Не СсылкаНаОбъект.ЭтоПредопределенный() Тогда
// Дополнительная проверка на предопределенность счета
// Отказ = Истина;
КонецЕсли;
Использование комбинации корректных настроек флагов поиска и явного поиска через менеджер плана счетов в обработчике ПоляПоиска полностью исключает появление дублирующих счетов при переносе данных.