Формирование контрольной цифры штрих-кода запросом

24.08.19

Разработка - Запросы

Алгоритм формирования контрольной цифры штрих-кода EAN-13 с помощью запроса 1С:Предприятия

Есть много публикаций (здесь и на других ресурсах), в которых реализован алгоритм формирования контрольной цифры штрих-кода (EAN-13, EAN-8). Везде они реализованы средствами того или иного языка.

Передо мной была поставлена задача - сделать отчет с генерацией последовательных номеров штрих-кодов по стандарту EAN-13 и выводом в табличный документ.

Самое простое решение, которое сразу приходит на ум - счетчик от "Код (мин)" до "Код (макс)" с добавлением префикса штрих-кода и расчетом контрольной цифры. Сначала так и было сделано (разработка была под УТ 11, но годится и для КА, и для ERP):

Для СчетчикШК = КодМин По КодМакс Цикл
	ШК = ПрефиксШК + Формат(СчетчикШК, "ЧЦ=10; ЧВН=; ЧГ=");
	ПолныйШК = ШК + РегистрыСведений.ШтрихкодыНоменклатуры.КонтрольныйСимволEAN(ШК, 13);
КонецЦикла;

Метод "КонтрольныйСимволEAN" - типовой, приводить не буду

Проблема заключается в том, что на небольших промежутках этот код отрабатывает достаточно быстро. Если же промежуток брать десятки или сотни тысяч - торможение будет уже заметным.

Я задумался: "А нельзя ли возложить расчет контрольной цифры на SQL-сервер?". Как оказалось, вполне возможно:

ВЫБРАТЬ
	ПОДСТРОКА(&ШтрихКод, 12, 1) КАК ЧетныеЦифры,
	ПОДСТРОКА(&ШтрихКод, 11, 1) КАК НечетныеЦифры
