Загрузка чеков в 1С:Деньги




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

25 Comments

  1. pallid

    Не пользовался мини деньги, а зачем там сканируем а потом все равно в поле ФД вносим код с чека?

    Reply
  2. a22011973

    При сканировании в поле комментарий попадают ещё два кода ФН и ФП, ФД приходится вводить в ручную.

    Reply
  3. pallid

    {ВнешняяОбработка.ЗагрузкаЧеков.Форма.Форма.Форма(20)}: Ошибка при вызове метода контекста (ПрочитатьJSON)

    Документ = ПрочитатьJSON(Чтение);

    по причине:

    Непредвиденный символ при чтении JSON

    Ответ сервера: the user was not found or the specified password was not correct

    ЧЯДНТ?

    Reply
  4. pallid

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

    Reply
  5. YOr!k

    Отлично! спасибо, всё прекрасно работает

    У меня немного другой сценарий ввода документов расхода:

    1) сначала автоматическая загрузка выписки банка

    2) потом детализация расходов по чеку

    для данного сценария доработал обработку следующим образом:

    1) поиск существующего документа расхода по дате и сумме документа

    2) заполнение всех полей ФН, ФП, ФД сканированием qr кода с веб камеры с помощью программы — http://infostart.ru/public/359549/

    Reply
  6. a22011973

    (4)Получеться, пароль логин на закладке настройки вводили?

    Reply
  7. pallid

    (6)Да, вводил. А на данный момент у Вас работает получение данных с сервиса? а то может у них там предпразднечная профилактика и т.д

    Reply
  8. pallid

    Ооо, я даже зашел на сервис указанный в обработке, через браузер, там вбил логин пароль, таже ошибка «the user was not found or the specified password was not correct «. Видимо проблема с моим логином, но на основной сайт я та захожу

    Reply
  9. a22011973

    (8)У меня работает, что за парольлогин? Налоговая выпустила мобильное приложение по проверки чеков, нужно зарегистрироваться там, логин номер телефона пароль они присылают в смс.

    Reply
  10. a22011973

    (5)Интересно, я бы взглянул на обработку.

    Reply
  11. pallid

    (9) ааа, просто в описании «в настройках логин пароль с САЙТА налоговой» я его и вбивал ))) Сайт где личный кабинет физического лица. Я думал о нем речь в описании

    Reply
  12. Zero_nv

    Пришло обновление на мини деньги. Теперь ФД пишется в комментарий. Так что уже ничего не надо вводить с чека. Для себя уже сделал, плюсом обернул в попытку/исключение ПрочитатьJSON — не красиво работало если чек еще не передан в налоговую

    Reply
  13. a22011973

    (12)Доработал, добавил загрузку документов за период.

    Reply
  14. Zero_nv

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

    Мне кажется обработка будет более универсальной если ей можно будет пользоваться как через файл, так и как обработку заполнения ТЧ.

    Массовое заполнение чеков актуально для тех кто не ведет доп. аналитику по статьям. В других чеки лучше заполнять поштучно и из самого документа.

    Reply
  15. svcoopers

    ошибка выходит при загрузке- наименование товара не переносится в документ в поле подробности. Сам код не смотрел

    Reply
  16. a22011973

    Что за ошибка?

    Reply
  17. svcoopers

    Обработка по конкретному чеку считывает с сайта ФНС названия товаров. Но по кнопке «Перенести в документ» названия товаров в документ не переносятся.

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

    Деньги 8, редакция 2.0 (2.0.33.11)

    Reply
  18. a22011973

    По кнопке «Перенести в документ» происходит поиск строки в регистре сопоставления статей расхода названиям товаров, введённых ранее. Если статья расхода не находится, то строка пустая.

    Reply
  19. svcoopers

    Вас понял. Идет попытка автоматически подобрать статью расхода по товару. Но параллельно было бы неплохо делать запись названия товара именно в подробности строки. Это в качестве идеи.

    Reply
  20. a22011973

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

    Reply
  21. svcoopers

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

    Reply
  22. a22011973

    У меня статьи расходов соответствуют товарам, ну или группам товаров.

    Reply
  23. svcoopers

    теперь ясно. Можно и так конечно, но список статей расходов сильно распухнет конечно

    Reply
  24. a22011973

    Зависит от степени детализации, можно просто «молочные продукты», а можно молоко, кефир и т.д.

    Reply
  25. user1297776

    Подскажите, пожалуйста, как прикрутить эту обработку в базовую версию Денег? Платформа: 1С:Предприятие 8.3 (8.3.13.1809)

    Конфигурация: Деньги 8, редакция 2.0 (2.0.34.8)

    Режим: Файловый (без сжатия)

    Приложение: Тонкий клиент

    Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)

    Вариант интерфейса: Такси

    Спасибо!

    Reply

Leave a Comment

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