Skip to content

Instantly share code, notes, and snippets.

@ruslan-hut
Last active September 3, 2023 12:26
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ruslan-hut/ce148b4c10e87eeb8bae5cef94fa8b6e to your computer and use it in GitHub Desktop.
Save ruslan-hut/ce148b4c10e87eeb8bae5cef94fa8b6e to your computer and use it in GitHub Desktop.
Генерация строки, печатаемой как код EAN13 : ШтрихКодЕАН13
// Генерация строки, печатаемой как код EAN13
Функция ШтрихКодЕАН13(ИсходныйКод, ФормироватьЧисловойКод=0) Экспорт
Код = СокрЛП(УбратьНечисловыеСимволы(ИсходныйКод));
Если СтрДлина(код) > 12 Тогда
Код=Лев(Код,12);
//Сообщить("Код для EAN13 должен быть длинной не более 12 символов.");
//Возврат "";
КонецЕсли;
// Дополнение лидирующими пробелами
код = ДобавитьСлева(Строка(код),12,"0");
// Добавление кода четности - для кода, дополненого слева "0"
код = код + Строка(ParityCheck("0"+Код));
Если ФормироватьЧисловойКод=1 Тогда
Возврат Код;
КонецЕсли;
//Разбор строки
ПервыйФлаг = Число(Сред(код,1,1));
левстр = Сред(код,2,6);
правстр = Сред(код,8,6);
правкод = "";
Для Поз = 1 По 6 Цикл
правкод = правкод + NumberToLowerChar(Сред(правстр,Поз,1));
КонецЦикла;
// Формирование левой части кода зависит от значениа ПервыйФлаг
Если ПервыйФлаг = 0 Тогда
// 0 A A A A A
левкод = "#!" + Лев(левстр,1)
+ Сред(левстр,2,1)
+ Сред(левстр,3,1)
+ Сред(левстр,4,1)
+ Сред(левстр,5,1)
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 1 Тогда
// 1 A A B A B B
левкод = "$!"
+ Лев(левстр,1)
+ Сред(левстр,2,1)
+ NumberToUpperChar(Сред(левстр,3,1))
+ Сред(левстр,4,1)
+ NumberToUpperChar(Сред(левстр,5,1))
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 2 Тогда
// 2 A A B B A B
левкод = "%!"
+ Лев(левстр,1)
+ Сред(левстр,2,1)
+ NumberToUpperChar(Сред(левстр,3,1))
+ NumberToUpperChar(Сред(левстр,4,1))
+ Сред(левстр,5,1)
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 3 Тогда
// 3 A A B B B A
левкод = "&!"
+ Лев(левстр,1)
+ Сред(левстр,2,1)
+ NumberToUpperChar(Сред(левстр,3,1))
+ NumberToUpperChar(Сред(левстр,4,1))
+ NumberToUpperChar(Сред(левстр,5,1))
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 4 Тогда
// 4 A B A A B B
левкод = "'!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ Сред(левстр,3,1)
+ Сред(левстр,4,1)
+ NumberToUpperChar(Сред(левстр,5,1))
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 5 Тогда
// 5 A B B A A B
левкод = "(!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ NumberToUpperChar(Сред(левстр,3,1))
+ Сред(левстр,4,1)
+ Сред(левстр,5,1)
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 6 Тогда
// 6 A B B B A A
левкод = ")!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ NumberToUpperChar(Сред(левстр,3,1))
+ NumberToUpperChar(Сред(левстр,4,1))
+ Сред(левстр,5,1)
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 7 Тогда
// 7 A B A B A B
левкод = "*!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ Сред(левстр,3,1)
+ NumberToUpperChar(Сред(левстр,4,1))
+ Сред(левстр,5,1)
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 8 Тогда
// 8 A B A B B A
левкод = "+!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ Сред(левстр,3,1)
+ NumberToUpperChar(Сред(левстр,4,1))
+ NumberToUpperChar(Сред(левстр,5,1))
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 9 Тогда
// 9 A B B A B A
левкод = ",!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ NumberToUpperChar(Сред(левстр,3,1))
+ Сред(левстр,4,1)
+ NumberToUpperChar(Сред(левстр,5,1))
+ Сред(левстр,6,1);
КонецЕсли;
// Получение строки - результата
кодстр = левкод + "-" + правкод + "!";
Возврат кодстр;
КонецФункции
// дополнительные функции
Функция NumberToUpperChar( Num )
UpperCharSet = "ABCDEFGHIJ";
Num = Число(Прав(Num,1));
Стр = Сред(UpperCharSet, Num + 1, 1);
Возврат Стр;
КонецФункции
Функция NumberToLowerChar( Num )
LowerCharSet = "abcdefghij";
Num = Число(Прав(Num,1));
Стр = Сред(LowerCharSet, Num + 1, 1);
Возврат Стр;
КонецФункции
Функция ParityCheck(Код) // Вычисление кода четности
четн = 0;
неч = 0;
// Для строки с нечетной длинной верхняя граница
// округлается в большую сторону
Для Поз = 1 По Окр(СтрДлина(Код) / 2 + 0.1,0)
Цикл
неч = неч + Сред(Код, Поз * 2 - 1, 1);
Если Поз * 2 <= СтрДлина(Код)
Тогда
четн = четн + Сред(Код, Поз * 2, 1);
КонецЕсли;
КонецЦикла;
КодЧетности = Число(Прав(Строка(1000 - четн - неч * 3), 1));
Возврат КодЧетности;
КонецФункции
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment