Отчет "Движения денежных средств"




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

22 Comments

  1. makas

    Для бухгалтерии 2.0 такого отчета нет?

    Reply
  2. batuevds

    Для бухгалтерии 2.0 нет, но если есть желание, можно будет сделать.

    Reply
  3. valya977

    Отчет удобен и функционален. Вопрос-почему остатки на начало периода минусовые даже по новым только открытым счетам?

    Reply
  4. batuevds

    (3) valya977,

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

    Reply
  5. motorkuzbassa.it

    А в чем отличие от стандартного отчета из СТАНДАРТНОЙ поставки в УПП и КА ???

    Reply
  6. batuevds

    (5) motorkuzbassa.it, Практически не в чем, за исключением одной не значительной детали. Стандартный отчет, вы можете сформировать только по оборотному ресурсу, а в этом отчете можно вывести и обороты и остатки.

    Reply
  7. batuevds

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

    Reply
  8. ErikaSun

    День добрый, у вас на модуле объекта пароль стоит, можно как-нить снять, просто отчет хотелось бы весь глянуть)

    Reply
  9. draf

    А ничего что обработка ДЕМО и об этом нет ничего написаного?

    Reply
  10. realmrak

    (7) batuevds, исправления внесены? Сейчас можно выводить данные в валюте упр. учета или еще нет?

    И еще один вопросик — работает ли отчет на «Управление торговым предприятием для Украины»? Заглядывал в конфу, по идее структура «денежных» регистров там не отличается от УПП…

    Reply
  11. batuevds

    (9) draf,

    Ограничение демо режима снято, теперь отчет работает в боевом режиме. При публикации не обратил на это внимания.

    Reply
  12. batuevds

    (10) realmrak,

    Отчет должен работать на любой «локализованной» конфигурации УПП. Если это утверждение не верно, просьба сообщить, для исправления.

    Reply
  13. batuevds

    (10) realmrak,

    Возможности работать с валютой упр. учета пока нет.

    Reply
  14. realmrak

    А зачем пароль вешать? Вот скачал, в УТП запуститься не хочет, незначительные отличия в УниверсальномОтчете (нету там в УТП одной переменной). Может сам бы и подправил, а из-за пароля ничего сделать не могу…

    Reply
  15. realmrak

    В УПП таки запускается, но в разрезе проектов не показывает остатки (только общие). А это меня как раз интересовало… Я, конечно, понимаю, что там оборотный регистр и все такое, но можно было и указать в описании, что остатки выводятся далеко не по всем доступным измерениям. Жаль только, что потратил стартмани.

    Reply
  16. xten

    подскажите, пожалуйста, под БП 2.0 будет работать или нужно допиливать?

    Reply
  17. нинас

    Бухгалтер попросил сделать отчет о движении денежных средств по месяцам за выбранный период. Решила посмотреть что-то готовое. У нас КА. Будет ли работать отчет в КА?

    Reply
  18. Alik_1c

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

    Reply
  19. Alik_1c

    И пароль не убрали!

    Reply
  20. ljolsen

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

    Reply
  21. almyashik

    Здравствуйте.

    Хотела воспользоваться вашей обработкой, но выдает ошибку.

    Форма.Форма.Форма(25)}: Значение не является значением объектного типа (мДействиеПолеВводаВидСравненияПриИзменении)

    УниверсальныйОтчет.мДействиеПолеВводаВидСравненияПриИзменении = Новый Действие(«ПолеВводаВидСравненияПриИзменении»);

    У меня

    1С:Предприятие 8.3 (8.3.5.1383)

    БИТ.Учет аренды, редакция 1.2

    Copyright © 2009-2014, ООО «БТ». Все права защищены. (2.0.64.3/1.2.45.1) (http://www.1cbit.ru/arenda)

    Copyright (С) ООО «1C», 2009 — 2015. Все права защищены

    (http://www.1cbit.ru)

    Можно ли что то сделать?

    Reply
  22. VL_admin

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

    Reply

Leave a Comment

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