Обработка "Загрузка данных в электронные весы Digi SM-100"




Принцип обмена данными из 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='\

23 Comments

  1. grivigen

    Проще и удобнее выгрузку в весы DIGI SM делать через внешнюю компоненту DigiSM.dll. Для 7.7 типа так :

    scales=CreateObject(«DigiSM.TDigiSM»);

    scales.IPAddress = IP;

    scales.Connect = 1;

    scales.InitPLU();

    scales.PLUName = NAME;

    scales.UnitPrice = PRICE;

    scales.EANData = «23»+Article+»000000″;

    scales.LabelFormat1 = 17;

    scales.BarcodeFormat = 5;

    scales.WritePLU(CODE);

    scales.Connect = 0;

    Reply
  2. donchess

    Спасибо. Согласен. Естественно пробовал через .dll. Вернулся к варианту с утилитой.

    Под Win7 почему-то подвисает (но утилита работает !?) + как всегда : запуск магазина в конце недели, оборудование разное — разобраться не успел. Подозреваю .dll — поставщик оборудования дал 4 шт., время создания у всех одинаково, но размер файла +- 200 Кб.

    Reply
  3. mnimoprog

    А в какой момент происходит выгрузка данных из 1с???

    Это работает на wind 7???

    Reply
  4. donchess

    (3) mnimoprog,

    1.На Win7 — работает.

    2.Запись во внешний файл

    Reply
  5. Victorpj

    Каким образом выполнить выгрузку номенклатуры из 1С82 с помощью обработки?

    Reply
  6. donchess

    (9) Victorpj, Регистрируем весы в торговом оборудовании и выбираем «Выгрузка данных в весы с печатью этикеток»

    Reply
  7. Shuffler

    Работает ли обработка на рознице 2.1

    Reply
  8. seva1405

    Пишет «Не указан файл выгрузки» все сделал по инструкции, в чем может быть проблема?

    Reply
  9. pioneex

    Приветствую. УТ 10.3 (10.3.32.1). Сначала обнаруживает ошибку (в приложенном скриншоте). При повторной выгрузке выходит следующее сообщение: «Невозможно осуществить выгрузку по следующим причинам: Не указан файл выгрузки».

    Reply
  10. seva1405

    (15) pioneex, я в этом месте Номенклатура.Наименование поправил на Номенклатура, а вот вторую ошибку так и не победил.

    Reply
  11. donchess

    (16) seva1405, см. скриншот — заполнить поле «каталог».

    (15) pioneex, я в этом месте Номенклатура.Наименование поправил на Номенклатура — да, в УТ 10.3 передается наименование (спасибо за ответ). Мне досталась пописаная УТ украины, в которую передавалась ссылка на номенклатуру.

    Reply
  12. chesnokov-a-v

    Прошу помощи.

    Почему-то при печати этикетки на весах Digi SM100 в штихкоде не печатается код товара (т.е. в штрихкоде идут сначала префиксы, потом нули, а должен быть PLU, ну а дальше печатается вес и контрольный символ). Уже и не знаю куда копать.

    Пользуюсь этой консольной программой.

    Еще видел библиотеку DigiSM.dll, но не могу найти описание к ней, может у кого есть.

    Reply
  13. grivigen

    Давно делал уже может всё и не вспомню, но так по памяти. В весах digi сделано всё весьма заморочно. Вам нужно в программе LabelMaster создать свою этикетку сохранить файлы f34.dat и какой то ещё *.dat. Потом выгрузить это в весы через QloadSM ??? или SIS2002 ??? или как у меня через

    twswtcp.exe . Обязательно в виндовом файле c:WindowsSystem32driversetchosts прописать (свои!!! IP) :

    192.168.2.191 S0191

    192.168.2.192 S0192

    192.168.2.193 S0193

    Пример для выгрузки весов S0191 в командной строке набрать twswtcp.exe F34.DAT 191

    Причем там есть две этикетки — этикетка чеков и этикетка весового товара — они разные !!!

    А еще есть настройки спеков в весах. Вот мои:

    |Инструкция по настройке Digi SM100 :
    |
    | ***************************************************************************
    | Вход в Z — режим -> нажать 4 раза кн. с двумя стрелками
    | Для SPEC : * — вперед,[Номер SPEC][X] — переход,
    |            в конце [PLU]  для записи или [->T<-] — отмена
    | ***************************************************************************
    |
    |
    | 1) Установить первые три байта IP в Z-режиме :
    |      [>0<] + [0][4][1][6]  ->
    |      ввод 3 байт IP xxx.xxx.xxx -> [PLU]
    |
    | 2) Установить SPEC в Z-режиме:
    |      [>0<] + [1][4][1]
    |
    |     SPEC1 = 0 (количество !!!) — печать к-ва для штучной
    |     SPEC17 = 1 (ДД-ММ-ГГ)
    |   SPEC18 — количество строк названия товара при печати чека
    |     (0 — 2 строки, 1 — 1 строка)
    |     SPEC37 —  2 (плотность печати)
    |   SPEC38 —  2 (яркость печати)
    |    SPEC131  = 1 (разрешить печать кол-ва)
    |     SPEC135  = IP (уст. последний байт IP)
    |   SPEC137  = выравнивание ингридиентов по центру = 1, не выравнивать = 0
    |     SPEC230  = 1 (автопечать этикетки после вызова PLU)
    |   NB: SPEC230  = 0 — если надо печатать и штучные !!!
    |     -> * -> [PLU]
    |
    | 3) Частичный сброс памяти весов в Z-режиме :
    |     [>0<] + [2][3][0] -> 3 раза [X] -> [*] -> [C]
    |
    |     м.б. после сброса — Уст режим печати этикеток:
    |               [>0<] + кн. с двумя стрелками
    |
    | 4) Выключить/включить весы, выгрузить название магазина,
    |     выгрузить формат этикетки, выгрузить товар.

    Показать

    Ну как то так

    Reply
  14. grivigen
    Reply
  15. grivigen

    И еще форматы этикеток и штрих кодов в весах идут по номерам

    может вам подойдет какая то стандартная этикетка.

    У меня:

    // формат этикетки 1 = 17 — весовая 18 = 2 — штучная — внутри F34.DAT !!!
    Если ТЗ.ШтучныйВВесы = 1 тогда
    scales.Weighed = 0;
    scales.BarcodeFormat = 5;
    scales.LabelFormat1 = 18; // 18 штучная
    scales.EANData = «23»+Прав(ТЗ.Артикул,5)+»000000″;
    Иначе
    scales.Weighed = 1;
    scales.BarcodeFormat = 5;
    scales.LabelFormat1 = 17;// весовая
    scales.EANData = «23»+Прав(ТЗ.Артикул,5)+»000000″;
    КонецЕсли;

    Показать

    Reply
  16. PRoman

    А как зарегистрировать dll?

    При регистрации через regsvr32 пишет «Модуль … загружено но не удалось выполнить вызов DLLRegisterServer….» Windows 7

    Reply
  17. user619890_igorlint

    А интересно на рознице 2.2 будет работать?

    Reply
  18. METAL

    У кого-нибудь работает на Win8? Win10?

    Reply
  19. st8899

    (24)

    работает?

    Reply
  20. SoftIce

    Имя ProgId ? (AddIn. ?)

    И что делать если часть товара весовые, а часть штучные?

    Я так понял у вас только весовой учитывается.

    Reply
  21. user619890_igorlint

    (30)Причем здесь весовой или не весовой. Все зависит от префикса который вы ставите в настройках. обычно это 2 весовой а 1 не весовой.

    Reply
  22. user619890_igorlint

    Да и dll у digi платная. а которая бесплатная она дает регестрировать только 10 товаров и все. )))

    Reply
  23. Cat-Ek

    Скачала. В весах выходят кракозябры вместо русских букв. Что делать? Где-то в весах кодировку задавать?

    Reply

Leave a Comment

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