При переносе данных между базами 1С часто возникает задача выборочного обновления реквизитов. Типичный пример — необходимость заменить коды у существующей номенклатуры в базе-приемнике на коды из базы-источника, не затронув при этом другие реквизиты (наименования, цены, описания) и не очистив табличные части. Если настроить правила обмена неверно, система либо создаст дублирующие карточки товаров, либо перезапишет (и затрет) важные данные в приемнике.
В этой статье мы подробно разберем, как правильно настроить правила конвертации свойств и объектов в конфигурации «1С:Конвертация данных 2.1» (КД 2.1), чтобы успешно заменить только коды номенклатуры.
По умолчанию платформа 1С при сопоставлении объектов во время обмена в первую очередь ищет их по уникальному идентификатору (УИД). Если номенклатура в вашей базе-источнике и базе-приемнике создавалась независимо, их УИДы гарантированно будут разными. Если оставить эту настройку включенной, система не найдет совпадений по УИД и просто создаст дубли товаров с новыми кодами.
Выясним, как отключить стандартный поиск по УИД:
Номенклатура.Важно: если этот флаг активен, система проигнорирует любые другие настроенные вами поля поиска, если найдет совпадение по УИД, либо сразу создаст копию элемента при его отсутствии.
Поскольку мы отключили поиск по УИД, нам необходимо указать платформе, по какому признаку сопоставить товар из источника с товаром в приемнике. Код для этой цели использовать нельзя, так как в источнике он уже изменился, а в приемнике пока старый. Нам нужно выбрать уникальное свойство, которое гарантированно совпадает в обеих базах. Отличными вариантами могут служить Артикул, Наименование или Штрихкод.
Рассмотрим, как настроить сопоставление по альтернативному полю (на примере артикула):
Артикул.Теперь перейдем к настройке главного реквизита, ради которого выполняется перенос, — к Коду номенклатуры. Проанализируем настройки ПКС для этого поля:
Код.Один из самых частых страхов начинающих разработчиков в Конвертации данных — затирание остальных реквизитов (например, цен номенклатуры, единиц измерения или текстовых описаний) при частичном обновлении. Разберем этот механизм подробнее.
Если свойства (или табличные части) полностью отсутствуют в списке ПКС внутри вашего правила конвертации объектов, они **никогда не затрутся и не изменятся** в базе-приемнике. Платформа обновит только те поля, которые явно передаются в файле выгрузки.
Если же в ПКО присутствуют другие реквизиты, выполним одно из двух действий:
Артикул) и обновляемое поле (Код).Что касается табличных частей: если правила выгрузки не содержат ПКС для табличных частей (ТЧ) номенклатуры, то существующие ТЧ в приемнике останутся абсолютно нетронутыми. Очистка табличных частей происходит только в том случае, если ТЧ присутствует в правилах обмена и передается как пустая или заполненная новыми строками.
Если сопоставить объекты стандартным образом по одному или двум полям не удается (например, когда логика поиска требует запроса к связанным регистрам сведений или проверки нескольких условий), мы можем прибегнуть к написанию алгоритма на встроенном языке 1С.
Для этого в ПКО перейдем на вкладку «Обработчики событий» и выберем событие «Поля поиска». Рассмотрим пример кода, который выполняет поиск элемента по артикулу с помощью запроса:
// Поиск номенклатуры по артикулу с помощью ручного запроса в приемнике
Если НомерВариантаПоиска = 1 Тогда
АртикулПоиска = "";
Если СвойстваПоиска.Свойство("Артикул", АртикулПоиска) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул";
Запрос.УстановитьПараметр("Артикул", АртикулПоиска);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Передаем найденную ссылку платформе
СсылкаНаОбъект = Выборка.Ссылка;
// Сообщаем системе, что поиск успешно завершен
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Массовое изменение кодов в рабочей базе — ответственная операция. Проанализируем критические риски, с которыми можно столкнуться при загрузке данных:
Номенклатура в конфигураторе базы-приемника включено свойство «Контроль уникальности», и вы попытаетесь загрузить код, который уже записан у другого товара, система выдаст ошибку транзакции, и объект не запишется. Перед обменом убедитесь, что новые коды не пересекаются с существующими кодами других элементов.
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Номенклатура);