ККМ-оффлайн загрузка товаров в кассу для Штрих-М




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

16 Comments

  1. LeXXeR

    А в чем разница по сравнению со штатной загрузкой?

    Reply
  2. mrtxee

    1. штатная обработка создает лишние поля. сейчас не вспомню какие

    2. штатная обработка не работает, если в номенклатуре не используются plu-коды

    3. при тестировании частно в нашей компании штатная обработка работала некорректно

    Reply
  3. alexburn

    Согласен, штатные обработки не работают, тоже переписывал под себя.

    Reply
  4. LeXXeR

    (2) Не убедили 🙂

    1. Лишние поля в текстовом файле — стандарт Штриха на его формат. У вас они наверняка тоже создаются (обработку еще не смотрел). Без этого файл не загрузится в РМК.

    2. Дык вроде эти же коды автоматом создаются штатной обработкой, нет?

    3. Юзаем штатную уже года полтора — всё ОК.

    Чего реально не хватает Вашей обработке — грузить в РМК штриховскую специфику. Например, формат файла позволяет грузить во фронт скидки, диск.карты, клиентов, доп.цены и пр. Это грузится в РМК только при работе со Штриховскими бэк-офисами, из УТ — нет. Получается, по доп.функционалу ничего нового в Вашей обработке нет.

    Reply
  5. mrtxee

    to LeXXeR

    Зато работает недажно.

    Обработка написана впервую очередь под нуждый нашей фирмы. И прекрасно справляется c нашими потребностями, В ОТЛИЧИИ ОТ ШТАТНОЙ ОБРАБОТКИ ШТРИХ-М, которая на тестировании в нашей фирме проявила себя только плохо.

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

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

    А лично вам, не нравится, не ешьте!

    Reply
  6. Farpost

    Вообще ШТРИХ-овские «поделки» довольно убоги, я предпочитаю работать с Атолом, но пришлось как то приспосабливать POS-терминал с вшитым Штриховским кассиром к УТ — ни хрена штатные обработки не пашут — может конечно прошивка такая гнилая, но факт есть факт…

    А уж систему идентификации номенклатуры у Штриха точно ПТУ-шник разрабатывал

    Reply
  7. Umar

    to Farpost

    Интересно а чем ето атоловские поделки лучше штриховских? Обе ети конторы были рождены в одной комнате 🙂 Юзайте кристалсет — и все будет пучком.

    Reply
  8. sky_

    Подскажите как быть с секциями. К складам привязана секция 1 и 2, а выгружается секция 0

    Reply
  9. extreme861

    Поле объекта не обнаружено (ПЛУ)…?выдает при выгрузке

    Reply
  10. tsar

    Тип цен ,склад, ККМ выбрал. Список выгрузки заполнен. Но при нажатии кнопки Заполнить ничего не происходит. Вкрсия УТ 10.3.13. Какие будут комментарии:)?

    Reply
  11. bes-kkm

    Есть регистр список товаров на ККМ. Сначала нужно зайти Рдактировать список выгрузки, далее Заполнить _ Выбрать кассу, заполнить по штрих-кодам, по кодам весового товара, заполнить по справочнику и т.д. — Заполнить — … и все должно получится.

    Reply
  12. bes-kkm

    По поводу штриховских обработок, нормально работают, если все правильно подключить.

    Reply
  13. bes-kkm

    А вообще мы дорабатывали штатную штриховскую обработку Выгрузка ККМ offline, чтобы выгружались и скидки, и запрет продажи алкоголя после 21-00 и до 09-00. Все работает.

    Reply
  14. awex

    (14) bes-kkm,

    Не поделитесь опытом как выгружали скидки?

    Reply
  15. lollipopik

    Друзья, у кого-нибудь есть обработка для загрузки/выгрузки информации о дисконтных картах для 1С 8.2 УТ ред.11, В минипос (РМК Кассир), пожалуйста, поделитесь или напишите мне.

    Очень срочно надо.

    Reply
  16. sancho86

    А разница какая? Штатная то же самое делает…

    Reply

Leave a Comment

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