Перенумератор справочников и документов




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

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

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

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

23 Comments

  1. allexe

    А перенумерация документов идет без перепроведения или необходимо их перепроводить?

    Reply
  2. loradanilova

    Идет простая запись документа, как-то об этом не подумала, можно указать режим записи — проведение

    Reply
  3. loradanilova

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

    Reply
  4. gutentag

    Для тестирования я установил период с 01.09.11 по 05.10.11, и выбрал «авансовые отчеты»(они у меня итак все попорядку стоят)

    ОШИБКА в типовой бух-8.2 ред.2.0,

    {Форма.Форма.Форма(200)}: Преобразование значения к типу Число не может быть выполнено

    Мах = Макс(Мах,Число(СтрЗаменить(ТаблицаНомеров[Стр].Номер,Организация.Префикс,»»)));

    —-

    …И хотелось бы начинать нумерацию с определенного номера

    Reply
  5. loradanilova

    в обработке была найдена ошибка при перенумеровании документов отбора по организации не было, обработку перезалила чуть позже,

    по поводу определенного номера: если указывать для документов период, обработка ищет максимальный номер за предидущий период и начинает нумеровать с макс+1, считаю что определенного номера не нужно выставлять, обработка сама подбирает номер корректно

    Reply
  6. echo77

    Хрень. Чем лучше других, выложенных на инфостарте?

    Reply
  7. marku

    (6) echo77, а это разве запрещено?

    Reply
  8. Поручик

    (6) Эта музыка будет вечной. (с)

    Относись к ним как к бычкам окуркам на тротуаре. Хрень, но каж

    Reply
  9. loradanilova

    Вечная тема, посмотрела на сайте подобной вещи не нашла, вот и выложила. лучше, хуже я же не на конкурс выкладываю, считаю ее удобной и простой

    Reply
  10. fishca

    (9) кто ищет, тот всегда найдет 😉

    Небольшой списочек перенумераторов

    Reply
  11. Aleskey_K

    было уже. какой смысл плодить одни и те же обработки ?

    Reply
  12. loradanilova

    Смотрела 🙂 в основном перенумераторы документов и перенумераторы справочников, а у меня универсальный :), видела один универсальный но только для 7-ки

    Reply
  13. darin44

    Для тестирования задал период с 01/01/11 по 30/06/11 выбрал док-т «Реализация товаров»(идут н епо порядку)

    ОШИБКА в БП8.2 ред.2.0,

    {Форма.Форма.Форма(200)}: Преобразование значения к типу Число не может быть выполнено

    Мах = Макс(Мах,Число(СтрЗаменить(ТаблицаНомеров[Стр].Номер,Организация.Префикс,»»)));

    …И хотелось бы начинать нумерацию с определенного номера !!

    Reply
  14. loradanilova

    тестирую, позже дам ответ

    Reply
  15. itriot11

    А почему коды через пробел, например (НФ00001 522)?В этом есть некий смысл?Поделитесь!

    В целом вроде норм!

    Reply
  16. loradanilova

    (15) itriot11, похоже недочет мой, разделитель групп у чисел надо убрать

    Reply
  17. itriot11

    Второй раз перенумеровал — пробелы исчезли!

    Reply
  18. natnat5

    Интересная обработка. Очень часто пользуюсь, просто незаменима в работе.

    Reply
  19. vovkakursk

    Супер!!!

    Reply
  20. PeaceDOS

    Если надо перенумеровать только задвоеные по коду элементы справочника — получится ли?

    Reply
  21. loradanilova

    обработка перенумеровывает весь справочник по алфавиту, так что решайте сами

    Reply
  22. alonzomozley

    Спасибо, помогла.

    Reply
  23. Мать Тереза

    Хорошо работает, только где убрать разделитель групп?

    Reply

Leave a Comment

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