ЕГАИС от А до Я




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

17 Comments

  1. pablo_escobar
    Отменой фиксации является отправка чека с теми же данными, но с минусовой ценой. При этом элементы «Номер чека», «Номер смены», «Номер кассы», «Тип чека» должны отличаться от ошибочно зафиксированного.

    Может достаточно чтобы отличался только номер чека? И что такое «Тип чека»?

    Reply
  2. pablo_escobar
    Таким образом, если Вы убедились, что застрявшие в папке xml чеки дошли до ЕГАИС и попали в журнал продаж, то тогда эти файлы (чеки) из папки xml можно удалить, чтобы не засорять ненужным материалом папку, т.к. иначе потом будет трудно разбираться с файлами в этой папке.

    Можно удалять если продажи отразились в журнале продаж и списались с остатков. Так как не раз было, что чек висит в папке xml, отражен в ЖП, но не списал остатки, либо наоборот списал остатки, но не отражен в ЖП.

    Reply
  3. denis-tlt@mail.ru

    (1) Я предполагаю, что «Тип чека» — это чек на Приход либо на Расход.

    Хотя могу и ошибаться.

    Reply
  4. RocKeR_13

    (1) в XSD схемах нет деления на Приход/Расход: есть одна схема — «Cheque.xsd». Для регистрации операции возврата необходимо отправлять чек с отрицательной ценой:

    <xs:simpleType name=»PRICE»>

    <xs:restriction base=»xs:string»>

    <xs:pattern value=»[-]?d+.d{0,2}» />

    </xs:restriction>

    </xs:simpleType>
    Reply
  5. goleaff2006

    Не путать просто возврат, и технический возврат в случае сбоя, данный ответ мне был предоставлен тех поддержкой ЕГАИС.

    Reply
  6. pablo_escobar

    (5)

    Технический возврат (возврат, который формируется в связи со сбоем на кассе, терминала и т.д ). Отменой фиксации является отправка чека с теми же данными, но с минусовой ценой. При этом элементы «Номер чека», «Номер смены», «Номер кассы», «Тип чека» должны отличаться от ошибочно зафиксированного.
    25. В каком случае можно сформировать виртуальный возвратный чек в ЕГАИС ?

    Может формироваться в случае технического возврата, когда произошло например окончание кассовой ленты, кассовый чек отменился, но перед этим в ЕГАИС был отправлен уже прямой чек, и кассовая программа автоматически формирует виртуальный возвратный чек, в котором будет изменён лишь Номер Чека (а номер смены и номер кассы — останутся прежними).

    Это 2 цитаты из статьи. Вторая правильная, а первая вводит в заблуждение.

    Вот из документации к УТМ

    Сохранение чека в оперативную память УТМ (кэш) производится по следующим

    параметрам: № ККМ + № смены + № документа + хеш-сумма от всех элементов Bottle в

    чеке.

    Как параметр № документа рекомендуется использовать номер фискального документа,

    т.к. гарантирована его уникальность для каждой операции. Получить номер фискального

    документа возможно путем запроса этого значения из ФН и увеличения его на единицу.

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

    случаев, когда речь идет о виртуальном возврате. Номер таких документов разработчики ПО

    могут формировать любым удобным способом (но не инкрементируя фискальный номер

    документа).
    Reply
  7. goleaff2006

    В документации больше говорится про возврат товара покупателем в тот же день. А если технический чек формируется в другой день? А как егаис может понять что это технический возврат, или именно возврат покупателем?

    Reply
  8. pablo_escobar

    (7)

    В документации больше говорится про возврат товара покупателем в тот же день. А если технический чек формируется в другой день? А как егаис может понять что это технический возврат, или именно возврат покупателем?

    егаис не делит чеки на технические и не технические. Весь смысл в том что у реальных чеков рекомендуется передавать в качестве номера фискальный номер чека, а у технического возврата номер можно формировать например прибавляя к текущему номеру 10000 или другое число которое точно не повторится в эту смену.

    Reply
  9. goleaff2006

    Это ваше предположение или Вы точно знаете?

    Reply
  10. ambrozii

    (9) Это многие точно знают

    Формат обмена с УТМ подразумевает возврат, как указание отрицательной цены. И сервер ЕГАИС потом не делит эти возвраты на технические и не технические. А какие там номера чеков или еще чего-то — не суть важно (точнее, важно, но это отдельный вопрос, не связанный с возвратом). Если взять все типовые, там в случае отмены/сбоя и т.п. в обработке ошибки чека дописывается какая-то байда к номеру чека, чтобы он, как верно заметил коллега в посте (8), точно не повторился в эту смену. И все.

    Reply
  11. goleaff2006

    Всех опросили? =))) Я вам ответ тех поддержки самого ЕГАИСА , а вы мне про типовые …. Цель моя не убедить, а постараться донести.Поэтому разговор по поводу виртуальных технических возвратов считаю исчерпанным.

    Reply
  12. pablo_escobar

    (11) Ну тогда берем ответы техподдержки ЕГАИС

    operator5 » 06 янв 2019, 14:12

    Здравствуйте! В случае ошибочной фиксации чека, отменой фиксации является отправка чека с теми же данными, но с минусовой ценой. При этом элементы «Номер чека», «Номер смены», «Номер кассы», «Тип чека» должны отличаться от ошибочно зафиксированного. Так как данный чек является виртуальным, необходимо предусмотреть, чтобы номер этого виртуального чека в дальнейшем не совпадал с реальными.

    Причем вы поленились скопипастить цитату полностью.

    operator9 » 03 дек 2018, 12:52

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

    operator9

    Сообщения: 22600

    Зарегистрирован: 08 авг 2012, 14:25

    ИНН: 99999999999

    Ну и по ссылке http://forum.fsrar.ru/viewtopic.php?f=114&t=64487 операторам делают замечание, за такую формулировку и они это замечание принимают. И если читать букварь к УТМ и разбираться со схемами xsd, то такая формулировка сразу бы бросилась в глаза.

    Reply
  13. goleaff2006

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

    Reply
  14. R2-D2

    Добрый день. Статья конечно полезная, но какая-то сумбурная. Не дает представление о сути вопроса лицам непосвященным и абсолютно бесполезная лицам посвященным. Хотя безусловно, информация предоставлена крайне полезная!

    Моменты несоответствующие действительности:

    1. ЕГАИС стал обязательным с 01.01.16, а не с 2015.

    2. В объяснении про тикеты они зачем-то делятся на «первый» и «второй», хотя правильнее использовать термины вроде «квитанции о доставке» и «квитанции о регистрации» — тогда сразу все становится понятнее. Так же вы очевидно не сталкивались с ситуациями когда приходит только второй тикет, или же приходит 3 тикета — о доставке, о регистрации и с ошибкой о повторе регистрации.

    3. Вместе с ТТН приходят не только тикеты, но и уведомление о регистрации и история движения по формам 2 (не всегда)

    4. Таблица с ошибками в логах УТМ — морально устарела. На УТМ 3.0.8 уже практически не возникают эти ошибки. И вообще, УТМ стал работать значительно надежнее, чем какой-нибудь 2.0.3.

    Спасибо вам за проделанную работу — вы собрали много информации из разных источников, но все-же, эту информацию вполне посильно найти и самостоятельно если «припечет». А вот есть в ФСРАР/ЕГАИС моменты, которые в открытых источниках не найдешь. И их осветить очень бы не мешало. Например тонкости заполнения расчета мощности основного технологического оборудования или нюансы регистрации продукции во ФРАП.

    Надеюсь на продолжение ваших статей.

    Reply
  15. goleaff2006

    (14)Спасибо за замечания, но есть же промежуточные лица, которые что то знают но не погруженны детально, и времени на поиск какой то информации мало.

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

    По второму используется тикет 1 и 2, потому что везде именно пишется тикет. В егаис их два вида, просто один вид может быть прислан 2 раза , я постарался показать, когда именно второй тикет (не количественно, а тип) приходит,только когда двигаются остатки в ЕГАИС.

    По третьему пункту это описано в документации по УТМ, поэтому я такой момент не включал.

    4. На разных сборках версии 3.0.8 могут возникать.

    Возможно статья запоздала, но раньше руки не доходили.

    Reply
  16. Stas-ch

    Спасибо за статью. В одном месте много полезной информации.

    Вопрос:

    1. По РФУ2 старые марки (68 символов) были поставлены актом фиксации штрихкодов на поштучный учет

    2. Была продажа по этой РФУ2 в партионном учете (без указания марок). При этом у отправителя с Р3 все марки исчезнут?

    3. Если после этого отгрузить РФУ2 с указанием марок, то у получателя эта продукция будет в помарочном или партионном учете?

    Иначе говоря, получение в накладной товаров с указанием марок (68 символов) является критерием того, что получена продукция в помарочном учете и эта продукция будет числиться на регистре Р3? или однозначно это нельзя сказать?

    Reply
  17. user1324210

    Здравствуйте, я бы хотела узнать, приняла алкоголь (лобби бара) на компьютере (бара) соответственно где электронная подпись бара. Можно ли это изменить.

    Reply

Leave a Comment

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