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