Есть много публикаций (здесь и на других ресурсах), в которых реализован алгоритм формирования контрольной цифры штрих-кода (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
Собственно, кто хочет, на вышеприведенной ссылке есть калькулятор. Можете проверять