При переносе данных между информационными базами 1С с помощью конфигурации «Конвертация данных 2.1» (КД 2) часто возникает специфическая задача: перенести документы или остатки (например, документы ввода остатков или регистры накопления), но при этом полностью защитить существующие справочники в базе-приемнике от изменений. Типичный пример — перенос остатков товаров, при котором крайне важно, чтобы справочник Номенклатура в целевой базе не перезаписывался, не дублировался и не изменял свои реквизиты (наименования, артикулы, ставки НДС), даже если эти данные присутствуют в файле выгрузки.
В этой статье мы подробно разберем, как решить эту задачу. Мы проанализируем интерактивные настройки правил конвертации объектов (ПКО) и свойств (ПКС), а также рассмотрим гибкие программные методы в обработчиках событий КД 2, которые гарантируют сохранность ваших данных в базе-приемнике.
Рассмотрим самый простой способ, который настраивается непосредственно в правилах конвертации объектов (ПКО) для нужного справочника (в нашем примере — для справочника Номенклатура). Этот вариант идеально подходит, если вы точно уверены, что вся необходимая номенклатура уже создана в базе-приемнике, и вам нужно лишь сопоставить ее при переносе остатков.
Выполним следующие шаги для настройки:
Номенклатура и откроем его.Важный нюанс этого метода: если в базе-источнике окажется позиция номенклатуры, которой физически еще нет в базе-приемнике, то после загрузки остатков в документе приемника появится «битая» ссылка со строкой вида «Объект не найден [УИД]». Используйте этот флаг только тогда, когда справочники в обеих базах предварительно полностью синхронизированы.
Если мы хотим более гибко управлять процессом выгрузки на уровне кода, КД 2 предоставляет нам богатый инструментарий обработчиков событий. Рассмотрим два основных сценария написания кода в базе-источнике.
Вариант А. Через ПКС (Правило конвертации свойства)
Предположим, у нас есть документ ввода остатков, в табличной части которого есть реквизит Номенклатура. Мы хотим, чтобы при выгрузке этого конкретного реквизита система не тянула за собой всю информацию о товаре.
Разберем по шагам, как это реализовать:
Номенклатура.
ВыгрузитьОбъект = Ложь;
Этот код сообщает выгрузчику, что для данного свойства нужно выгрузить исключительно ссылку (его уникальный идентификатор УИД и поля поиска), полностью игнорируя выгрузку остальных реквизитов справочника номенклатуры.
Вариант Б. Через ПКО Номенклатуры (Глобальный запрет)
Если мы хотим, чтобы номенклатура всегда и везде (в любых документах, регистрах или других справочниках) выгружалась только как ссылка, не переписывая данные в приемнике, мы можем прописать код непосредственно в ПКО самого справочника.
Номенклатура.
ТолькоПолучитьУзелСсылки = Истина;
Использование переменной ТолькоПолучитьУзелСсылки = Истина; — это крайне эффективный недокументированный прием. При его активации XML-файл обмена будет содержать только структуру ссылки (УИД, Код, Наименование — в зависимости от полей поиска), а вся остальная громоздкая часть объекта выгружаться не будет. При загрузке такой объект будет найден по идентификаторам, но его реквизиты останутся нетронутыми.
Иногда требуется более сложная логика: если товара нет в базе-приемнике, его нужно создать (чтобы избежать появления «битых» ссылок), но если он уже существует — его ни в коем случае нельзя перезаписывать (затирать наименование, свойства, артикулы). Это реализуется с помощью обработчиков событий загрузки.
Вариант А. Использование обработчика «При загрузке» в ПКО
Откроем ПКО справочника Номенклатура, перейдем на вкладку «Обработчики событий» и найдем событие «При загрузке». Напишем следующий код:
Если ОбъектНайден Тогда
НеЗамещатьОбъект = Истина;
КонецЕсли;
Этот простой алгоритм работает великолепно: если поиск в базе-приемнике увенчался успехом (ОбъектНайден равен Истина), платформа взводит флаг НеЗамещатьОбъект. Система просто пропустит шаг записи для уже существующего элемента, сохранив его исходное состояние.
Вариант Б. Использование обработчика «После загрузки» (Отказ от записи)
В качестве альтернативного решения можно использовать отмену транзакции записи в обработчике «После загрузки» ПКО номенклатуры:
Если ОбъектНайден Тогда
Отказ = Истина;
КонецЕсли;
Параметр Отказ = Истина; в данном контексте прерывает процесс записи найденного объекта, при этом сам процесс чтения XML-файла продолжается без генерации критических ошибок.
Вариант В. Точечный запрет изменения реквизитов в ПКС
Если вам все же нужно обновлять справочник номенклатуры, но при этом требуется защитить от перезаписи лишь ключевые поля (например, НаименованиеПолное или СтавкаНДС), мы можем сделать это интерактивно:
Номенклатура.Наименование).При такой настройке новые карточки товаров будут создаваться полностью заполненными, а у старых карточек критически важные реквизиты гарантированно не изменятся.
Все вышеописанные методы защиты данных при загрузке (такие как проверка Если ОбъектНайден) будут работать корректно только при одном условии: если система «1С:Предприятие» сможет однозначно идентифицировать объект в базе-приемнике.
Проанализируем ключевые правила настройки полей поиска:
Номенклатура, выберите ключевые поля (например, Код, Артикул или Наименование) и отметьте их галочкой «Поиск».Правильная комбинация полей поиска гарантирует, что переменная ОбъектНайден примет значение Истина именно для нужного товара, и механизмы защиты от перезаписи отработают со 100% точностью.