Часто при автоматизации розничной торговли и складского учета возникает необходимость навести порядок в базе данных и найти проблемные штрихкоды. Рассмотрим подробнее ситуацию, когда нам необходимо отобрать номенклатуру с дублирующимися штрихкодами. Проанализируем эту задачу с технической точки зрения и разберем по шагам написание нужных запросов.
Прежде чем писать запрос, давайте выясним, где именно хранятся данные. Начинающие разработчики иногда путают табличные части справочников и регистры сведений. В классических конфигурациях (например, УПП, УТ 10.3) и в современных (ERP, УТ 11, Розница) штрихкоды хранятся в специальном регистре сведений Штрихкоды (или ШтрихкодыНоменклатуры).
Важное правило архитектуры 1С: регистр сведений не позволяет создавать абсолютно идентичные записи с совпадающими ключевыми измерениями. То есть "дубль" в самом регистре технически невозможен. Когда мы говорим о "дублях", мы подразумеваем одну из двух ситуаций:
Мы подробно разберем, как решить обе эти задачи с помощью встроенного языка запросов 1С.
Представим, что пользователи завели одинаковый код для "ведра" и "подушки". Нам нужно выявить все такие пересечения во всей базе. Для этого мы будем использовать группировку и логическое условие ИМЕЮЩИЕ.
Посмотрим на пример запроса, который находит штрихкоды, встречающиеся в базе более одного раза, и выводит саму номенклатуру:
ВЫБРАТЬ
НоменклатураШтрихкодов.Владелец КАК Номенклатура,
НоменклатураШтрихкодов.Штрихкод КАК Штрихкод
ИЗ
РегистрСведений.Штрихкоды КАК НоменклатураШтрихкодов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
Штрихкоды.Штрихкод КАК Штрихкод
ИЗ
РегистрСведений.Штрихкоды КАК Штрихкоды
СГРУППИРОВАТЬ ПО
Штрихкоды.Штрихкод
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Штрихкоды.Штрихкод) > 1
) КАК ДублирующиесяШтрихкоды
ПО НоменклатураШтрихкодов.Штрихкод = ДублирующиесяШтрихкоды.Штрихкод
Как работает этот код: Во вложенном запросе мы берем таблицу регистра, группируем ее по полю Штрихкод и с помощью конструкции ИМЕЮЩИЕ КОЛИЧЕСТВО(Штрихкоды.Штрихкод) > 1 отсекаем уникальные значения. Полученный список проблемных кодов мы внутренним соединением (join) связываем с основной таблицей регистра, чтобы вытащить ссылочные данные — саму номенклатуру.
Часто задача формулируется иначе. Требуется найти позиции, где количество штрихкодов на одну базовую упаковку больше одного (например, для проверки корректности обмена или выявления ошибок ручного ввода). То есть код у товара разный, но записей слишком много.
Разберем по шагам, как построить такой запрос. В этом случае нам нужно сгруппировать данные по товару и посчитать количество уникальных кодов. Для этого отлично подойдет оператор РАЗЛИЧНЫЕ внутри агрегатной функции.
ВЫБРАТЬ
Штрихкоды.Владелец КАК Номенклатура,
Штрихкоды.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Штрихкоды.Штрихкод) КАК КоличествоШтрихкодов
ИЗ
РегистрСведений.Штрихкоды КАК Штрихкоды
СГРУППИРОВАТЬ ПО
Штрихкоды.Владелец,
Штрихкоды.ЕдиницаИзмерения
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Штрихкоды.Штрихкод) > 1
Объяснение логики: Мы группируем записи регистра по полям Владелец (номенклатура) и ЕдиницаИзмерения. Условие ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...) > 1 позволяет сразу отсеять товары с одним штрихкодом и вывести список именно тех позиций, где на одну упаковку/единицу заведено несколько разных значений. Это самый оптимальный и быстрый способ найти переизбыток данных.
Проанализируем ситуацию: как получается так, что у совершенно разных сущностей (условно ведро и подушка) оказывается один и тот же заводской штрихкод? Это не всегда ошибка ручного ввода пользователя.
1234567890128. В итоге товары от разных заводов приходят на склад с одинаковым "лицом".Рассмотрим эволюцию механизмов платформ. В более старых решениях, чтобы избежать дублей, добавляли новые измерения в регистр (например, случайный GUID). В современных конфигурациях (ERP Управление предприятием, Комплексная автоматизация, Управление торговлей 11, Розница 2.3 и выше) разработчики пошли другим путем.
Поскольку проблема одинаковых заводских штрихкодов объективна и ее нельзя запретить аппаратно, в 1С предусмотрена опция "Использовать неуникальные штрихкоды". Если она включена:
Кроме того, если вам не хочется писать запросы вручную, в актуальных релизах (например, в 1С:Розница) уже существует встроенный функционал. В разделе настроек можно найти рабочее место Анализ штрихкодов. Там по нажатию одной кнопки формируется таблица со всеми пересечениями (когда штрихкод имеет двух и более владельцев). Если база сильно "замусорена", лучше использовать специализированные внешние обработки по поиску и удалению дублей, так как они позволяют корректно вычистить регистры, проверив наличие движений по связанным товарам.