Last active
September 3, 2023 12:26
-
-
Save ruslan-hut/ce148b4c10e87eeb8bae5cef94fa8b6e to your computer and use it in GitHub Desktop.
Генерация строки, печатаемой как код EAN13 : ШтрихКодЕАН13
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Генерация строки, печатаемой как код 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