Подключение ККТ (Торгового оборудования) в разрезе Пользователя или Клиента RDP




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

24 Comments

  1. smirnov.es



    Но все-таки, переходите уже на УФ

    Reply
  2. rpgshnik

    Будем, но видимо не так скоро))

    Reply
  3. user703659_elvan.1c

    Для АТОЛ-а 55Ф не получается фокус в «Комплексной автоматизации» 1.1.90.1, а для эмулятора ККТ и принтера чеков(ReceiptPrinter.epf) — все замечательно. Для АТОЛ-ов находит обработку у кого нибудь?

    Reply
  4. rpgshnik

    (3)хм… Доработки не было? По идее ресурс Компьютер используют все… Если конечно атоловская обработка не работает иначе. В моем случае эмулятор и штрих-мовские отработали на ура.

    Попробую посмотреть, интересно.

    Reply
  5. user703659_elvan.1c

    Доработки ТО не было. Я имя компьютера составляю добавляя имя пользователя в транслитерации. 3 года назад поставил успешно(для ТСД).

    Reply
  6. user703659_elvan.1c

    мИмяКомпьютера = ВРег(ИмяКомпьютера())+»#»+Элв_ДополнительныйМодуль.ПолучитьСтрокуНаЛатинском(ВРег(ИмяПользователя()));

    Reply
  7. MrFlanker

    Данный код для кнопочки откроет регистр сведений «ТорговоеОборудовние» с разрешением изменять вручную.

    
    Процедура кнРегТОНажатие(Элемент)
    // Вставить содержимое обработчика.
    Форма = РегистрыСведений.ТорговоеОборудование.ПолучитьФорму(«ФормаСписка»);
    Форма.ЭлементыФормы.РегистрСведенийСписок.ТолькоПросмотр = Ложь;
    Форма.ЭлементыФормы.РегистрСведенийСписок.ИзменяетДанные = Истина;
    Форма.Открыть();
    
    КонецПроцедуры
    
    
    

    Показать

    Reply
  8. rpgshnik

    (5) Какая-та допись у вас видимо, может из-за неё какой конфликт

    Reply
  9. rpgshnik

    (6) Специально скачал обработку АТОЛ ККТ

    Подключил три кассы АТОЛ (выделил зеленым)

    Всё работает нормально.

    Я думаю вам стоит посмотреть код своих доработок (которые вы отметили красным).

    Reply
  10. vano-ekt



    и подключить ККТ в разрезе пользователей

    Reply
  11. rpgshnik

    (10)

    Reply
  12. user703659_elvan.1c

    Спасибо (9). Проверю. Вероятно обработка Атоловская не находит ИмяПользователя() . Попробую

    через имя компьютера.

    Reply
  13. feva

    А есть видео где она ставит ККТ онлайн без ОФД и ИТС?

    Reply
  14. user621724_Dimav1979

    (13) А есть видео где она ставит ККТ онлайн без ОФД и ИТС?

    Reply
  15. rpgshnik

    (13) у этого парня есть видео https://infostart.ru/profile/439778/

    Reply
  16. @lexandr

    Помоему данная статья дублирует уже существующую Настройка торгового оборудования. Вней я привел несколько вариантов решения проблемы подключения торгового оборудования в терминальном режиме на неуправляемых формах.

    Reply
  17. rpgshnik

    (16) по моему моя статья, на что я и ссылаюсь, резюме статьи https://infostart.ru/public/197612/ (которая датирована 2013 г. и явно появилась раньше вашей). А ваша статья с заголовком «Настройка торгового оборудования в конфигурации «Управление торговлей» ред. 10.3 при работе в терминальном режиме» узко направленная, или правильно называйте статьи чтобы было легче их искать.

    Reply
  18. webester

    Краткое содержание для тех кому лень читать:

    В функции определения компьютера автор к имени клиентского компа, добавил еще имя пользователя. Собственно все. Непонятно почему так коротко получилось? Где история, как делали раньше, где истории как мучались клиенты? Больше воды, богу воды!

    Reply
  19. rpgshnik

    (18) да не говорите, можно было налить воды, как у нас один пользователь распечатал чек с одного региона на кассу другого региона 😀 геморроя было много.

    Reply
  20. user703659_elvan.1c

    (12) ШтрихМ-овская обработка ККТ последняя (1.7) с составным определением имени компьютера , используя ИмяПользователя(), работает. Проверил

    Reply
  21. Denger

    УТ 10.3, сделал немного по другому, ТОСервер-ПодключитьОборудование в запрос добавил строки

    Если СокрЛП(Вид)=»ККТ с передачей данных» тогда // ККТ с передачей данных

    Запрос.Текст=Запрос.Текст+»И РегТО.КассаККМ = &Касса»;

    Запрос.УстановитьПараметр(«Касса», УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной(«глТекущийПользователь»), «ОсновнаяКассаККМ»));

    КонецЕсли;

    Reply
  22. maksimkatula

    (19) Ага, такая же фигня была, печатают чек, не вылезает, в другой комнате ФР весело штампует чеки))) Спасибо за статью, в это плане и шёл, так как в БП 3.0 разрез пользователь идёт 🙂

    Reply
  23. rpgshnik

    (21) Вариант тоже)

    Reply
  24. Ankare

    Александра не перестает удивлять своими новыми профессиями. Главное перспективно

    Reply

Leave a Comment

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