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

Алгоритм формирования контрольной цифры штрих-кода 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

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

3 Comments

  1. Aleskey_K

    (1) потому что может

    Reply
  2. v3rter

    Тоже поделюсь: расчет контрольной цифры 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)
    Reply
  3. vadver

    (3) Да, видел это решение. Собственно, его наличие и сподвигло меня на разработку расчета запросом: «Ну если в Экселе это возможно, то почему в запросе нельзя?»

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *