Универсальный реестр документов 8.1




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

29 Comments

  1. AvalonE2008

    Все кто скачивает, неполенитесь оставить комментарий. Если обработка понравилась то буду рад «+»,если не понравилась то здоровой критике.

    Reply
  2. wirg

    запустил на торговле 10,3,3,3, указал период и реквизиты, но ничего в результате после формирования кроме столбов нет, что еще нужно указать

    Reply
  3. Safronov_S

    проверил на ЗиУП, реестр сформировался. Во только ширина колонки нормально не настроилась.

    Reply
  4. Safronov_S

    Заголовок кстати тоже чёт куда то уехал 🙂

    Reply
  5. AvalonE2008

    (4) Не спорю, косяк. Пока не знаю как решить, но в понедельник займусь вплотную так как самого не очень устраивает такой вариант.

    Reply
  6. AvalonE2008

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

    Reply
  7. albert

    Вот если б с ревизитами табличных частей…

    Reply
  8. AvalonE2008

    (7) Давай описание как это должно выгладить, попробую сделать

    Reply
  9. wirg

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

    Reply
  10. AvalonE2008

    (9) вообщем попробую 🙂

    Reply
  11. albert

    (8) Ок. Обычно при сборке реестра нужно выводить документы с итоговыми суммами. Так вот, нужно чтоб в колонку с реквизитами можно было «тянуть» числовые реквизиты табл. частей, а при выводе документа выводить итог по реквизиту.

    Reply
  12. albert

    + еще наверное не хватает сохранения настроек по видам документов

    Reply
  13. AvalonE2008

    Постараюсь сделать, а по поводу суммы есть реквизит ИТОГОВАЯСУММА в большинстве документах 🙂

    Reply
  14. Sigrlami

    Судя по комментариям навеяно этим

    http://infostart.ru/projects/1684/

    +наблюдаются двухсекундные задержки при добавлении док-та;

    +нет множественного выбора;

    +нельзя редактировать представление реквизитов;

    чисто субъективно,как пользователь,не логичный интефейс, бухи замордуют пока разберутся….

    Reply
  15. AvalonE2008

    (14) Обсолютно верно 🙂 что значит нет множественного выбора?

    Reply
  16. dvv01

    Не выбирает реквизиты составного типа (Торговля):

    хочу отобрать поступления на данный склад — раквизит: СкладОрдер (спр.Складыили док.ПриходОрдер) — нет его в списке…

    плюс было бы здорово иметь возможность группировать колонки, а то у 1С-ников в одних документах Склад, в других — СкладОрдер или СкладПолучатель или СкладОтправитель

    Reply
  17. Sigrlami

    (15)..имеется ввиду добавление документов сразу,например нужно 20 из 100…по одному замахаешся добавлять…

    Reply
  18. nookie

    Выскажу свои замечания:

    1. Не хватает в печатной форме реестра итоговой суммы по реквизиту «сумма документа» (это очень не нравится всем без исключения бухгалтерам)

    2. В разделе выбранных реквизитов еще нужны стрелочки «вверх» и «вниз» для смены порядка выбранных реквизитов.

    3. Насчет представления реквизитов соглашусь с предыдущими ораторами.

    4. Необходимо иметь возможность сохранять настройки реестра.

    Если Вы внесете эти изменения в обработку, то, на мой взгляд , она станет еще лучше и полезнее.

    Reply
  19. RuTaS

    Не нашел возможности добавить фильтра на «Проведен» и «Удален».

    Reply
  20. sbv2005

    штатная альтернатива — Универсальный отчет (по регистрам, документам, справочникам)

    Reply
  21. AvalonE2008

    Добавил новую версию.

    * подправлены алгоритмы

    * автоматическая ширина колонок

    * сортировка колонок

    * измение представления(в оснвоной закладке форме двойной клик на реквизитах)

    Reply
  22. Borisych

    Приколы во втором файле:

    Нажатие на кнопку выбора периода игнорируется и при развороте на весь экран на основной странице размеры элементов формы не меняются

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

    Reply
  23. Borisych

    а еще фильтры добавить нет возможности, хотя панелька для ТП прикручена

    Reply
  24. Borisych

    В ТП «Сортировка колонок» добавить строку можно, а при попытке удалить сообщение «Так делать нельзя!» и валятся ошибки. Ужас!!!

    Reply
  25. AvalonE2008

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

    Что бы добавить фильтры необходимо выбрать реквизиты документа вначале.

    «В ТП «Сортировка колонок» добавить строку можно, а при попытке удалить сообщение «Так делать нельзя!» и валятся ошибки. Ужас!!!»

    А зачем тебе ее удалять?

    Reply
  26. Кадош

    реквизиты табличных частей не выводит

    Reply
  27. alfaret

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

    Плюс за то, что код не скрыт

    Reply
  28. jshadow

    Регулярно пользуюсь для сверки по наличию оригиналов документов. Плюсанул.

    Reply
  29. AvalonE2008

    (28) jshadow, спасибо.Очень приятно что кому то пригодилась.

    Reply

Leave a Comment

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