АЦРК: Реестр документов универсальный




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

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

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

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

31 Comments

  1. viktnov

    Реестр хороший, не хватает шаблонов , настраивать под каждый документ

    и далее перестраивать , так что-ли

    Reply
  2. acrk

    (1) Мне кажется, что то, что вы называете шаблонами, вполне соответствует стандартному механизму сохранения настроек формы. Сделали настройку, сохранили с определенным именем. Потом можете ей пользоваться.

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

    Reply
  3. OlegBR

    Отличный реестр.

    Reply
  4. anreko2

    Неплохой реестр, хотя и повторяет все возможности DOCPRINT. Не использованы запросы ни в каком виде, работает дольше. Поэтому придется колупать дальше свою обработку.

    Reply
  5. big60

    docprint не подсчитывает итоги и не позволяет изменять положение колонок. Приходится выгружать в excel и перкраивать. Плюс однозначно. Единственный совет: использовать не идентификаторы реквизитов, а синонимы. Залезу, подправлю. А так — плюс однозначно

    Reply
  6. acrk

    (4) Скорость для получения реестра не критична. Не каждый час его получают. DOCPRINT какая-то замороченная. Существенный недостаток — нет разделителей триад в суммах.

    Reply
  7. miramak

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

    Reply
  8. acrk

    (7) Реквизиты печатаются те, у которых в колонке Печать стоит 1, а итоги подсчитываются те, у которых в колонке Итоги стоит 1.

    Если не получается — пишите поподробней, желательно пример на любой демо-базе 1С: какой документ, какие реквизиты выбираете и т.д.

    Reply
  9. miramak

    (8) Да, дело было в настройках. Но, считаю, каждый раз настраивать, много времени уходит. И, потом, не правильно показывает начальные остатки. Например, я взяла авансовые отчеты за год. Отчет вывел начальный остаток после 1-го А/О- 300,00 грн (по Кт), потом после каждого А/О писал 300,00 грн и в итоге сложил все суммы. А это не правильно. Должно быть либо начальная сумма на начало выбранного периода, а это, вообще, было 0,00 грн, либо,все же 300,00 грн. Несколько не понятна логика.

    Reply
  10. acrk

    (9) Не надо настраивать каждый раз. Один раз настроили — сохранили стандартным способом (кнопочкой Сохранить настройки) с определенным именем и пользуйтесь готовой настройкой.

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

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

    Reply
  11. miramak

    (10) Спасибо за разъяснения. И, все же, в колонке » Начальные остатки», по моему мнению, по каждой позиции должны выводиться остатки с ОСВ на данную дату, а в «Итоги»-конечное сальдо. Так, мне кажется, было бы правильно и удобно.

    Reply
  12. acrk

    (11) Не надо пытаться заменить оборотку реестром документов. Реестр — это просто список. В нем нет понятия остатка на начало и конец — для этого нужна информация из других источников. Реестр не знает об экономическом смысле числовых полей. Это в частном случае с авансовыми отчетами в документе есть такое поле «Остаток на начало», которому к тому же не стоит очень верить. (Конечно, если очень строго вести учет, то оно должно совпадать с реальной обороткой). А если у вас реестр приходных накладных, какой вы хотите увидеть остаток?

    Реестр — чисто оборотный отчет.

    Reply
  13. miramak

    (12) Я с Вами согласна. Наверно, я много хочу. + за мной

    Reply
  14. acrk

    (13) Да, вероятно вам нужен специализированный отчет по авансовым отчетам.

    Reply
  15. wumka

    За работу однозначно +, но… «Реестр документов v 2» автор Diamond

    http://infostart.ru/public/14883/

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

    P.S. Всё-таки скрины к работам и более подробное описание пользования ими нелишни.

    Reply
  16. nikakoy

    Существенно — реестр только по одному виду документа.

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

    Например ТиС, документ «Списание ТМЦ», реквизиты «Субконто 1(-3)».

    Reply
  17. acrk

    (16) Насчет одного вида не знаю. На мой взгляд реестр и должен быть по документам одного вида. Чего их мешать-то ?

    А насчет неопределенного типа реквизита посмотрю, может доработаю.

    Reply
  18. acrk

    (16) В новой версии добавил отбор по реквизитам, для которых задан тип «Неопределено».

    Reply
  19. Victor_62

    Реестр хороший,пробовал работает…

    Reply
  20. monwesson

    не выводит на печать реквезиты такие как код товвара в документе или артикул!

    хотя это определяющие моменты в большинстве своём

    Reply
  21. lvovalex2011

    реестр, который нужен в повседневной работе

    Reply
  22. NPodolsk

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

    Reply
  23. NPodolsk

    может кто знает, подскажите пожалуйста

    Reply
  24. NPodolsk

    конфигурация 1с 7.7 УСН

    Reply
  25. NPodolsk

    да, не совсем удобный реестр

    Reply
  26. acrk

    (25) NPodolsk, какой документ-то выводите ?

    Если речь идет, например, о поступлении ТМЦ, то щелкните в колонке Печать напротив реквизитов ДатаДокВходящий и НомерДокВходящий (под рукой ТиС 9.2, УСН нету)

    Reply
  27. m-xolding

    Удобная программа! Спасибо автору!

    Reply
  28. wradik1

    Спасибо автору пользуюсь давно удобно если надо быстро дать информацию начальству

    Reply
  29. kkk

    Спасибо.

    Reply
  30. m-xolding

    Пользуюсь часто. Спасибо Вам!

    Reply
  31. GenTay

    Хорошая обработка.Спасибо

    Reply

Leave a Comment

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