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