Перенумерация документов (для v8)




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

36 Comments

  1. Dr_DelProg

    Конечно, есть задумки воткнуть туда отбор через построитель отчетов, но пока нет вдохновления, и особой надобности… Кароче, если кому-то надо будет универсальный отбор, подумаем как это сделать.

    Reply
  2. tango

    + за упорство при взятии бухареста

    Reply
  3. Arbi

    Спс)))

    Reply
  4. Dr_DelProg

    Хэхэх 🙂 Голоса посыпались — отчетный период пришел 🙂

    Reply
  5. Inuki

    Запрос.УстановитьПараметр(«ДатаКонца», ДатаКонца); — при том что состав даты — «Дата».

    Reply
  6. Likusia

    а можно воткнуть изменение длины номера??

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

    смены префикса при этом не достаточно

    Reply
  7. Dr_DelProg

    На выходных постараюсь найти время, подправлю.

    Reply
  8. Dr_DelProg

    Обновил — наслаждайтесь.

    Reply
  9. cucuruza

    От всей души — спасибо! Избавилась от кучи проблем.

    Reply
  10. lex872

    Обработка очень понравилась, но Нашёл ошибку…. Если префикс заканчивается на цифры, например Б52 то нумерация будет такого типа: Б0000000521

    Пожалуста, исправьте этот косяк. Обработка просто супер!!!!

    Reply
  11. qwertyman

    Косяк с префиксами 🙂 если префикс 0010000000, то часть номеров с одноцифровым значением будет иметь префикс 001, а с двухцифровым 01, трех 1, что косяк. Выглядит так: 0010000000, 0010000001…0010000009, 0100000010, 0100000011.. 1000000111.

    Reply
  12. qwertyman

    А все почему так получилось? дело в функции ПолучитьСтроковыйНомерБезПрефиксов(Номер) в ней пытаются определить, какая часть строки префикс, а где номер (что глупо, потому что префикс и так известен). Но устроена это функция только с учетом того, что префикс состоит только из букв, что естественно не так. Поэтому и страдают пользователи с префиксами типа «001» и «Б52». Я у себя этот баг исправил, спасибо автору за проделанную работу, я использовал. Влом самому с нуля писать. 😉

    Reply
  13. Dr_DelProg

    По данным конференций для партнеров, по крайней мере версия платформы 8.1.5 не поддерживала числовые префиксы. Префиксы должны состоять из букв и спецзнаков.

    К тому же, смысл числового префикса непонятен.

    Например, номер: Б5200000001, где префикс мы хотим видеть Б52 и номер 1, по своему смыслу тоже самое что префикс Б и номер 5200000001. Этим путем и нужно будет идти. Но на таких номерах обработочка что-то неработает.. поправлю на днях.

    Reply
  14. Dr_DelProg

    (12) Ну, в общем тоже можно.

    Reply
  15. Likusia

    а у меня чего-то при смене длинны номера (номер с префиксом МК) нумерация начинается с 1 ) с чего бы это (я что-то не то делаю? или как? )

    т.е.

    задаем префикс МК, начать с номера 43, период с 01.05, длина номера 9. Обработка радостно сообщает вправом углу начальный номер МК0000043……и бодро перенумеровывает с МК000001 )))

    Reply
  16. Dr_DelProg

    Подредактировал. Выявленные проблемы зафиксил.

    Reply
  17. A_kryl

    зачем прерывание при неуникальности номера то? пусть добавляет единичку и пробует следующий…

    Reply
  18. Dr_DelProg

    Обработка должна обеспечивать последовательную перенумерацию в заданном (выбранном) периоде. Если это невозможно — она прерывается, дальше пользователь сам решает что делать — брать больший период для перенумерации или исправлять проблемные номера вручную.

    Reply
  19. kassir22

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

    добНайденный.Записать(РежимЗаписиДокумента.Запись, РежимПроведенияДокумента.Неоперативный);

    по причине:

    Не уникальный номер документа

    Reply
  20. Dr_DelProg

    Как бы вот взяться на 8.2 ее портировать… Под управляемое приложение.

    Reply
  21. Hantinka

    Обработка понравилась и сегодня в очередной раз пригодилась! А то любят мои коллеги вручную номера менять зачем-то… 🙂

    Reply
  22. anig99

    (21) поставьте запрет на редактирование номера

    Reply
  23. Dr_DelProg

    (22) В типовых запрет только через конфигурирование на такие вещи может поставиться, на сколько я помню.

    Reply
  24. Marysia

    Удобная обработка, но если уже начали исправлять в ручную, то ругается на не уникальность и вылетает — что очень огорчает.

    Reply
  25. Dr_DelProg

    (24) А пример последовательности документов, где происходит вылет можете привести? Можно нажать правой кнопкой в списке документов и нажать «Вывести список», и прикрепить список к сообщению. Имеют значение только дата и номер документа.

    Reply
  26. avavadim

    Спасибо за труд…

    Reply
  27. gavrikprog

    Так и не понял зачем этот велосипед…

    Есть обработка Универсальный подбор и обработка объектов. Делает все тоже самое

    И качать необязательно.

    выбор вида документа;

    отбор по организации;

    отбор по периоду;

    автоматическое определение последнего номера предыдущего периода (если предыдущий период не лежит за пределами периода нумерации);

    установка и автоопредление префикса при смене организации, в т.ч. с учетом префикса базы;

    отбор по организации — да

    отбор по периоду — да

    Еще куча разных отборов — да

    автоматическое определение последнего номера предыдущего периода — тут в журнале отсортировать, делов минута

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

    Перенумерацией обычно занимаются не дятлы

    Reply
  28. slas

    спасибо очень пригодилась

    Reply
  29. courageous

    Отличная обработка! не раз уже выручала.

    Reply
  30. Reticent

    спасибо, ещё на 8-ке бы её переделать, а так выручала

    Reply
  31. Hantinka

    (30) Reticent, данная обработка и так для 8-ки

    Reply
  32. Hantinka

    (22) anig99, не хочется тормошить лишний раз конфигуратор. Номер и так не очень просто меняется: только после проведения дока и с кучей предупреждений. Но товарищи коллеги обладают неограниченным упорством.

    Поэтому ещё раз хочу сказать спасибо за столь полезную обработку! )

    Reply
  33. ol121314

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

    Reply
  34. puzanov1973

    Нормальная вещь — пригодилась 🙂

    Reply
  35. makas

    Спасибо, как раз такая обработка нужна!

    проверил на БП 2.0.54.13

    Reply
  36. Hantinka

    Хотелось бы добавить, что работает отлично даже на украинских конфигурациях

    Reply

Leave a Comment

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