Анализ работы бухгалтерии




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2018-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='\

21 Comments

  1. Amali

    Только вот с бухгалтерами не советовала бы шутить, а то они обидься и деньги перестанут платить….)))

    Reply
  2. e.kogan

    Хотелось бы иметь возможность выводить не по группам пользователей (ибо создавать только ради этот влом), а по кадровым данным (потому что они-то как раз есть).

    Reply
  3. k_olga

    Отчет писался для бухгалтерии, в которой не ведется начисление з/п, и, соответственно, кадровых данных в ней нет.

    Reply
  4. mirmouse

    Пробовала на разных группах пользователей — все ок.

    А вот на Кладовщиках вылетает 1С совсем с ошибкой СУБД. Ошибка в пристегнутом файле.

    Reply
  5. husky

    может к УПП можешь прикрутить очень надо?

    Reply
  6. mvs60

    Жаль на 8.2 не работает. 🙁

    Reply
  7. kouch

    А нельзя её перевести на 8.2? Буду ждать с нетерпением!)))

    Reply
  8. powerpc

    1. Хорошо бы без групп статистику посмотреть.

    2. У кого документы выгружаются из торговли кассиры «победят» )))

    Reply
  9. alaudit

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

    А под 8.1 все еще доступно? Где можно скачать? Или одна обработка под обе платформы?

    Reply
  10. k_olga

    (9) Под 8.1 выложила здесь http://webfile.ru/5622678

    Reply
  11. alaudit

    Мерси. Но что-то на 2 бух базах попробовал- пустй отчет (релиз 1.6.31.1) (((

    Reply
  12. k_olga

    (11) — чтобы отчет работал необходимо:

    1. в группах пользователей сделать группу «Отделы».

    2. в группу пользователей «отделы» добавить ваши отделы (банк, касса, реализация и т.п.) — или перенести существующие.

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

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

    Reply
  13. k_olga

    alaudit, это, конечно не в тему, но пора бы от 1.6 уже перейти на 2.0 или КОРП. Сейчас конец года — поторопитесь. Времени почти не осталось.

    Reply
  14. alaudit

    Уважаемая, Ольга. Заведение отделов и добавление в них пользователей — заиграло. НО! Неожидано текущйи месяц (октябрь) не дает никаких данных- пустой отчет. Пробовалось сделать за весь 2011 год (периодом с 01.01.2011 по 31.12.2011) и просто периодом с 01.01.2011 по 30.09.2011 (!) что бы вычитанием получить октябрь- цифры вышли одни что за 9 что за 12 месяцев. То есть октябрь не цепляется (((

    В целом отличная разработка, будем использовать и по 8.1 и по 8.2 (правда время работы приходися оценивать ручками- путем фильтра журнала на событие началозавршение сеанса, копипаст в эксель и вычитание строчек времени началозавршение сеанса с предварительной чисткой даты в ячейках (иначе эксель не считает). Добавить бы врменнУю статистику- цены бы не было!

    В любом случае- Спасибо!

    зы. текущий месяц бы =)

    Reply
  15. k_olga

    Возможно, у Вас не заполнены ответственные в документах за октябрь месяц.

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

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

    Reply
  16. alaudit

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

    Reply
  17. Adoms

    Отличная обработка! Единственное, что если нужно (допустим) узнать сколько пользователь ввел документов за сегодня, а пользователь сегодня вводил документы за прошлые периоды — обработка покажет ноль документоф, и на вскидку можно подумать, что исследуемый бухгалтер лодырь 🙂

    Reply
  18. YuliaYVS

    Прикольно, особенно когда руководство спрашивает «В то время когданаши космические корабли бороздят просторы вселенной, а что это вы тут делаете?». Отчет пригодится… Только мало кого волнует, что бухгалтера, по мимо оформления операций в базе, ещё могут делать и другие функции (проходят куча сверок, задачи руководства и т.п и т.д)…

    Reply
  19. okanat

    Бедные бухгалтера…Еще подсчитайте когда они свои многокиллограмовые папки с доками домой тащут-так сказать хрогометраж по перетаскиванию тяжестей(((

    Reply
  20. viacht

    А на украинских конфигурациях будет работать? Мне бы попробовать. Может вышлите на мыло логин@rambler.ru

    Reply
  21. Petr43

    Добрый вечер, попытался запустить на Бух Корп 2.0.59.4 (Пред. 8.2.19.106). После запуска внешней обработки выдает ошибку «Ошибка загрузки документа. Внешняя обработка не может быть прочитана текущей версией программы». Что я делаю не так?

    Заранее признателен за ответ.

    Reply

Leave a Comment

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