Каталог решений - Внешний сервис генерации штрихкодов для 1С

Внешний сервис генерации штрихкодов для 1С

Внешний сервис генерации штрихкодов для 1С

В наличии

В работе с 1С иногда зависают сеансы при генерации штрихкодов? Сделал небольшой внешний сервис для генерации QR, DataMatrix и EAN-кодов, который легко использовать и интегрировать, и который работает быстрее стандартной компоненты.

Категория:

Описание

Введение

В нашей работе периодически возникала проблема: сеансы пользователей намертво зависали при работе с 1С. После анализа выяснилось, что зависание происходило при генерации штрихкодов через КомпонентуПечатиШтрихкодов.

Проблема оказалась известной — другие пользователи также сталкивались с зависаниями. Чтобы разобраться, я сделал обработку стресс-тестирования компоненты. При определённых условиях действительно сеансы зависали, а новые штрихкоды переставали генерироваться.

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

Первый опыт: сервис за Nginx

Первый вариант был реализован как HTTP-сервис за веб-сервером Nginx. Стабильно, круто, современно, сеансы перестали зависать.

Можно было обращаться к сервису через обычный HTTP-запрос с GET или POST.

Однако со временем стало очевидно, что лишний веб-сервер усложняет архитектуру. Было решено перейти к более простому варианту.

Самостоятельная служба Windows, без Nginx или Apache.

Это позволило избавиться от лишней прокладки и потенциальных проблем с конфигурацией веб-сервера. В качестве языка программирования был выбран Go.

Функциональность сервиса

Сервис поддерживает генерацию следующих форматов:

  • QR-код
  • DataMatrix
  • EAN-13
  • EAN-128 / Code128

Параметры генерации:

  • text — содержимое кода (обязательный)
  • level — уровень коррекции ошибок QR (1–4, по умолчанию 2)
  • width — ширина изображения в пикселях (по умолчанию 256)
  • height — высота изображения (по умолчанию 128, используется только для линейных штрих-кодов)

Сервис можно вызывать через GET или POST запросы, а также интегрировать с 1С.

Я не реализовывал другие типы кодов, но никто не мешает дописать новые при необходимости.

Установка/удаление

Два варианта:

  1. Запустил и работает, не запустил — не работает. 
  2. Установка как служба windows:
./GoBarcodeService install   # установить сервис
./GoBarcodeService start     # запустить
./GoBarcodeService stop      # остановить
./GoBarcodeService uninstall # удалить

За всё время работы службы падений не наблюдалось, но на всякий случай стоит настроить её автоматический перезапуск при сбое.

После запуска поднимается web сервис на порту 8080 и можно начинать работу.

Производительность

Без лишних слов:

Внешний сервис: 30–40 мс на один штрихкод

Компонента 1С: 140–170 мс на один штрихкод

Таким образом, внешний сервис не только устраняет проблему зависаний, но и значительно ускоряет процесс.

 

Примеры использования

GET-запрос из браузера

  • http://localhost:8080/qr?text=Hello
  • http://localhost:8080/datamatrix?text=Hello
  • http://localhost:8080/ean13?text=123456789012
  • http://localhost:8080/ean128?text=Hello

В 1С

Процедура СоздатьШтрихкод()
	Парам = новый Структура();
	Парам.Вставить("text", "Hello world");
	Парам.Вставить("width", 200);
	Ответ = ВыполнитьЗапрос("127.0.0.1", "qr", Парам); 
	Если (Ответ.КодСостояния = 200) Тогда
		Картинка = новый Картинка(Ответ.ДД);
		ШК = ПоместитьВоВременноеХранилище(Картинка, ЭтаФорма.УникальныйИдентификатор);
	Иначе
		ТекстОтвета = Ответ.ТекстОтвета;
	КонецЕсли;
КонецПроцедуры

Функция ВыполнитьЗапрос(Адрес, ТекстДляЗапроса, Параметры)
	
    Тело = "";
    Для Каждого парам Из Параметры Цикл
        Если Тело <> "" Тогда
            Тело = Тело + "&";
        КонецЕсли;
        Тело = Тело + парам.Ключ + "=" + КодироватьСтроку(парам.Значение, СпособКодированияСтроки.КодировкаURL);
    КонецЦикла;
	
    Соединение = Новый HTTPСоединение(Адрес, 8080);
    Запрос = Новый HTTPЗапрос(ТекстДляЗапроса+"?"+Тело);		
    Ответ = Соединение.Получить(Запрос);    	
	
    ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();	
    Рез = новый Структура("ДД, ТекстОтвета, Заголовки, КодСостояния", ДД, "", Ответ.Заголовки, Ответ.КодСостояния);
    Если (Ответ.КодСостояния <> 200) Тогда
        Рез.ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(); 
    КонецЕсли;
		
    Возврат Рез;
	
КонецФункции

Что можно улучшить?

 

Если не хотите, чтобы сервис был доступен из сети в коде: 

if err := http.ListenAndServe("0.0.0.0:8080", nil); err != nil {
	log.Fatal(err)
}

меняем на:

if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
	log.Fatal(err)
}

Там же можете поменять и порт.

 

Заключение

 

Надеюсь, мой велосипед кому-то окажется полезным. Спасибо, что дочитали. 

has been added to your cart:
Оформление заказа