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

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С.

12000 руб.

02.09.2020    169274    937    403    

905

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

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

18.10.2024    11394    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

11.10.2024    6338    XilDen    36    

83

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

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

16.08.2024    9068    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10219    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Все работает. Годный код
Оставьте свое сообщение