Формирование штрихкода EAN-13 шрифтом EanGnivc

31.12.14

Разработка - Универсальные функции

Функция преобразования текстового представления ШК к последовательности символов шрифта EanGnivc

Способ кодирования каждого символа штрихкода по алгоритму EAN зависит не только от его значения, но и от положения. Таким образом, для вывода штрихкода шрифтом EanGnivc,  недостаточно указать шрифт - штрихкод должен быть преобразован из текстового представления "2880000004097" в строку вида "%!88AA0A-aaeajh!". Что и делает представленная функция.

upd

Добавил поддержку формирования EAN-8

Функция СформироватьСтрокуEanGnivc(ШтрихкодСтрокойСимволов) Экспорт
    Попытка
       
Тест = Число(ШтрихкодСтрокойСимволов);
    Исключение
        ВызватьИсключение
"Штрихкод может содержать только цифры";
    КонецПопытки;

   
СимволыСпособовКодирования = "#$%&'()*+,";
   
ЛевыйЗащитныйШаблон = "!";
   
СреднийЗащитныйШаблон = "-";
   
ПравыйЗащитныйШаблон = "!";

   
СимволыШрифтаПоТипамКодов = Новый Соответствие;
   
СимволыШрифтаПоТипамКодов.Вставить("L", "0123456789");
   
СимволыШрифтаПоТипамКодов.Вставить("G", "ABCDEFGHIJ");
   
СимволыШрифтаПоТипамКодов.Вставить("R", "abcdefghij");

   
СпособыКодированияЛевойЧасти = Новый Массив;
   
СпособыКодированияЛевойЧасти.Добавить("LLLLLL");
   
СпособыКодированияЛевойЧасти.Добавить("LLGLGG");
   
СпособыКодированияЛевойЧасти.Добавить("LLGGLG");
   
СпособыКодированияЛевойЧасти.Добавить("LLGGGL");
   
СпособыКодированияЛевойЧасти.Добавить("LGLLGG");
   
СпособыКодированияЛевойЧасти.Добавить("LGGLLG");
   
СпособыКодированияЛевойЧасти.Добавить("LGGGLL");
   
СпособыКодированияЛевойЧасти.Добавить("LGLGLG");
   
СпособыКодированияЛевойЧасти.Добавить("LGLGGL");
   
СпособыКодированияЛевойЧасти.Добавить("LGGLGL");

   
СпособКодированияПравойЧасти = "RRRRRR";

    Если
СтрДлина(ШтрихкодСтрокойСимволов) = 13 Тогда
       
КоличествоСимволовВГруппе = 6;
    ИначеЕсли
СтрДлина(ШтрихкодСтрокойСимволов) = 8 Тогда
       
КоличествоСимволовВГруппе = 4;
       
СимволыСпособовКодирования = "";
       
ШтрихкодСтрокойСимволов = "0"+ШтрихкодСтрокойСимволов;
    Иначе
        ВызватьИсключение
"Поддерживаются только штрихкоды длиной 13 и 8 символов";
    КонецЕсли;

   
ИндексСпособаКодирования = Число(Лев(ШтрихкодСтрокойСимволов,1));

   
ЛеваяЧастьКода = "";
   
ПраваяЧастьКода = "";

    Для
ИндексСимвола = 1 По КоличествоСимволовВГруппе Цикл
       
ЛеваяЧастьКода = ЛеваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособыКодированияЛевойЧасти[ИндексСпособаКодирования],ИндексСимвола,1)]
                    ,
Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1
                   
,1);
       
ПраваяЧастьКода = ПраваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособКодированияПравойЧасти,ИндексСимвола,1)]
                    ,
Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+КоличествоСимволовВГруппе+1),1))+1
                   
,1);
    КонецЦикла;

   
Результат = ""  + Сред(СимволыСпособовКодирования,ИндексСпособаКодирования+1,1)
                    +
ЛевыйЗащитныйШаблон
                    + ЛеваяЧастьКода
                    + СреднийЗащитныйШаблон
                    + ПраваяЧастьКода
                    + ПравыйЗащитныйШаблон;
    Возврат
