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

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    131960    721    390    

763

Как посмотреть итоговый запрос в отчете СКД

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

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

15.05.2024    3914    implecs_team    6    

37

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

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

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

11.04.2024    2687    andrey_sag    10    

32

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

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

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

13.02.2024    6384    KawaNoNeko    23    

26

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

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

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

1 стартмани

31.01.2024    2349    2    Yashazz    0    

32

Запрос 1С copilot

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

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

15.01.2024    7329    51    mkalimulin    32    

54

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

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

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

14.12.2023    2078    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

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

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3550    52    DrZombi    54    

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