Опись вложения (БП 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='\

24 Comments

  1. Re:аниматор

    По всем вопросам обращаемся на адрес oonz@yandex.ru

    а что мешать тут задавать вопросы?

    Reply
  2. OlegAl

    (1) Безусловно можно и нужно обсуждать и здесь, но не исключаю варианта использования данного отчета пользователями 1С, которые не знают о существовании данного ресурса. Обработка выложена для свободного использования…

    Reply
  3. lee01

    😀 А не могли бы Вы пояснить для буха, к чему прикрутить внешнюю печатную форму?

    Reply
  4. OlegAl

    (3) Это не внешняя печатная форма, а внешний отчет (обработка), которая по имеющийся у Вас отчетности печатает опись вложения, по выбранной отчетности… Поэтому ее следует прикрепить как внешний отчет (обработка).

    Reply
  5. OlegAl

    (3) Уточняю… Сервис-Дополнительные отчеты и обработки-Дополнительные внешние обработки… Здесь добавляем и с этого места запускаем…

    Reply
  6. yavo2005

    ничего не получается 🙁 ругается, обработку не получается привязать к документам 🙁 чего я не так делаю?

    Reply
  7. OlegAl

    (6) ответ на ваш вопрос в комментариях (4) и (5). Еще раз поясняю,что это не внешняя печатная форма документов, а внешний отчет. Данный отчет не привязывается к документам. Если не получается совсем, то можно попробовать через меню «Файл» — «Открыть»

    Reply
  8. margosha80

    Просто супер! Я давно о описи мечтала! Радости моей предела нет!! Респект! Без ошибок, косяков. Просто и со вкусом! Только плюс!!!!

    Reply
  9. margosha80

    Вот только отчет в фсс не выгружает «{ОбщийМодуль.РегламентированнаяОтчетность(15746)}: Поле объекта не обнаружено (мПечатаемыеРазделы)

    Форма.мПечатаемыеРазделы.Добавить(СтрокаРаздела.ИмяСтраницы);»

    Reply
  10. OlegAl

    (8) (9) Отчет предназначен для получения на печать Описи вложения, печать отчетов оставил для своего удовольствия, а вот выгрузка данных вообще не предусматривалась. Выгрузку рекомендую делать из регламентированных отчетов… Рад, что делалось не зря…

    Reply
  11. margosha80

    Я пыталась распечатать опись для ФСС

    Reply
  12. OlegAl

    (11) Выложил измененный вариант отчета. Изменил алгоритм расчета количества листов. Благодарю margosha80 за участие в тестировании!!!

    Reply
  13. margosha80

    Да не за что. Этим я занимаюсь по 8 часов в день 😀

    Reply
  14. margosha80

    Вот такое теперь сообщение выдает программа (Бухгалтерия предприятия, редакция 1.6 (1.6.25.6))

    {Форма.УправлениеОтчетностью(2063)}: Поле объекта не обнаружено (СтатусыОтправкиРегламентированныхОтчетов)

    по причине:

    {Форма.УправлениеОтчетностью(2063)}: Поле объекта не обнаружено (СтатусыОтправкиРегламентированныхОтчетов)

    Reply
  15. OlegAl

    Добавил к существующему варианту, вариант файла адаптированного под релиз 1.6.25.6

    Reply
  16. Bux2

    БП 1.6.25.5

    Спасибо. Отлично!

    (Может, скриншотик добавить к описанию?)

    Reply
  17. salve-salve

    Спасибо!

    Под 8.2 БП 2.0.20.10 переконвертировал, работает.

    Только вопрос, а возможно добавить, чтоб в Регламентной отчетности — Для кнопки печать — выпадали кроме пунктов Показать бланк и Печатать сразу — Сформировать Опись?

    Reply
  18. iw6

    нужная вещь

    Reply
  19. kate_mik

    Отличная обработочка! Спасибо автору — пишите еще 🙂

    Reply
  20. sps02

    А для 8.2 есть?

    Reply
  21. sps02

    Ответьте пож, работает ли с 8.2 очень очень нужно)

    Reply
  22. OlegAl

    Прошу прощения, я вроде текст написал, но видимо забыл нажать кнопку «Ответить». Постараюсь протестировать сегодня на последнем релизе базы БП на платформе 8.2. Но думаю, что если специалисты 1С не изменили свои внутренние модули все должно сработать на платформе 8.2 при конвертации. Если срочно надо, попробуйте в режиме конфигуратора открыть обработку, она должна автоматически сконвертироваться, запишите ее и можете попробовать в работе…

    Reply
  23. sps02

    Опись

    Reply
  24. sps02

    Спасибо большое! Я все получила и ответила Вам, посмотрите пожалуйста

    Reply

Leave a Comment

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