Введение
В нашей работе периодически возникала проблема: сеансы пользователей намертво зависали при работе с 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С.
Я не реализовывал другие типы кодов, но никто не мешает дописать новые при необходимости.
Установка/удаление
Два варианта:
- Запустил и работает, не запустил - не работает.
- Установка как служба 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)
}
Там же можете поменять и порт.
Заключение
Надеюсь, мой велосипед кому-то окажется полезным. Спасибо, что дочитали.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.183.24
Вступайте в нашу телеграмм-группу Инфостарт