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

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 контрольная цифра

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124943    683    389    

732

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2248    andrey_sag    10    

28

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6006    KawaNoNeko    23    

25

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2149    2    Yashazz    0    

31

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6641    31    mkalimulin    27    

51

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1880    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5626    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16594    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. oldcopy 173 26.08.19 02:50 Сейчас в теме
2. Aleskey_K 33 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 39 30.08.19 10:09 Сейчас в теме
(3) Да, видел это решение. Собственно, его наличие и сподвигло меня на разработку расчета запросом: "Ну если в Экселе это возможно, то почему в запросе нельзя?"
+
5. AlexGerasimov 03.03.21 15:48 Сейчас в теме
Все работает. Годный код
+
Оставьте свое сообщение