Результат;
КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3478    Abysswalker    8    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    6442    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    48951    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7330    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    61226    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9130    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. via 93 04.06.13 10:43 Сейчас в теме
Добавь для Ean8

    СимволСпособаКодирования = "";
    ИндексСпособаКодирования = 0;

    Для ИндексСимвола = 0 По 3 Цикл
        ЛеваяЧастьКода = ЛеваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособыКодированияЛевойЧасти[ИндексСпособаКодирования],ИндексСимвола,1)]
                    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1
                    ,1);
        ПраваяЧастьКода = ПраваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособКодированияПравойЧасти,ИндексСимвола,1)]
                    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+5),1))+1
                    ,1);
    КонецЦикла;
Показать
2. saiten 249 04.06.13 13:48 Сейчас в теме
(1) Спасибо, добавил. В принципе, предполагал что он примерно так и формируется, но проверять было лениво.
3. пользователь 05.06.13 11:20
Сообщение было скрыто модератором.
...
4. mc1c80 20.09.13 14:49 Сейчас в теме
Спасибо, как раз искал это.
5. mc1c80 20.09.13 15:32 Сейчас в теме
Что-то у меня не распознает сформированный штрихкод.
6. saiten 249 24.09.13 13:06 Сейчас в теме
(5)Какой штрихкод пытаетесь сформировать? Проверю.
7. swimdog 787 26.10.13 23:20 Сейчас в теме
Переделал под 7.7. Все работает.
8. maxpiter 150 06.05.14 19:08 Сейчас в теме
(7) swimdog,
Привет, поделись, пожалуйста, версией для 7ки :)
10. maxpiter 150 07.05.14 11:20 Сейчас в теме
(7) проехали, уже не актуально :)
11. MICK77 15 30.06.14 17:51 Сейчас в теме
(7) swimdog, Привет. Есть возможность поделиться вариантом для 7,7?
9. akR00b 25 07.05.14 11:06 Сейчас в теме
12. d0dger 84 30.12.14 17:48 Сейчас в теме
Во второй строке должно быть LLGLGG
burgur; saiten; +2 Ответить
13. saiten 249 31.12.14 09:49 Сейчас в теме
(12)Действительно. Сейчас поправлю, спасибо.
14. Wall30 25.03.16 13:29 Сейчас в теме
Спасибо, для 8.2 отлично пригодилось ))
15. buddha667 31.05.16 15:10 Сейчас в теме
16. Voblhned 58 16.12.16 21:43 Сейчас в теме
Долго искал и долго мучал, а подскажи как генерировать код типа "2880000004097", есть ли у тебя генератор на основе guid например ?
17. saiten 249 20.01.17 15:28 Сейчас в теме
В типовых, умеющих работать со штрихкодированием функции генерации штрихкодов есть встроенные. По сути, штрихкод EAN-13 это двенадцать любых цифр и в конце контрольный символ, который можно рассчитать, например в УТ10.3 методом КонтрольныйСимволEAN из общего модуля РаботаСТорговымОборудованием. Или посмотреть алгоритм в википедии и реализовать самому, благо он простой как топор.
18. wetsock 15.05.19 15:16 Сейчас в теме
Написал небольшой отчет, который выводит выбранную номенклатуру с всеми штрихкодами и их версий в EanGnivc (УТ 11.1).
Вдруг кому-то пригодится
Прикрепленные файлы:
Штрихкод с EANGNIVK 1.0.1.erf
19. natlens 5 26.01.21 10:30 Сейчас в теме
спасибо большое, пригодилась)
20. apostolis 3 25.03.21 14:12 Сейчас в теме
А для EAN13+5 ничего нету? Как +5 обрабатывать?
21. an2007 15.01.25 16:09 Сейчас в теме
Может для версии 1c v7.7 есть похожее?
22. saiten 249 16.01.25 08:02 Сейчас в теме
23. Shaman100M 1154 18.08.25 21:04 Сейчас в теме
мудренО, - видимо часть какого-то общего алгоритма...
для 7.7:

