Рабочее место кассира УТ 10.3 для нескольких организаций + эквайринг сбербанка




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

14 Comments

  1. nort

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

    будет пробит, пока все операции по терминалу не будут выполнены?

    Reply
  2. sanymust

    (1)Здравствуйте, да, Вы правильно поняли. В таблице имеется колонка с признаком выполнения оплаты (на скриншоте видно), она не доступна для редактирования пользователю без назначенного права. Колонка заполняется автоматически после получения ответа от терминала, что транзакция прошла.

    При этом, если пользователь нажмет отмену в форме оплат, то программа потребуется вернуть платежи по карте и не закроет форму.

    Можно для тестового периода назначить право менять признак выполнения оплаты пользователю вручную.

    Reply
  3. Андрей-ка1

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

    Не понял каким образом внести ваши изменения в стандартную конфигурацию? После обновления конфигурации не появился нужный функционал.

    Reply
  4. Irina_serdyuk

    Добрый день!

    Спасибо за Вашу обработку. Планируем использовать в продуктовом магазине, в РМК подключено две кассы, одна на ИП-продукты, вторая на ООО-алкоголь. Пока запустили в тестовом режиме, товары при закрытии чека разделяются по двум кассам, смены закрываются сразу по двум кассам или по желанию по выбранной кассе. Все работает как описано. Наконец-то сможем запустить магазин!!

    Reply
  5. sanymust

    (4) Спасибо за Ваш отзыв! Если возникнут вопросы или потребуется помощь — обращайтесь,не стесняйтесь, всегда будут рад помочь.

    P.S. общая информация: недавно внедрял это решение в новую розничную точку с ККТ Атол и заметил одну неприятную вещь, он умеет печатать слип-чек общим текстом, а только построчно, поэтому немного доработал обработку сбербанка. Так же Атолу не нравится xml-символы в ответе слип-чека от сбербанка, тоже было доработано. Модифицированную обработку позже добавлю в архив, а всем тем, кто скачал данное решение, предоставлю по просьбе без проблем.

    Reply
  6. sanymust

    Пользователи, кто скачал версию 10.3.50.1 могут обратиться за за версией 10.3.50.2 бесплатно, так как 1С допустили ошибку в РМК для маркируемой продукции и исправили это в последнем подрелизе. Напишите мне личное сообщение, если потребуется новый файл.

    Reply
  7. user1155482

    (5)

    Добрый день, а можно нам подправленную обработку для ККТ Атол?

    Reply
  8. mrkop

    Доброго времени суток, Подскажите пожалуйста.

    Для конфигурации Управление торговлей 10.3.43.1, подойдет ли Рабочее место кассира УТ 10.3.44.1 для нескольких организаций + эквайринг сбербанка: .zip 10.3.44.1 36,44Mb ?

    Конфа куда нужно встроить немного переписанная.

    Reply
  9. sanymust

    (8) Здравствуйте, архив содержит поставку, которая подойдет для обновления любой нижестоящей версии, но при этом ваши доработки затрутся, поэтому необходимо чтобы операцию установки доработок производил специалист, который объединит Ваши изменения с моими.

    Reply
  10. mrkop

    Получится ли запустить вот с этой обработкой обслуживания

    https://infostart.ru/public/1060424/

    Reply
  11. sanymust

    (10) Если Вы хотите добиться от нее работы на две организации, то нет, так как по умолчанию в УТ 10.3 и обработках обслуживания такого функционала нет, мой функционал разработан индивидуально и для работы ingenico нужно так же подстраивать работу обработки (другими словами перепрограммировать) под данный функционал, и то, если у драйвера ingenico есть такая возможность, на моей практике общение со специалистом, кто обслуживал эти терминалы не смог дать мне внятного ответа на поддержку такой работы терминала, возможно такой был специалист.

    Reply
  12. mrkop

    Техподдержка ПромСвязь предлагает 1 терминал на 2 организации(МультиТерминал) Типа при печати будет выбор с какой организации проводить или же 2 терминал на 2 организации. Напишите в ЛС не получается вам написать туда

    Reply
  13. Torin

    (2)Доброго времени суток!

    У меня пару вопросов:

    1.Почему вы не сделали самостоятельную поставку ( под своим идентификатором? )

    2.Почему именно было необходимо исправлять Типовые формы ( Форма ) , а не создать свои ( со своим префиксом BD_Форма )

    3.https://its.1c.ru/db/metod8dev#content:2298:hdoc почему не выбрана именно такой формат?

    4.Как вы дальше планируете поддерживать Типовую поставку в вашей интерпретации ? на текущий момент уже 10.3.55.1

    + это же не поставка УТ 10 и вы не Фирма 1С 🙁 но в сведениях о поставке об этом …. ничего не сказано

    и не странно ли что 10.3.44.1 является обновлением для 10.3.45.1

    Reply
  14. sanymust

    (13)Здравствуйте!

    1) Начнем с того, что я не позиционирую это как отдельный продукт, который я собираюсь распространять в виде «своей конфигурации», воспринимайте это как мою интерпритацию доработки типовых механизмов под нужды работы нескольких ФУ на рабочем месте. Доработка открыта и каждый может делать с ней что захочет, как реализовать интеграцию это уже дело вкуса, своей поставкой или дополнением типовой.

    Второе, форму я использую типовую так как мне удобнее делать обновление и делать настройки объединения модулей в процессе установки новой поставки. Опять же обновления делают все по-своему, я предпочитаю не открывать сотни окон со сравнением/объединением, я делаю все в одном окне и на ходу, поэтому сравнивать формы поставщика, а потом переносить это все в новую форму мне не удобно. Опять — вопрос предпочтений.

    По поводу поддержки, поскольку код открыт, любой человек, имеющий навыки специалиста 1С может самостоятельно обновлять конфигурацию на более свежие версии, либо заказывать эту услугу у тех кто умеет. Я периодически выкладываю новые версии, но это все по возможности, чаще всего по чьей либо просьбе, так как я не продаю это как коммерческий продукт с обязательной поддержкой, я предлагаю ознакомится с моим решением и дальше либо использовать «как есть» либо модифицировать под свои потребности. Плюс я считаю, что редакция уже изжила себя, в рознице 2.2 уже реализовано распределение продаж товара в типовом механизме и нет смысла по сей день использовать УТ 10.3 для розничной торговли, это больше для тех, кто вынужден подстраиваться, имея УТ 10.3.

    По обновлению не путайте, если вы выбираете поставку в качестве файла обновления, то она готова загрузиться на любую версию, так как содержит в себе полную конфигурацию. Файл обновления в архиве подходит уже только на 10.3.44.1

    Я рад что Вы проявляете такой интерес к данной доработке, но не оценивайте ее как какое-то отдельной готовое решение, в ней очень много чего можно оптимизировать/переделать/упростить так делалась изначально очень давно, именно поэтому она распространяется за стартмани, но и потрачено очень много времени, в том числе на «обкатку» в сети супермаркетов в свое время, поэтому это не 1, а 10 стартмани.

    Спасибо за понимание.

    Reply

Leave a Comment

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