ФФД 1.05 с драйверами Атол v10




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

20 Comments

  1. victuan

    (2243) Насколько полная поддержка и насколько быстро она будет успевать за изменениями в ДТО10? Есть полноценная поддержка данной обертки для типовых конфигураций 1С 7.7 или нужно писать самостоятельно обработки обслуживания? Не повредит ли лишняя «прослойка» работе с драйвером Атола из 1С 7.7 в плане появления недокументированных (неизвестных) ошибок или в результате зависимости от автора данной «обертки», в т.ч в виде прекращения развития данной обертки ее автором?

    Стандартный драйвер подружить с 1С 7.7 не удалось, поэтому пришлось писать COM обертку для драйвера.

    Почему не удалось это сделать автору данного решения? Стандартный драйвер ДТО10 работает в 1С 7.7 с полной поддержкой функциональности при использовании оригинальной обертки Атол (подтверждением тому является решение). В чем же тогда преимущества данной обертки перед использованием родной обертки от стандартного драйвера Атол в 1С 7.7, которая обновляется одновременно с выходом новой версии ДТО10?

    Reply
  2. phsin

    (1) Стандартный драйвер Атол v10 в 1Cv7 не работает, поэтому пришлось доработать запуск стандартного драйвера Атол v10

    Ваше решение работает только с 8й версией драйвера, 10 — заявлено, но не работает… (в комментариях к обработке много об этом пишут…)

    В Вашем решение принципиально неправильный алгоритм работы.

    Поэтому плюсы этого решения — Простое и понятное с минимальными доработками.

    Reply
  3. user758567

    Если касса подключена по ethernet. То я так понимаю данное решение не подходит?

    Reply
  4. victuan

    (2) Если у вас не хватило умений или таланта подключить ДТО10 в 1с 7.7 это вовсе не означает, что он не работает у других. В комментариях писали те, кто невнимательно изучил инструкцию по подключению, но и у них уже работает после исправления их ошибок.

    В нашем решении заявлено, что работает драйвер ДТО10 с 1С 7.7 и он на самом деле работает, полностью поддерживая все новые теги, чек коррекции и прочее.

    Reply
  5. victuan

    А ведь способов подключения ДТО10 к 1С 7.7 несколько:

    — вот тебе и через родную обретку addin_fptr10_x86.dll https://infostart.ru/public/991465/

    — вот тебе и через JSON-задания https://infostart.ru/public/858638/

    Или у других тоже не работает в 1С 7.7? Получается, они тоже обманывают окружающих?

    И нужно использовать только вашу обертку для 1С 7.7?

    😉

    Reply
  6. phsin

    (4) Виктор, считаю, что Вы абсолютно неправы, талант в следовании инструкции совсем не нужен.

    То что вы продаете разработку, которая по умолчанию нарушает закон — это на вашей совести

    Reply
  7. victuan

    (6) А в чем нарушение можете объяснить? Стало интересно.

    Reply
  8. phsin

    (3) должно работать, измените параметры http://integration.atol.ru/api/?pascal#driver_settings

    Ко второй относятся настройки связи с ККТ.

    LIBFPTR_SETTING_PORT — способ связи с ККТ. Остальные настройки связи зависят от значения этой настройки. Может принимать следующие значения:

    LIBFPTR_PORT_COM — работа с ККТ либо через физический COM-порт, либо через виртуальные COM-порт и TTY-файл. Доступно для Windows, Linux и Android. К данному каналу также относятся настройки LIBFPTR_SETTING_BAUDRATE, LIBFPTR_SETTING_BITS, LIBFPTR_SETTING_STOPBITS, LIBFPTR_SETTING_PARITY, LIBFPTR_SETTING_COM_FILE.

    LIBFPTR_PORT_USB — работа с ККТ по USB. Доступно для Windows, Linux и Android. К данному каналу также относится настройка LIBFPTR_SETTING_USB_DEVICE_PATH.

    LIBFPTR_PORT_TCPIP — работа с ККТ по TCP/IP (Ethernet, Wi-Fi). Доступно для Windows, Linux, Android и iOS. К данному каналу также относятся настройки LIBFPTR_SETTING_IPADDRESS и LIBFPTR_SETTING_IPPORT.

    LIBFPTR_PORT_BLUETOOTH — работа с ККТ по Bluetooth. Доступно для Windows, Linux и Android. К данному каналу также относится настройка LIBFPTR_SETTING_MACADDRESS.

    Reply
  9. phsin

    (5) Посмотрите внимательно http://forum.infostart.ru/forum28/topic209034/message2246463/#... — стандартный драйвер выдает ошибку:

    «Ошибка при создании объекта из компоненты C:1C estaddin_fptr10_x86.dll (отсутствует интерфейс IInitDone) »

    Ваша обработка нарушает правила оформления чеков — посмотрите презентации во вложении

    Вы не обманываете, а не договариваете = скрываете истину намеренно или потому что не знаете?

    Reply
  10. victuan

    (9)

    «Ошибка при создании объекта из компоненты C:1C estaddin_fptr10_x86.dll (отсутствует интерфейс IInitDone) »

    По ссылке ошибка в коде — не нужно использовать метод ЗагрузитьВнешнююКомпоненту.

    Если дойдете до поста (21) в той же теме, то увидете что решение было найдено:

    Долго маялся с «addin_fptr10_x86.dll (отсутствует интерфейс IInitDone)»

    Потом дошло, ее не надо пытаться подключить как ВК, достаточно зарегистрировать через regsvr32,

    и обращаться к объекту «FR = СоздатьОбъект(«AddIn.Fptr10»); «

    Ваша обработка нарушает правила оформления чеков — посмотрите презентации во вложении

    Что такое «правила оформления чеков»? Как именно нарушает? Где вложение с презентацией?

    Вы не обманываете, а не договариваете = скрываете истину намеренно или потому что не знаете?

    Можно конкретику или детали вместо пустых и общих слов?

    Reply
  11. phsin

    (10) ок, тогда еще проще.

    Пример обработки для стандартного драйвера во вложении

    Только как вы будете формировать чек корректировки со стандартным драйвером?

    1С не поддерживает массив байтов, необходимый для открытия чека корректировки…

    P.S. сможете ответить никого не оскорбляя и не ехидничая?

    Если не сможете — лучше промолчите.

    Reply
  12. victuan

    (11)

    сможете ответить никого не оскорбляя и не ехидничая?

    Вы меня ни с кем не перепутали? Дайте конкретные примеры, где я кого-то оскобрил или ехидничал.

    Чек коррекции через ДТО10 в 1С 7.7 я реализовал в полном объеме для ФФД 1.05. Пришлось конечно повозиться, но всё работает штатно и без костылей.

    А вам рекомендую внимательно читать инструкции, чтобы не писать потом:

    1С не поддерживает массив байтов, необходимый для открытия чека корректировки
    Reply
  13. victuan

    (11)

    1С не поддерживает массив байтов, необходимый для открытия чека корректировки

    Для таких случаев драйвер содержит другие методы:

    используем getParamString, т.к. getParamByteArray 1С 7.7 не поддерживает.

    Reply
  14. phsin

    (12) Это вы рекламируете себя, что умеете хорошо читать инструкцию? )))

    Инфостарт не место для разбора вашего поведения, если вы не замечаете — обратитесь к специалистам.

    Reply
  15. victuan

    (14) После таких слов даже не возникает желания помогать и отвечать…

    Наверное, пост (13) я создал зря.

    Эту ветку больше не мониторю.

    Reply
  16. phsin

    (15) Вашу помощь в критике и обесценивании переоценить просто невозможно…

    Reply
  17. victuan

    Обещал не мониторить, но всё-таки отвечу: что не так в моем поведении, и что конкретно Вы ожидали от меня после многочисленных и необоснованных обвинений с Вашей стороны?:

    — Стандартный драйвер Атол v10 в 1Cv7 не работает

    — Ваше решение работает только с 8й версией драйвера, 10 — заявлено, но не работает…

    — В Вашем решение принципиально неправильный алгоритм работы.

    — вы продаете разработку, которая по умолчанию нарушает закон

    — Ваша обработка нарушает правила оформления чеков …

    — Вы не обманываете, а не договариваете = скрываете истину…

    и т.д.

    Несостоятельность Ваших обвинений я объяснял на примерах и своем опыте, также просил разъяснить в чем именно мои нарушения состоят.

    Однако в ответ не получил от Вас ни обоснований Ваших лживых обвинений, ни извинений…

    Reply
  18. phsin

    Виктор, самоутверждайтесь в другом месте, пожалуйста.

    Обычно dll загружаются через ЗагрузитьВнешнююКомпоненту, что со стандартной обработкой не сработало.

    Поэтому написал внешнюю dll. Обработка работает, все функции работают и даже больше.

    То что вас обидели мои комментарии — это понятно. То что ваша обработка устарела и весь алгоритм работы вашей обработки неправильный — говорится в презентации Атол. см вложения

    Обсуждать вашу обработку мне неинтересно, делайте это на своей странице.

    Считаю ваше поведение абсолютно некорректным.

    Reply
  19. Tarlich

    Подскажите пожалуйста : а если у меня подключение не по ком а по лан что поменять в коде ?

    Reply
  20. phsin

    (19) посмотрите параметры

    LIBFPTR_SETTING_IPADDRESS — IP-адрес ККТ. Может быть как ip-адресом, так и hostname-ом.

    LIBFPTR_SETTING_IPPORT — IP-порт ККТ.

    LIBFPTR_SETTING_MACADDRESS — Bluetooth MAC-адрес ККТ. Устройство должно быть предварительно сопряжено с хостом средствами ОС.

    http://integration.atol.ru/api/?pascal#nastroyka-drayvera

    Reply

Leave a Comment

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