ПОМЕСТИТЬ ВТ_Цифры
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ПОДСТРОКА(&ШтрихКод, 10, 1),
	ПОДСТРОКА(&ШтрихКод, 9, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ПОДСТРОКА(&ШтрихКод, 8, 1),
	ПОДСТРОКА(&ШтрихКод, 7, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ПОДСТРОКА(&ШтрихКод, 6, 1),
	ПОДСТРОКА(&ШтрихКод, 5, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ПОДСТРОКА(&ШтрихКод, 4, 1),
	ПОДСТРОКА(&ШтрихКод, 3, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ПОДСТРОКА(&ШтрихКод, 2, 1),
	ПОДСТРОКА(&ШтрихКод, 1, 1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СУММА(ВЫБОР КОГДА ВТ_Цифры.ЧетныеЦифры = ""1"" ТОГДА 1
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""2"" 	ТОГДА 2
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""3"" 	ТОГДА 3
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""4"" 	ТОГДА 4
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""5"" 	ТОГДА 5
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""6"" 	ТОГДА 6
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""7"" 	ТОГДА 7
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""8""  ТОГДА 8
			КОГДА ВТ_Цифры.ЧетныеЦифры = ""9"" 	ТОГДА 9
			ИНАЧЕ 0
		КОНЕЦ) * 3 + СУММА(ВЫБОР КОГДА ВТ_Цифры.НечетныеЦифры = ""1"" ТОГДА 1
			КОГДА ВТ_Цифры.НечетныеЦифры = ""2"" ТОГДА 2
			КОГДА ВТ_Цифры.НечетныеЦифры = ""3"" ТОГДА 3
			КОГДА ВТ_Цифры.НечетныеЦифры = ""4"" ТОГДА 4
			КОГДА ВТ_Цифры.НечетныеЦифры = ""5"" ТОГДА 5
			КОГДА ВТ_Цифры.НечетныеЦифры = ""6"" ТОГДА 6
			КОГДА ВТ_Цифры.НечетныеЦифры = ""7"" ТОГДА 7
			КОГДА ВТ_Цифры.НечетныеЦифры = ""8"" ТОГДА 8
			КОГДА ВТ_Цифры.НечетныеЦифры = ""9"" ТОГДА 9
			ИНАЧЕ 0
		КОНЕЦ) КАК СуммаЦифр
ПОМЕСТИТЬ ВТ_СуммаЦифр
ИЗ
	ВТ_Цифры КАК ВТ_Цифры
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА ВТ_СуммаЦифр.СуммаЦифр = (ВЫРАЗИТЬ(ВТ_СуммаЦифр.СуммаЦифр / 10 КАК ЧИСЛО(2, 0))) * 10
			ТОГДА 0
		КОГДА ВТ_СуммаЦифр.СуммаЦифр < (ВЫРАЗИТЬ(ВТ_СуммаЦифр.СуммаЦифр / 10 КАК ЧИСЛО(2, 0))) * 10
			ТОГДА (ВЫРАЗИТЬ(ВТ_СуммаЦифр.СуммаЦифр / 10 КАК ЧИСЛО(2, 0))) * 10 - ВТ_СуммаЦифр.СуммаЦифр
			ИНАЧЕ 10 - (ВТ_СуммаЦифр.СуммаЦифр - (ВЫРАЗИТЬ(ВТ_СуммаЦифр.СуммаЦифр / 10 КАК ЧИСЛО(2, 0))) * 10)
	КОНЕЦ КАК КонтрольныйСимвол
ИЗ
    ВТ_СуммаЦифр КАК ВТ_СуммаЦифр

Параметр запроса "ШтрихКод" - строка, в которой 12 цифр

Алгоритм расчета контрольной цифры взят отсюда: http://gs1md.org/ru/definirea-cifrei-de-control/

Проверялось на 000000000001, 999999999999 и 345678905675

Собственно, кто хочет, на вышеприведенной ссылке есть калькулятор. Можете проверять

Штрих-код EAN-13 контрольная цифра

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184726    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2200    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5733    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13140    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8220    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3192    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10801    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. oldcopy 174 26.08.19 02:50 Сейчас в теме
2. Aleskey_K 35 27.08.19 08:54 Сейчас в теме
(1) потому что может
WellMaster; vadver; +2 Ответить
3. v3rter 30.08.19 09:16 Сейчас в теме
Тоже поделюсь: расчет контрольной цифры EAN-13 в MS Excel: http://polezhit.blogspot.com/2013/03/ean-13-excel.html

Формула выводит все 13 цифр включая последнюю контрольную.

=[cell]*10+MOD (10-MOD (3*(MID ([cell];2;1)+MID ([cell];4;1)+MID ([cell];6;1)+MID ([cell];8;1)+MID ([cell];10;1)+MID ([cell];12;1))+MID ([cell];1;1)+MID ([cell];3;1)+MID ([cell];5;1)+MID ([cell];7;1)+MID ([cell];9;1)+MID ([cell];11;1);10);10)

[cell] - ячейка в которой 12-значный штрих-код.
В русской версии Excel вместо функций MOD и MID поставить ОСТАТ и ПСТР сответственно:

=[cell]*10+ОСТАТ(10-ОСТАТ(3*(ПСТР([cell];2;1)+ПСТР([cell];4;1)+ПСТР([cell];6;1)+ПСТР([cell];8;1)+ПСТР([cell];10;1)+ПСТР([cell];12;1))+ПСТР([cell];1;1)+ПСТР([cell];3;1)+ПСТР([cell];5;1)+ПСТР([cell];7;1)+ПСТР([cell];9;1)+ПСТР([cell];11;1);10);10)
Andrekaa; vadver; +2 Ответить
4. vadver 41 30.08.19 10:09 Сейчас в теме
(3) Да, видел это решение. Собственно, его наличие и сподвигло меня на разработку расчета запросом: "Ну если в Экселе это возможно, то почему в запросе нельзя?"
5. AlexGerasimov 03.03.21 15:48 Сейчас в теме
Все работает. Годный код
Оставьте свое сообщение