Экономим время на ввод операций в 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='\

20 Comments

  1. logarifm

    особенно круто, когда пошол на рынок. Оплатил стоянку. Голый НАЛ!!!

    Reply
  2. khabibullin.tu

    Автор, вы копаете не в ту сторону, сейчас почти на всех чеках есть QR-код, сканируешь приложением ФНС чек и используя спец. обработку грузишь чек в программу (вариантов обработок в сети уйма)

    Reply
  3. Yackov

    Ну если есть банк.карта должна быть и выгрузка платежей в 1с из личного кабинета. Видимо не у всех)

    Reply
  4. vsbronnikov

    (2) Я знаю, что есть ФНС и можно отсканировать все чеки. Но во первых нужно собирать все чеки и сканировать их. Во вторых не на все операции есть чеки, например когда оплату производишь через онлайн-банки. А СМС-ки приходят автоматически и разбираются автоматически, причем все, кроме наличных.

    Я рассматриваю на данный момент ФНС, как способ уточнения содержимого операции по статьям, если мне не будет хватать такой разбивки. На данный момент в большинстве случаев 1 чек — это одна статья.

    Reply
  5. vsbronnikov

    Задача была избавиться от ручного труда, связанного с загрузкой информации в 1С. Любые загрузки/выгрузки из банк-клиентов — это вероятнее всего зайти, сформировать, отправить на почту. Во многих случаях это «не плоский» Excel или PDF. Сложно для разбора — не структурировано.

    Плюс у каждого банка свой формат выгрузки.

    И действительно выгрузки могут быть не у всех.

    Reply
  6. vsbronnikov

    (1) Нал действительно к сожалению не отследить. Даже государство это сделать не может.

    Reply
  7. khabibullin.tu

    (4) Пользуюсь загрузкой из ФНС уже полгода, купил, чек отсканил на телефон и сразу в мусорку. Операций 5-10 в месяц руками забиваю (то, что в инете оплачиваешь — зачастую тоже уже имеет чек, например МТС кидает электронные чеки), оч. удобно все

    Reply
  8. nicxxx

    «около 3 лет» — слабак 🙂 я 7 лет уже веду.

    Вопрос по теме — некоторые банки шлют push-уведомления. Их реально обработать?

    Reply
  9. vsbronnikov

    (8) У меня был продвинутый режим: я каждую строку чека разбирал. =))

    Про push-уведомления не ставил себе задачу.

    Если поискать такую возможность, то изменится Этап 1: получение сообщения.

    А Этап 2 при этом останется тем же: разобрать текстовую строку.

    Reply
  10. nicxxx

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

    Как мне кажется, для получения Push-сообщения нужно прикинуться оригинальным получателем. Я в мобильной разработке полный ноль, не знаю насколько это реально. Да и в целом просто из любопытства спросил.

    Reply
  11. rpgshnik

    (7)

    Пользуюсь загрузкой из ФНС уже полгода, купил, чек отсканил на телефон и сразу в мусорку. Операций 5-10 в месяц руками забиваю (то, что в инете оплачиваешь — зачастую тоже уже имеет чек, например МТС кидает электронные чеки), оч. удобно все

    А какой именно можете поделиться?

    Reply
  12. dchumak

    Посмотрел, мне кажется это слишком трудоемко и не нужно особо…

    Учитываю свой опыт ведения домашней бухгалтерии (с 1 января 2011 года).

    1. Занести чеки по статьям затрат — достаточно просто, это все делается за 5-10 минут в день. Наличные и банк. Но, по моему мнению, не информативно. Ничего толком не видишь, видишь, что купил продукты, а какие, по сколько? Я детализирую до товарных позиций. Да, это более трудоемко, но, зато вижу данные по конкретным позициям, а не в общем. И могу действительно посчитать правильную инфляцию.

    2. 1100 сообщений за 5 месяцев, итого 220 в месяц, около 7-8 в день. Смысл городить огород ради этого?

    3. 150 магазинов… По контрагентам вообще вести опционально, но, для меня чисто это лишняя информация. Толку от нее ближе к нулю, зато нужно вести дополнительный справочник клиентов/контрагентов/магазинов.

    Reply
  13. independ

    Веду учет с 2010, на смартфоне, сначала был смарт на WM, с 2013 андроид, детализация по товарным позициям (только продукты, коммуналка, транспорт). Счета: нал, карты, депозиты, р/сч. Когда начинал, первоначально планировал вести учет на ПК, но на смартфоне удобней, т.к. он всегда под рукой, и данные можно ввести в любое время

    Reply
  14. vsbronnikov

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

    2. Вот именно, я сделал это для уменьшения трудоемкости процесса ведения учета. Один раз настроил и раз в неделю заглядываю в программу.

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

    Reply
  15. vsbronnikov

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

    Reply
  16. dchumak

    (15)

    1. Да, цену и количество. И детализации больше. Сейчас у меня почти 800 позиций в справочнике Операций (статей расходов / доходов). И интересует меня больше детализация по номенклатурным позициям, чем общее. Например, в вашем случае, детализация чисто по продуктам мне не нужна. Мне нужно смотреть, сколько я на что потратил.

    2. Это не уменьшение трудоемкости, а просто перенос с больной головы на здоровую. Кстати, а если вы в одном магазине покупаете товары с разными статьями расходов (для выходных закупок в большом гипермаркете ситуация достаточно типична), то как программа разнесет это по статьям? Например, продукты, хозяйственные товары в одном чеке.

    3. Смысл раз в неделю заглядывать и сверять, если остатки денежных средств на счетах нужно видеть часто? У моей программы первоначальная цель и была — видеть актуальные остатки ДС. А отчеты по продажам и т.д. прикрутил уже потом.

    Reply
  17. vsbronnikov

    (17) 1. Я ушел от излишней детализации.

    2. Это ограничение, с этим мое решение не поможет и я с этим мирюсь.

    3. У меня нет цели в такой оперативности.

    Reply
  18. tonsochi

    А 1С Мобильное переложение нельзя научить работать напрямую в смс?

    Reply
  19. vsbronnikov

    (19) Мобильное приложение не рассматривал. Полагаю этот вопрос только к разработчикам 1С Деньги можно направить.

    Reply
  20. Staky

    Видел у товарища телеграм бота для такого. Серьёзное дело. Отправил мессагу по форме — ввелась операция.

    Reply

Leave a Comment

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