Загрузка номенклатуры контрагентов в УТ 11, КА 2, ERP 2: полный разбор с кодом и примерами
Представьте ситуацию: поставщик присылает Excel-файл на 3 000 позиций со своими артикулами, своими единицами измерения и своими названиями. Вам нужно всё это загрузить в 1С, сопоставить с вашей номенклатурой и при этом не сойти с ума. Знакомо? Тогда эта статья для вас.
Загрузка номенклатуры контрагентов — одна из самых частых задач в проектах на УТ 11, КА 2 и ERP 2. Казалось бы, в платформе есть механизм соответствия номенклатуры контрагентов, всё должно работать из коробки. Но на практике каждый второй проект упирается в нюансы: нестандартные форматы файлов, дублирование позиций, неправильные единицы измерения, отсутствие штрихкодов. Разберём всё по порядку — от теории до рабочего кода.
Зачем вообще нужна номенклатура контрагентов и как она устроена
В 1С:УТ 11, КА 2 и ERP 2 есть специальный механизм — «Номенклатура контрагентов». Это таблица соответствий: артикул поставщика → ваша номенклатура. Хранится в регистре сведений «Номенклатура контрагентов» и позволяет автоматически подставлять вашу номенклатуру при вводе документов от поставщика.
Зачем это нужно на практике? Вот реальный кейс: торговая компания работает с 15 поставщиками электроники. Каждый поставщик называет один и тот же товар по-своему. Samsung Galaxy S25 у одного поставщика — «Смартфон Samsung SM-S931B», у другого — «Samsung Galaxy S25 128Gb Black», у третьего вообще просто «S25/128/BLK». Без механизма соответствия номенклатуры менеджер при каждом приходе тратит 2-3 часа на ручное сопоставление — и это только по одному поставщику.
Механизм работает так:
- В регистр сведений записывается связка: контрагент + артикул контрагента + ваша номенклатура + характеристика + единица измерения контрагента + коэффициент пересчёта
- При загрузке документа (например, поступления товаров) система ищет артикул поставщика в этом регистре
- Если находит — автоматически подставляет вашу номенклатуру
- Если не находит — предлагает создать новое соответствие или выбрать вручную
Проблема в том, что этот регистр нужно сначала заполнить. И вот тут начинается самое интересное.
Штатные инструменты загрузки: что есть в коробке
Прежде чем писать код, давайте разберёмся, что предлагает 1С из коробки. В УТ 11, КА 2 и ERP 2 есть несколько способов заполнить соответствие номенклатуры контрагентов.
Ручное заполнение через карточку номенклатуры
В карточке номенклатуры есть закладка «Номенклатура контрагентов». Там можно вручную добавить артикулы от разных поставщиков. Подходит для небольшого количества позиций — скажем, до 50-100 штук. Если позиций больше, это превращается в пытку.
Загрузка через обработку «Загрузка данных из табличного документа»
Штатная обработка из состава конфигурации. Позволяет загружать данные в регистры сведений напрямую. Теоретически можно загрузить и номенклатуру контрагентов. На практике — нужно очень точно настроить колонки, и обработка не умеет автоматически создавать новую номенклатуру, если её нет в базе.
Загрузка через EDI и электронный документооборот
Если поставщик работает через EDI (СФЕРА, Synerdocs и т.д.), соответствие может формироваться автоматически при первом обмене. Это идеальный вариант для крупных сетей и производителей, но доступен далеко не всем.
Загрузка через механизм «Помощник сопоставления номенклатуры»
В ERP 2 и КА 2 есть встроенный помощник сопоставления — он появляется при загрузке документов через обмен данными. Умеет искать соответствия по артикулу, наименованию, штрихкоду. Неплохой инструмент, но требует настройки и не всегда справляется с «грязными» данными от поставщиков.
Вывод: штатные инструменты хороши для поддержки текущей работы, но для первоначальной массовой загрузки 3 000+ позиций нужно что-то серьёзнее. Пишем свою обработку.
Структура данных: что нужно знать перед написанием кода
Прежде чем лезть в конфигуратор, разберёмся со структурой регистра сведений «Номенклатура контрагентов». Это периодический регистр с независимой периодичностью.
Основные измерения регистра:
- Контрагент — ссылка на справочник «Контрагенты»
- АртикулКонтрагента — строка, артикул товара в системе поставщика
Ресурсы регистра:
- Номенклатура — ссылка на справочник «Номенклатура»
- Характеристика — ссылка на справочник «Характеристики номенклатуры»
- ЕдиницаИзмерения — ссылка на классификатор единиц измерения
- Коэффициент — число, коэффициент пересчёта единиц
- НаименованиеКонтрагента — строка, как контрагент называет этот товар
Важный момент: в УТ 11 и КА 2 структура регистра может немного отличаться от ERP 2 — особенно в части характеристик и дополнительных реквизитов. Всегда проверяйте структуру в конкретной конфигурации через «Конфигуратор → Регистры сведений → НоменклатураКонтрагентов».
Пишем обработку загрузки: пошаговый разбор кода
Разберём создание обработки для загрузки номенклатуры контрагентов из Excel-файла. Обработка будет:
- Читать Excel через табличный документ
- Искать номенклатуру по артикулу или наименованию
- При необходимости создавать новые позиции номенклатуры
- Записывать соответствие в регистр сведений
- Формировать протокол загрузки
Форма обработки и основная процедура
Начнём с клиентской процедуры, которая запускает загрузку:
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
ОчиститьСообщения();
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда
Сообщить("Укажите контрагента!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.ИмяФайла) Тогда
Сообщить("Укажите файл для загрузки!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
ЗагрузитьДанныеНаСервере();
КонецПроцедуры
Теперь серверная процедура, которая делает основную работу:
&НаСервере
Процедура ЗагрузитьДанныеНаСервере()
// Читаем файл Excel в табличный документ
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(Объект.ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат;
КонецПопытки;
КолонкаАртикул = Объект.НомерКолонкиАртикул;
КолонкаНаименование = Объект.НомерКолонкиНаименование;
КолонкаЕдиница = Объект.НомерКолонкиЕдиница;
НачальнаяСтрока = Объект.НачальнаяСтрока;
СчётчикУспех = 0;
СчётчикОшибок = 0;
СчётчикСоздано = 0;
Для НомСтр = НачальнаяСтрока По ТабДок.ВысотаТаблицы Цикл
АртикулКонтрагента = СокрЛП(ТабДок.ПолучитьОбласть(НомСтр, КолонкаАртикул).ТекущаяОбласть.Текст);
НаименованиеКонтрагента = СокрЛП(ТабДок.ПолучитьОбласть(НомСтр, КолонкаНаименование).ТекущаяОбласть.Текст);
Если АртикулКонтрагента = "" Тогда
Продолжить;
КонецЕсли;
// Ищем номенклатуру
НайденнаяНоменклатура = НайтиНоменклатуру(АртикулКонтрагента, НаименованиеКонтрагента);
Если НайденнаяНоменклатура = Неопределено И Объект.СоздаватьНоменклатуру Тогда
НайденнаяНоменклатура = СоздатьНоменклатуру(НаименованиеКонтрагента, АртикулКонтрагента);
СчётчикСоздано = СчётчикСоздано + 1;
КонецЕсли;
Если НайденнаяНоменклатура <> Неопределено Тогда
ЗаписатьСоответствие(Объект.Контрагент, АртикулКонтрагента, НаименованиеКонтрагента, НайденнаяНоменклатура);
СчётчикУспех = СчётчикУспех + 1;
Иначе
Сообщить("Строка " + НомСтр + ": не найдена номенклатура для артикула " + АртикулКонтрагента);
СчётчикОшибок = СчётчикОшибок + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Загрузка завершена. Успешно: " + СчётчикУспех + ", создано: " + СчётчикСоздано + ", ошибок: " + СчётчикОшибок);
КонецПроцедуры
Функция поиска номенклатуры
Самая важная часть — поиск существующей номенклатуры. Ищем сначала по артикулу, потом по наименованию — это даёт лучший результат на практике:
&НаСервере
Функция НайтиНоменклатуру(АртикулКонтрагента, НаименованиеКонтрагента)
// Сначала ищем по артикулу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул
| И НЕ Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("Артикул", АртикулКонтрагента);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Возврат РезультатЗапроса.Выгрузить()[0].Ссылка;
КонецЕсли;
// Если не нашли по артикулу — ищем по наименованию
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Наименование
| И НЕ Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("Наименование", "%" + НаименованиеКонтрагента + "%");
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Возврат РезультатЗапроса.Выгрузить()[0].Ссылка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция записи соответствия в регистр
Теперь самое главное — запись в регистр сведений «Номенклатура контрагентов»:
&НаСервере
Процедура ЗаписатьСоответствие(Контрагент, АртикулКонтрагента, НаименованиеКонтрагента, Номенклатура)
МенеджерЗаписи = РегистрыСведений.НоменклатураКонтрагентов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Контрагент = Контрагент;
МенеджерЗаписи.АртикулКонтрагента = АртикулКонтрагента;
МенеджерЗаписи.Номенклатура = Номенклатура;
МенеджерЗаписи.НаименованиеКонтрагента = НаименованиеКонтрагента;
МенеджерЗаписи.Период = ТекущаяДата();
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
Сообщить("Ошибка записи соответствия для артикула " + АртикулКонтрагента + ": " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важный нюанс: параметр «Истина» в методе Записать() означает замену существующей записи. Это защищает от дублей при повторной загрузке — старое соответствие просто перезапишется новым.
Типичные грабли и как их обойти
За годы практики накопился целый зоопарк проблем, с которыми сталкиваются при загрузке номенклатуры контрагентов. Разберём самые болезненные.
Проблема 1: «Грязные» артикулы от поставщиков
Поставщики — люди творческие. Один и тот же артикул может выглядеть как «ABC-123», «ABC 123», «abc123», «АВС-123» (с русскими буквами!) и «ABC–123» (с длинным тире). Перед поиском всегда нормализуйте артикул:
Функция НормализоватьАртикул(Артикул)
// Убираем пробелы по краям
Результат = СокрЛП(Артикул);
// Переводим в верхний регистр
Результат = ВРег(Результат);
// Убираем двойные пробелы
Пока Найти(Результат, " ") > 0 Цикл
Результат = СтрЗаменить(Результат, " ", " ");
КонецЦикла;
// Заменяем длинное тире на обычный дефис
Результат = СтрЗаменить(Результат, "–", "-");
Результат = СтрЗаменить(Результат, "—", "-");
Возврат Результат;
КонецФункции
Проблема 2: Единицы измерения и коэффициенты
Поставщик продаёт товар в упаковках по 12 штук, а у вас в базе единица измерения — штука. Если не указать коэффициент пересчёта, при загрузке документов количество будет в 12 раз больше реального. Реальный случай из практики: компания загрузила 500 позиций без коэффициентов, провела приёмку, а потом обнаружила расхождение с реальным складом на сумму около 2,3 млн рублей. Пришлось всё перепроводить вручную.
Поэтому в форме обработки обязательно предусмотрите колонку для единицы измерения контрагента и коэффициента. А в регистр пишите так:
МенеджерЗаписи.ЕдиницаИзмерения = НайтиЕдиницуИзмерения(НаименованиеЕдиницы);
МенеджерЗаписи.Коэффициент = ?(Коэффициент = 0, 1, Коэффициент);
Проблема 3: Характеристики номенклатуры
В УТ 11 и ERP 2 активно используются характеристики номенклатуры. Например, «Футболка» может иметь характеристики «Размер: S», «Размер: M», «Размер: L». Поставщик может присылать каждый размер отдельным артикулом, а у вас в базе это одна номенклатура с разными характеристиками.
Для таких случаев нужно расширить логику поиска и добавить в регистр заполнение поля «Характеристика». Это усложняет обработку, но без этого корректная автоподстановка работать не будет.
Проблема 4: Дубли в справочнике номенклатуры
Классика жанра: в базе есть «Болт М8х40» и «Болт М8*40», «Труба ПВХ 50мм» и «Труба ПВХ D50». Поиск по наименованию находит первый попавшийся вариант, который может оказаться неверным. Перед массовой загрузкой обязательно проводите дедупликацию справочника номенклатуры. Иначе соответствия будут записаны неправильно, и потом придётся разбираться, почему при приёмке подставляется не тот товар.
Особенности для ERP 2 и КА 2: на что обратить внимание
ERP 2 и КА 2 — конфигурации более сложные, чем УТ 11. Есть несколько важных отличий, которые влияют на загрузку номенклатуры контрагентов.
Расширенная аналитика и виды номенклатуры
В ERP 2 есть понятие «Вид номенклатуры» — это группировка по типу товара с настройками учёта. При создании новой номенклатуры через обработку обязательно указывайте вид номенклатуры, иначе новый элемент создастся с пустым видом, что потом вызовет проблемы при проведении документов.
Функция СоздатьНоменклатуру(Наименование, Артикул)
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = Наименование;
НовыйЭлемент.Артикул = Артикул;
НовыйЭлемент.ВидНоменклатуры = Объект.ВидНоменклатуры; // Берём из параметров обработки
НовыйЭлемент.ЕдиницаИзмерения = Объект.ЕдиницаИзмеренияПоУмолчанию;
НовыйЭлемент.СтавкаНДС = Объект.СтавкаНДС;
Попытка
НовыйЭлемент.Записать();
Возврат НовыйЭлемент.Ссылка;
Исключение
Сообщить("Ошибка создания номенклатуры '" + Наименование + "': " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Сегменты номенклатуры и ценообразование
В ERP 2 номенклатура может быть включена в ценовые сегменты, которые влияют на автоматическое ценообразование. Если вы массово создаёте новую номенклатуру, не забудьте потом добавить её в нужные сегменты. Иначе новые товары не попадут в прайс-листы и цены для них не будут рассчитываться автоматически.
Производительность при больших объёмах
Если нужно загрузить 10 000+ позиций, построчная запись через менеджер записи будет работать медленно — примерно 500-800 записей в минуту. Для больших объёмов используйте наборы записей:
НаборЗаписей = РегистрыСведений.НоменклатураКонтрагентов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Контрагент);
// Заполняем набор из подготовленной таблицы значений
Для Каждого СтрокаТЗ Из ТаблицаДляЗаписи Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Контрагент = Контрагент;
НоваяЗапись.АртикулКонтрагента = СтрокаТЗ.Артикул;
НоваяЗапись.Номенклатура = СтрокаТЗ.Номенклатура;
НоваяЗапись.НаименованиеКонтрагента = СтрокаТЗ.Наименование;
НоваяЗапись.Период = ТекущаяДата();
КонецЦикла;
НаборЗаписей.Записать();
Набор записей работает в 5-10 раз быстрее построчной записи — особенно заметно на объёмах от 5 000 позиций. Правда, здесь есть нюанс: набор записей с отбором по контрагенту при записи сначала удалит все старые записи по этому контрагенту, а потом запишет новые. Поэтому убедитесь, что в таблице для записи есть все актуальные данные, а не только новые строки.
Практический кейс: загрузка 4 500 позиций для дистрибьютора
Расскажу о реальном проекте (детали изменены). Дистрибьютор строительных материалов, работает на ERP 2. Три основных поставщика, каждый присылает прайс-лист раз в неделю. Суммарно — около 4 500 активных позиций номенклатуры.
До автоматизации процесс выглядел так:
- Менеджер получает Excel от поставщика
- Вручную ищет каждую позицию в 1С
- Создаёт документ поступления, вбивая всё руками
- На обработку одного прайса уходило 3-4 часа
- Три поставщика × 4 часа = 12 часов в неделю только на ввод данных
После внедрения обработки загрузки:
- Первоначальная загрузка соответствий заняла 2 дня (с проверкой и ручным разбором несопоставленных позиций)
- Теперь обновление прайса занимает 15-20 минут: загрузил файл, проверил несопоставленные позиции, нажал «Загрузить»
- Экономия: около 10 часов в неделю, или 40 часов в месяц
- При стоимости рабочего времени менеджера 800 рублей в час — это 32 000 рублей экономии ежемесячно
- Обработка окупилась за первый месяц использования
Отдельно стоит отметить качество данных: раньше при ручном вводе ошибки в количестве или номенклатуре случались примерно в 3-5% документов. После автоматизации — ноль ошибок по вине человеческого фактора при вводе.
Что делать, если соответствие не находится: организация ручной разборки
Никакой алгоритм не даст 100% сопоставления с первого раза. Особенно если у поставщика нет артикулов, а только наименования, и эти наименования написаны с ошибками или сокращениями. Хорошая обработка должна не просто падать с ошибкой, а формировать список несопоставленных позиций для ручной разборки.
Оптимальный сценарий работы:
- Обработка загружает всё, что смогла сопоставить автоматически
- Несопоставленные позиции выводятся в отдельную таблицу на форме
- Пользователь видит артикул и наименование от поставщика, рядом — поле для выбора номенклатуры из базы
- После ручного сопоставления нажимает «Записать выбранные» — и эти позиции тоже попадают в регистр
- В следующий раз эти позиции уже найдутся автоматически
Такой подход позволяет за 2-3 итерации загрузки достичь 95-98% автоматического сопоставления. Оставшиеся 2-5% — это обычно новые позиции, которых ещё нет в базе.
Итоги: когда делать самому, а когда звать специалиста
Загрузка номенклатуры контрагентов — задача вполне решаемая своими силами, если у вас есть базовые навыки разработки в 1С. Типичная обработка пишется за 8-16 часов, включая тестирование. Это если у вас простой случай: один поставщик, стандартный Excel, без характеристик и сложных единиц измерения.
Когда лучше привлечь специалиста:
- Много поставщиков с разными форматами файлов — нужна универсальная обработка с настраиваемым маппингом колонок
- Используются характеристики номенклатуры — логика усложняется в несколько раз
- Нужна интеграция с EDI или порталом поставщика — это уже полноценный интеграционный проект
- База сильно кастомизирована — стандартные решения могут не подойти
- Объём данных более 50 000 позиций — нужна оптимизация производительности
Стоимость разработки такой обработки у опытного специалиста — от 15 000 до 60 000 рублей в зависимости от сложности. Звучит как деньги, но если посчитать, сколько часов в месяц тратится на ручной ввод данных — окупаемость обычно составляет 1-3 месяца.
Главное правило: не экономьте на первоначальной настройке соответствий. Потраченные один раз 2-3 дня на качественную загрузку сэкономят сотни часов в будущем. И не забывайте поддерживать регистр в актуальном состоянии — когда поставщик меняет артикулы или добавляет новые позиции, нужно оперативно обновлять соответствия.
Если вам нужна помощь с загрузкой номенклатуры контрагентов, разработкой обработки под ваш формат данных или любой другой задачей в 1С — заходите на koderion.ru. Это биржа проверенных специалистов по 1С: можно найти разработчика под конкретную задачу, сравнить цены и отзывы, и не тратить время на поиск через сарафанное радио. Задачи берутся в работу быстро — большинство специалистов откликаются в течение нескольких часов.