При настройке обмена данными с помощью правила конвертации между платформами 1С:Предприятие 8 и 1С 7.7 разработчики часто сталкиваются с ситуацией, когда установленный флаг «Не создавать новый объект в приемнике, если он не найден» игнорируется при загрузке. В результате в базе 7.7 продолжают плодиться лишние элементы справочников или возникают фатальные ошибки исполнения вида Значение не представляет агрегатный объект (ПометкаУдаления).
Рассмотрим подробно причины возникновения этой проблемы и разберем практические способы доработки внешних обработок и правил конвертации для её полного устранения.
Проанализируем механику работы флага «Не создавать новый, если не найден». При выгрузке данных из платформы 8.x конфигурация конвертации формирует XML-файл, в который добавляет атрибут НеСоздаватьЕслиНеНайден="true" для соответствующего узла ссылки:
<Ссылка Нпп="2" НеСоздаватьЕслиНеНайден="true">
<Свойство Имя="Номер" Тип="Строка">
<Значение>99999999999999999996</Значение>
</Свойство>
</Ссылка>
Однако стандартный модуль загрузки, работающий в среде 1С 7.7, изначально содержит упрощенную логику и не всегда корректно реагирует на данный атрибут. В платформе 7.7 невыбранная или неинициализированная ссылка не является агрегатным типом данных. Когда загрузчик пропускает создание элемента, переменная Объект остается пустой. Если далее по тексту программы происходит попытка обратиться к свойствам или методам (например, проверка Объект.ПометкаУдаления или установка реквизитов), 7.7 генерирует ошибку «Значение не представляет агрегатный объект».
Посмотрим на решение, предложенное при исправлении обработки загрузки в 1С 7.7. Нам потребуется внести изменения в процедуры чтения и записи объектов. Разберем по шагам, какие именно правки нужно внести:
ЗагрузитьОбъектСправочникаV8 для нужного вида справочника (например, БанковскиеСчета) принудительно устанавливаем флаги отмены создания и обновления:
Если Вид = "БанковскиеСчета" Тогда
НовыеНеСоздавать = 1;
НеЗамещать = 1;
КонецЕсли;
ЗаписатьОбъект добавляем условие, предотвращающее запись непроведенных или невыбранных элементов целевого справочника:
Если Вид = "БанковскиеСчета" Тогда
// Заглушка: пропускаем запись элемента
Возврат;
КонецЕсли;
Выбран() = 1 или блоком обработки исключений:
Попытка
Если Объект.Выбран() = 1 Тогда
// Безопасная работа с атрибутами
Пометка = Объект.ПометкаУдаления;
КонецЕсли;
Исключение
// Исключаем аварийное завершение работы при пустом объекте
КонецПопытки;
Если нет возможности редактировать внешнюю обработку загрузки на стороне 7.7, проблему можно решить на стороне базы-источника или в правилах конвертации свойств (ПКС).
Рассмотрим подход, при котором поиск объекта выполняется средствами встроенного языка. В правилах конвертации для реквизита вместо стандартного флага создания настраивается алгоритм поиска. Если элемент не найден по коду или ИНН/КПП в базе-приемнике, значение реквизита просто сбрасывается в пустую ссылку. Таким образом, в XML не передается команда на создание нового объекта.
Для сложных информационных баз с бешеными денежными оборотами и высокой ответственностью за целостность данных рекомендуется использовать двухэтапную схему:**
Применение описанных доработок позволяет полностью исключить дублирование справочников и избавиться от критических ошибок при загрузке данных из 1С 8 в платформу 7.7.