Внешняя компонента Native для создания штрих кода (GS1 DataBar Expanded, GS1 DataBar Expanded Stacked и другие)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

72 Comments

  1. gfoods

    Добрый день. А как эту библиотеку устанавливать/регистрировать?

    Reply
  2. artmaks1988

    (1) Добрый день. Устанавливать не нужно, при начале работы с ВК используйте метод

    ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>) 

    и далее по примеру

    Приложение = Новый(«AddIn.Window.AddIn1CBarcodeGenerator»);
    Приложение.ТипШК(31);
    Приложение.ОтображатьТекст(1);
    
    СтрокаBase64 = Приложение.ПолучитьШК(«[01]04600000000001[11]180406[17]181005[3103]010000[10]1976839[21]12191715»);
    
    КартинкаШК = Новый Картинка(Base64Значение(СтрокаBase64)); 
    Reply
  3. bigxot

    (1)Это NativeAPI компонента, можно добавить в макет, как это сделано в примере обработки.

    Для тестирования можно взять из архива DLL и в функции ПодключитьВнешнююКомпоненту просто использовать путь к DLL

    Reply
  4. gfoods

    Скачал пример обработки, запустил. Она написала компонента зарегистрирована. Пытаюсь сгенерить EAN-13, выходит ошибка (в приложении)

    Reply
  5. artmaks1988

    Повторно откройте обработку.

    Reply
  6. artmaks1988

    (4)Для Типа ШК EAN 13 контрольный символ определится автоматически, поэтому его вносить не нужно

    Reply
  7. artmaks1988

    (4)Повторно откройте обработку.

    Reply
  8. user687869_ip.kolotei

    А как в «GS1 DataBar Expanded Stacked» задать количество строк? Автоматом формируется 5, а требуется 2.

    Reply
  9. shurikvz

    Скажите

    1) Какая версия zint используется?

    2) есть ли возможность задавать угол поворота

    3) присоединяюсь к (8). Только в zint задается не количество строк, а количество колонок, на основании которого оно само разбивает по строкам. В общем — есть ли возможность задать остальные параметры доступные zint?

    Reply
  10. bigxot

    Добрый день, постараемся добавить нужные функции сегодня-завтра. Нам они не пригодились.

    Reply
  11. bigxot

    (9) Версия 2.4.2. Запрошенные функции добавил, Артем протестировал. Исправил пару мелких недочетов.

    Reply
  12. user687869_ip.kolotei

    Спасибо большое!

    Reply
  13. shurikvz

    (11) 2.4.2 немного старовата конечно, они там мучались с matrix code. Спасибо, потестирую.

    Reply
  14. shurikvz

    (11) чет не то. У меня не читается сканером Expanded Stacked сформированный вашей ВК. Со стандартного zint — все нормально, с ВК — не хочет.

    Параметры:

    ВнешняяКомпонента.ТипШК(81);

    ВнешняяКомпонента.Повернуть(0);

    ВнешняяКомпонента.ШиринаШК(3);

    СтрокаBase64 = ВнешняяКомпонента.ПолучитьШК(«[02]04604395000025[3103]001800[37]10[11]180511[17]180710[10]110518[21]1»);

    Reply
  15. artmaks1988

    (14) Проверьте штрихкод во вложении. Если все хорошо, то обновим публикацию и отправлю новую ВК.

    Reply
  16. bigxot

    (13)Как оказалось не только с Matrix code в версии 2.4.2 был косяк и с Expanded Stacked, обновил версию либы до 2.6.3. Артем ниже образец ШК прислал, должно быть все гут

    Reply
  17. shurikvz

    (15) Да, штрихкод из вложения читается.

    Reply
  18. shurikvz

    Скажите, такой вопрос: вы формируете картинку в формате bmp. Это технически сложно доработать, чтобы формировать ее в png? В идеале — настраиваемо конечно чтобы было. zint то так может (ключ —filetype).

    Обоснование: попробуйте сформировать табличный документ например с 250 штрихкодами. Формат bmp долго обрабатывается (имею ввиду преобразование данных из строки base64 + вывод итогового табличного документа).

    Reply
  19. artmaks1988

    (18) Такой настройки нет и не будет

    Reply
  20. bigxot

    (18)zint данные в разном формате может писать только в файл. В буфере он хранит только bitmap

    Reply
  21. mih_mah

    Обработка супер, библиотеку регить отдельно не нужно, все отлично. Только подскажите пож, как задать высоту самого ШК, а не высоту рисунка? а то получается, что рисунок большой, а сам ШК по высоте низкий и получается мелким в центре этикетки 58х60.

    Reply
  22. artmaks1988

    (21) в самой компоненте нет параметра высоты, но можно установить у рисунка свойство растянуть

    Reply
  23. Пчелкин

    Компонента, безусловно, полезная. Большое спасибо.

    А есть ли возможность избавиться от скабрезностей в сообщениях?

    Reply
  24. user977385

    Здравствуйте. При запуске пишет «Установка внешней компоненты не выполнена! В процессе установке произошла ошибка! Возможно, отсутсвует компонента для используемого клиентского приложения», подскажите в чем ошибка платформа 8.3.10

    Reply
  25. user977385

    Система 64 битная, эта библиотека работает только в x86?

    Reply
  26. Misha_J

    Компонента не выводит текст при выборе ТипаШК: 81 GS1 DataBar Expanded Stacked. Это фича, или баг?

    Reply
  27. shurikvz

    (26) фича

    Reply
  28. artmaks1988

    (25) работает 64 битной системе, но не 64 битной платформе 1с

    Reply
  29. Misha_J

    (27) А можно как-то поправить, очень ннадо!

    Reply
  30. artmaks1988

    (29) библиотека zint в этом типе шк не выводит текст

    Reply
  31. user697117_colci

    Здравствуйте. Она позволяет в штрихкод добавить fnc1 для GS1-128 (UCC.EAN-128), чтобы потом его можно было парсить?

    Reply
  32. GlobalSugar

    Можно что-нибудь сделать с этим моментом «Сообщения об ошибках выводятся НЕ цензурно»?

    Reply
  33. artmaks1988

    (31)компонента сама вставляет символ FNC1 после нужных идентификаторов

    Reply
  34. artmaks1988

    (32) передам коллеге, исправит при возможности

    Reply
  35. user697117_colci

    (33)

    При сканировании с ТСД-штрихкод распознаётся. Но, когда программно перебираю коды символов, код 29 не обнаруживается. По идее, он должен быть между тегами партии и серии. Согласно описанию gs1-128 он должен находится между тегами переменой длины. Но его там нет.

    Reply
  36. artmaks1988

    (35) пример кодируемого шк пришлите

    Reply
  37. user697117_colci

    (36) [01]46020140044540[11]180601[17]180716[21]123545678974460[10]2454

    Reply
  38. *Stellar

    Если есть возможность, добавьте, пожалуйста, уровень коррекции ошибок для Micro QR/QR-кодов (Error Correction), и возможность изменить размер в пикселях («Adjust Size To»)

    Заранее благодарен!

    И +1 к (32)

    Reply
  39. *Stellar

    ..А если ещё сделаете возможной передачу в QR код числа, то будет совсем замечательно!

    На текущий момент компонента абсолютно все символы выводит в одинаковой кодировке в Micro QR/QR?

    В Zint, насколько мне известно, в одинаковых размеров код может влезть разное количество латинских символов и разрядов десятичных чисел. Очевидно, это и разные объёмы информации, и было бы неплохо, если бы компонента была достаточно гибка, чтобы определять тип входящих данных, и, соответственно, определять оптимальный способ их записи в код. Так ли это?

    При QR-кодировании этот момент имеет достаточно весомое значение.

    Reply
  40. oit39

    Метод «ПолучитьШК» почему-то выдает пустую строку(см.скрин)

    ТипШК — 16 или 31

    Что не так делаю?

    Reply
  41. artmaks1988

    (40)между 17 и 10 блоком должно быть 6 символов [17]180906 или вообще не должно быть

    Reply
  42. Xershi

    Добрый вечер, пытаюсь научиться писать ВК в теме https://forum.infostart.ru/forum15/topic202825/.

    Я так понимаю у вас реализация для винды. Для андроида будет работать или как можно скомпилировать для него?

    Reply
  43. artmaks1988

    (42) На андройде не сработает

    Reply
  44. Xershi

    (43) опыта такой компоненты у вас есть?

    Reply
  45. user852920

    Доброго времени суток.

    Не могли бы вы уточнить пример задания параметров для формирования Aztec ШК.

    На данный момент при попытке сформировать такой ШК программа завершается в аварийном режиме (скорее всего, задаю некорректные параметры для 92-ого типа).

    Заранее спасибо!

    Reply
  46. artmaks1988

    (45) Пришлите что кодируете

    Reply
  47. user852920

    (46) Например, попробуйте простой текст из серии «Hello world».

    Но основная задача — «вшивать» в такой ШК закодированные строки формата base64.

    Reply
  48. pss1985

    а в чем отличие от типовой в УТ?

    Reply
  49. artmaks1988

    (48) отличия в типах шк. Компонента писалась когда в типовой не было возможности формировать DataBarExpanded

    Reply
  50. shurikvz

    (49) простите, немного отстал от современных конфигураций: а компонентой из типовой сейчас есть возможность формировать шк типа DataBarExpanded? Как?

    Reply
  51. artmaks1988

    (50)да. В конфигурациях ут11,бп3.0 и т.п.

    Reply
  52. artmaks1988

    (50)при помощи вк поставляемой в составе конфигурации. Можете поиском в конфигурации найти «databarexpandedstaked”. Если не ошибаюсь то типшк для компоненты равен 17

    Reply
  53. VitushVV

    Нужно сгенерировать EAN 13 + 5 Пример прикреплен.

    Какой номер передавать?

    Reply
  54. mih_mah

    Скажите, пожалуйста, как в коде 89 ITF-14 изменить толщину рамки вокруг ШК? сейчас она судя по всему максимальная 9 пунктов, очень толстая

    Reply
  55. akor77

    Обращаюсь к автору статьи, можно убрать из сообщений нецензурную лексику?

    Reply
  56. shurikvz

    (55) какой тип шк нужен? Тип DatabarExpandedStacked уже умеет стандартная ВК из типовых конфигураций. Там нецензурщины нет 🙂

    Reply
  57. akor77

    (56) «X5 Retail Group» (Торговая сеть Перекрёсток) требует на транспортные упаковки с товаром наносить штрих коды формата GS1-128 или GS1 DataBar Expanded Stacked. Это для снятия проблем идентификации товара в «Меркурии».

    131 Composite Symbol with GS1-128 linear component

    139 Composite Symbol with GS1 DataBar Expanded Stacked component

    Reply
  58. akor77

    (56)Ни как не удаётся вытянуть DatabarExpandedStacked из типовой

    Reply
  59. shurikvz

    (58)

    возможно нужна более свежая версия типовой.

    Для GS1-128 ТипКода = 2, для DatabarExpandedStacked ТипКода = 17.

    ЗначениеШтрихкодаДляКомпоненты = «(01)01234567891231(11)190627(17)190811(10)270619(37)4»;
    
    Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет(«Эталон»);
    КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
    
    ПараметрыШтрихкода = Новый Структура;
    ПараметрыШтрихкода.Вставить(«Ширина»,          Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе));
    ПараметрыШтрихкода.Вставить(«Высота»,          Окр(Рисунок.Высота / КоличествоМиллиметровВПикселе));
    ПараметрыШтрихкода.Вставить(«Штрихкод»,        СокрЛП(ЗначениеШтрихкодаДляКомпоненты));
    ПараметрыШтрихкода.Вставить(«ТипКода»,         СтруктураШаблона.ТипКода);
    ПараметрыШтрихкода.Вставить(«ОтображатьТекст», СтруктураШаблона.ОтображатьТекст);
    ПараметрыШтрихкода.Вставить(«РазмерШрифта»,    СтруктураШаблона.РазмерШрифта);
    
    Если СтруктураШаблона.Свойство(«GS1DatabarКоличествоСтрок») Тогда
    ПараметрыШтрихкода.Вставить(«GS1DatabarКоличествоСтрок», СтруктураШаблона.GS1DatabarКоличествоСтрок);
    КонецЕсли;
    Если СтруктураШаблона.Свойство(«ТипШрифта») Тогда
    ПараметрыШтрихкода.Вставить(«ТипШрифта», СтруктураШаблона.МонохромныйШрифт);
    КонецЕсли;
    Если СтруктураШаблона.Свойство(«УголПоворота») Тогда
    ПараметрыШтрихкода.Вставить(«УголПоворота», СтруктураШаблона.УголПоворота);
    КонецЕсли;
    Если СтруктураШаблона.Свойство(«Масштабировать») Тогда
    ПараметрыШтрихкода.Вставить(«Масштабировать», СтруктураШаблона.Масштабировать);
    КонецЕсли;
    Если СтруктураШаблона.Свойство(«СохранятьПропорции») Тогда
    ПараметрыШтрихкода.Вставить(«СохранятьПропорции», СтруктураШаблона.СохранятьПропорции);
    КонецЕсли;
    
    Рисунок.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
    

    Показать

    Reply
  60. akor77

    (59)Благодарю, завтра попробую найти новую ВК.

    Reply
  61. akor77

    (59)

    Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет(«Эталон»);

    КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;

    ПараметрыШтрихкода = Новый Структура;

    ПараметрыШтрихкода.Вставить(«Ширина», Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе));


    Удалось с первой попытки! Спасибо!

    Reply
  62. artmaks1988

    (55) Исходники не могу найти.

    Reply
  63. akor77

    (62)Для моей задачи, выяснилось, что достаточно типового функционала.

    Reply
  64. ShapkaArt

    Здравствуйте.

    Подскажите пожалуйста, есть возможность сделать dll на 64-бит 1С? Спасибо.

    Reply
  65. artmaks1988

    (64)исходников нет. Изменении нет возможности

    Reply
  66. user696136_it

    Здравствуйте. компонента будет работать на 1с 7.7?

    Reply
  67. artmaks1988

    (66) нет

    Reply
  68. artmaks1988

    (66) https://ocvita.ru/ocvita-barcode — точно не помню, но вроде эта работает в 7.7

    Reply
  69. user696136_it

    (68) спасибо

    Reply
  70. anri123

    При нажатии «Выввести» в обработке возникает ошибка. Хотя компонента зарагистрировалась до этого и обработку перезапускал.

    Пользоваться нет возможности.

    Reply
  71. artmaks1988

    (70) запустите в толстом клиенте.

    Reply
  72. anri123

    (71) открылась и заработала только в режиме «Толстый клиент (управляемое приложение)», просто в «Толстом клиенте» не открывается.

    Спасибо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *