Пакетная печать стандартных бухгалтерских отчетов (БП 2.0)




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

14 Comments

  1. gutentag

    Жаль что обработка в БП 2.0 не работает

    Reply
  2. anreko

    (1) gutentag, Она именно в БП 2.0 и работает, на обычных формах. Просто скомпилирована она под платформу 8.3. Сейчас попробовал, на платформе 8.2 тоже открывается.

    Reply
  3. gutentag

    (2) К сожалению в типовой БП2.0.64.18, платформа(8.2.19.116) и на компьтере (установлен MS Office 2013) и на сервере(установлен только Open Office) обработка выдает ошибку:


    {Форма.Форма.Форма(107)}: Ошибка при вызове метода контекста (Записать)

    ТабДок.Записать(ИмяКаталога+»ОСВ по счету»+ПредставлениеПериода(НачалоДня(НачалоКвартала), КонецДня(КонецКвартала), «ФП = Истина» )+»ОСВ по счету «+ФормаОСВПоСчету.Счет.Код+» за «+ПредставлениеПериода(НачалоДня(НачалоКвартала), КонецДня(КонецКвартала), «ФП = Истина» )+».xlsx»,ТипФайлаТабличногоДокумента.XLSX);

    по причине:

    Ошибка доступа к файлу ‘C:TESTОСВ по счету1 квартал 2014 г.ОСВ по счету 26 за 1 квартал 2014 г..xlsx’

    Reply
  4. anreko

    (3) gutentag, Я понял в чем проблема.

    Он почему-то не может создавать каталоги. Странно, а в версии 8.3 точно работало. Сейчас доработаю для версии платформы 8.2

    Reply
  5. anreko

    Обновил версию обработки до 1.01

    Исправлено:

    1) для версии платформы 8.2 не создавал каталоги.

    Добавлено:

    1) Создается промежуточный каталог с датой версии выгрузки.

    ——

    (3) gutentag, Попробуйте скачать новую версию обработки. Если система скажет, что снова будут списаны стартмани, напишите мне свою почту, отправлю почтой новую версию обработки.

    Reply
  6. gutentag

    Скачал файл «Пакетная печать стандартных бух. отчетов (версия 1.01)». — Обработка работает и сохраняет файлы и на сервере и на ПК.

    Когда стал сравнивать файлы с аналогичными отчетами в программе, выявились замечания/ошибки:

    — Должен быть выбор организации для формирования отчетов. Если в базе несколько организаций, то обработка этого не понимает.

    — Формат XLSX заменить на формат XLS (Excel-97), так как еще все пользователи или программы поддерживают (бесплатный Open Office, который установлен у меня на сервере плохо читает XLSX) — см.прикрепленную картинку.

    + сделать оформление: вывод наименования организации, единиц измерения = Рубль, Подписанта(должность фио)

    ————

    Резюме: в остальном, обработка достойна большого респекта и уважения.

    Reply
  7. vikm

    Не работает на 8,3

    {Форма.Форма.Форма(128)}: Метод объекта не обнаружен (ИнициализацияОтчета)

    ФормаОСВПоСчету.ИнициализацияОтчета();

    Reply
  8. anreko

    (7) vikm, Укажите версию конфигурации, версию платформы.

    Reply
  9. anreko

    (6) gutentag, Обновлена версия обработки до 1.02. Учтены все ваши пожелания.

    Изменения по сравнения с версией 1.01:

    1) Добавлена возможность выбора типа файлов;

    2) Добавлена возможность выбора организации;

    3) Добавлена возможность редактирования доп. параметров на отдельной заккладке: «Выводить заголовок», «Выводить подписи», «Выводить единицу измерения», «Выводить диаграмму».

    Reply
  10. vikm

    БП 3.0.41.55, платформа 8.3.6.2152

    Reply
  11. anreko

    (10) vikm, Ок, проблема понятна. Попробую исправить.

    Reply
  12. gutentag

    (9) спасибо, посмотрю в понедельник 🙂

    Reply
  13. gutentag

    (9) протестировал версию 1.02. Почти все сделано супер-отлично и обработка работоспособная, если не считать, ИМХО, некоторых глюков:

    — расширения у файлов должны быть традиционными, с первой попытки файл с расширением типа «Анализ счета 10.01 за Март 2015 г..xls97» автоматически ничем не открывается (но открыть с помощью …. — открывается). Имхо логичнее сделать имя «временной папки» с имененем типа — «26 октября 2015 г. 14-21-13 (xls97)», а расширения файлов = xls.

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

    — НЕ принципиально: — было замечено формате PDF, что некоторые отчеты цветные, а некоторые черно-белые (см.картинку)

    Примечание: — специально, все отчеты во всех форматах, я не сохранял.

    ______________________

    Все остальное сделано отлично!

    Reply
  14. gutentag

    (9) оказывается вывод отчетов в формате XLS тоже есть(в самом верху списка выбора), ура!

    Если не сложно то добавьте, пожалуйста, вывод «ОСВ по всем счетам» (очень надо)

    Рекомендую строку 366 изменить:

    //ЭтаФорма.ЭлементыФормы.ФорматФайлов.Значение = ТипФайлаТабличногоДокумента.XLSX;
    ЭтаФорма.ЭлементыФормы.ФорматФайлов.Значение = ТипФайлаТабличногоДокумента.XLS;
    

    —————————

    Выявлен мелкий глюк :

    — если установлен период(я установил для теста) с 01.01.2015 по 31.01.2015 и вывод данных «По месяцам», то обработка выводит файлы за период: Январь 2015, Февраль 2015, Март 2015.

    Конечно, в этом ничего страшного нет, только тратится больше времени на ожидание…..

    ЗЫ.рекомендую в публикацию добавить картику типа(можно взять мою картинку), смотри ниже:

    Reply

Leave a Comment

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