Функция СформироватьСтрокуEanGnivc(Знач ШтрихкодСтрокойСимволов,СтрокаEanGnivc	= "",ТекстОшибки	= "") Экспорт
	
	ДлинаШК	= СтрДлина(ШтрихкодСтрокойСимволов);
	
	Если 		ПустоеЗначение(ШтрихкодСтрокойСимволов)	= 1 Тогда
		ТекстОшибки	= "СформироватьСтрокуEanGnivc: Передан пустой штрихкод"; 
		Возврат 0;                                        
		
	ИначеЕсли 	(ДлинаШК	<> 13) И (ДлинаШК	<> 8) Тогда	
		ТекстОшибки	= "СформироватьСтрокуEanGnivc: Поддерживаются только штрихкоды EAN8 и EAN13"; 
		Возврат 0;                                                                       
		
	ИначеЕсли 	ШтрихкодСтрокойСимволов	<> Прав("0000000000000"	+ Число(ШтрихкодСтрокойСимволов),ДлинаШК) Тогда	// не число
		ТекстОшибки	= "СформироватьСтрокуEanGnivc: Поддерживаются только штрихкоды EAN8 и EAN13"; 
		Возврат 0;                                                                       
		
	КонецЕсли;

    СимволыШрифтаПоТипамКодов = СоздатьОбъект("СписокЗначений");
    СимволыШрифтаПоТипамКодов.Установить("L", "0123456789");
    СимволыШрифтаПоТипамКодов.Установить("G", "ABCDEFGHIJ");
    СимволыШрифтаПоТипамКодов.Установить("R", "abcdefghij");

    СпособыКодированияЛевойЧасти	= 	"LLLLLL"
    									"LLGLGG"
									    "LLGGLG"
									    "LLGGGL"
									    "LGLLGG"
									    "LGGLLG"
									    "LGGGLL"
									    "LGLGLG"
									    "LGLGGL"
									    "LGGLGL";
    Если ДлинаШК	= 8 Тогда
		ШтрихкодСтрокойСимволов 	= "0"+ШтрихкодСтрокойСимволов;
	    СимволыКодирования			= "";
	Иначе	
	    СимволыКодирования			= "#$%&'()*+,";
	КонецЕсли;
	
	КоличествоСимволовВГруппе 	= Цел(ДлинаШК/2);	//4 или 6
	ИндексСпособаКодирования 	= Число(Лев(ШтрихкодСтрокойСимволов,1))	+ 1;	// 1 или 1-10
	ПервыйСимволКодирования		= Сред(СимволыКодирования,ИндексСпособаКодирования,1);	// "" или один из #$%&'()*+,
	
    СпособКодированияЛевойЧасти = СтрПолучитьСтроку(СпособыКодированияЛевойЧасти,ИндексСпособаКодирования);
    СпособКодированияПравойЧасти= "RRRRRR";
	
	
    ЛеваяЧастьКода 		= "";
    ПраваяЧастьКода 	= "";

    Для ИндексСимвола = 1 По КоличествоСимволовВГруппе Цикл
		
		СтрокаЛ	= СимволыШрифтаПоТипамКодов.Получить(Сред(СпособКодированияЛевойЧасти,ИндексСимвола,1));	// "0123456789" или "ABCDEFGHIJ"
		НомерСЛ	= Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1;
		
        ЛеваяЧастьКода = ЛеваяЧастьКода		+ Сред(СтрокаЛ,НомерСЛ,1);
		
		СтрокаП	= СимволыШрифтаПоТипамКодов.Получить(Сред(СпособКодированияПравойЧасти,ИндексСимвола,1));	// всегда "abcdefghij"
		НомерСП	= Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+КоличествоСимволовВГруппе+1),1))+1;
		
        ПраваяЧастьКода = ПраваяЧастьКода	+ Сред(СтрокаП,НомерСП,1);
    КонецЦикла;

    СтрокаEanGnivc = ПервыйСимволКодирования+"!"+ЛеваяЧастьКода+"-"+ПраваяЧастьКода+"!";
    Возврат 1;
КонецФункции
Показать
Для отправки сообщения требуется регистрация/авторизация