Однажды в далекой-далекой галактике... потребовалось мне преобразовать некоторое число в формат EAN13. Зачем? Потому что штрихкод для товаров должен формироваться по маске. А если я загружаю в 1С товары через шаблон в Экселе, то мне нужно сгенерировать штрихкод так, чтобы он подходил под стандарт EAN13. Что такое и как он формируется можно прочитать, например, здесь. Или здесь, если нужно углубление в историю.
Если вкратце, он состоит из 12 числовых символов и контрольной цифры. Вообще, стандарту глубоко пофигу, по какому принципу формируются первые 12 символов - что там закодировано в первых трех или первых двух символах. Никто не запрещает по этому стандарту взять номера телефонов и закодировать их. У меня случилось так, что в системе БИТ.WMS штрихкод формируется следующим образом - сначала префикс "291" или "292", "293", "294" +цифры из поля "Код", добавленные до 9 цифр нулями спереди, и контрольная цифра EAN13.
Так как у меня в таблице есть список значений поля "Код" в столбце, то логично написать пользовательскую функцию, которая преобразует это в нужный мне код по маске. И вот что получилось:
Function CREATE_EAN13(Префикс As String, Код As String) As String
'Проверка контрольной цифры ean 13
'Для проверки контрольной цифры EAN-13 понадобятся цифры кода с 1-й по 12-ю.
'
'Действуем по следующему алгоритму:
'
'Суммировать цифры на четных позициях;
'Результат пункта 1 умножить на 3;
'Суммировать цифры на нечетных позициях;
'Суммировать результаты пунктов 2 и 3;
'Контрольное число — разница между окончательной суммой и ближайшим к ней наибольшим числом, кратным 10-ти.
'Пример расчета контрольной цифры ean-13
'
'46 79135 74987 (?)
'
'6+9+3+7+9+7 = 41
'41х3=123;
'4+7+1+5+4+8 = 29;
'123+29 = 152
'160-152 = 8
'Искомая контрольная цифра — 8; полный номер EAN-кода — 46 79135 74987 8.
Dim ContrCif As Long, Chet As Long, Nech As Long, Temp As String
'нужна проверка кода до 12 цифр
Dim chk As Long
Temp = Префикс
If Len(Код) + Len(Префикс) < 12 Then
For i = 1 To 12 - (Len(Код) + Len(Префикс))
Temp = Temp & "0"
Next i
Temp = Temp & Код
Else
If Len(Код) + Len(Префикс) > 12 Then
CREATE_EAN13 = "Префикс с кодом больше 12 знаков"
GoTo 10
Else
If Len(Код) + Len(Префикс) = 12 Then Temp = Префикс & Код
End If
End If
For i = 2 To 12 Step 2 '1.суммирование четных позиций
Chet = Chet + CLng(Mid(Temp, i, 1))
Next i
Chet = Chet * 3 'умножение четной на три
For i = 1 To 11 Step 2 '3.суммирование нечетных позиций
Nech = Nech + CLng(Mid(Temp, i, 1))
Next i
ContrCif = Chet + Nech 'сложение суммы четных позиций с нечетом
If Fix(ContrCif / 10) * 10 = ContrCif Then
ContrCif = 0
Else
ContrCif = Abs(ContrCif - ((Fix(ContrCif / 10) + 1) * 10))
End If
CREATE_EAN13 = Temp & ContrCif
10 End Function
И вот как это работает: