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