Перенумерация (восстановление нумерации) объектов




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

47 Comments

  1. Sintson

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

    Возможности:

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

    Справочники: возможность установить префикс, обработка производится в порядке старой нумерации с заданием нового номера (для исключения ошибочной ситуации).

    Полная поддержка нумераторов у документов и серий кодов у справочников.

    Перейти к публикации

    Reply
  2. kochurov

    От стандартной чем отличается?

    Reply
  3. Sintson

    Я ее в глаза не видел 🙁

    Reply
  4. an77

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

    Reply
  5. Sintson

    Сработает.

    Reply
  6. an77

    (4) Попробовал. Если два документа под одним нумератором, то перенумерация работает в пределах одного (выбранного) документа. Сквозной нумерации по двум типам документов к сожалению нет.

    Reply
  7. Sintson

    А, вон Вы о чем, я подумаю как это можно организовать.

    Reply
  8. Sintson

    (5) Обработку доработал и перезалил, теперь работает сквозная нумерация в документах на одном нумераторе и серии кодов в справочниках.

    Reply
  9. grigr

    стандартная это, но без фишек

    УниверсальныеПодборИОбработкаОбъектов.epf

    Reply
  10. Sintson

    (8) Спасибо за наводку, не знал про существование стандартной обработки.

    Reply
  11. Sintson

    (1) Кстати, выяснилось что стандартная не знает про нумераторы и серии кодов. Вот так.

    Reply
  12. 84kg

    а не подскажите как сделать так чтобы нумерация дальнейших документов продолжалась с последнего перенумерованного?

    Reply
  13. Sintson

    (11) При помощи моей программы — к сожалению никак.

    Для Вашего случая я думаю проще набросать одноразовую обработку. 🙂

    Reply
  14. Tristania

    Спасибо!Очень удобно!

    Reply
  15. Кос

    А где брать стандартную обработку?

    Reply
  16. gavrikprog

    еще один велосипед

    Reply
  17. Sintson

    (14) можно найти на диске ИТС называется «Универсальные подбор и обработка объектов»

    (15) кому — как…

    Reply
  18. yokbuh

    (11) такая же задача,

    и смысл обработки если последующие не будут продолжать новые данные?

    Reply
  19. Sintson

    (17) После восстановления нумерации, система самостоятельно продолжает нумерацию объектов, если в настройках объекта стоит флаг «Автонумерация».

    Обработка тут ни при чем.

    Reply
  20. yokbuh

    (18) У нас получилось по другому, после перенумерования, продолжило автонумерацию с каких то предыдущих номеров, а не с последнего полученного от обработки. Но это не эта обработка а стандартная из ИТС. но я так понял разницы нет.

    Reply
  21. Sintson

    (19) Думаю да, попробуйте запустить сервисные обработчики, вроде тестирования и исправления, может поможет…

    Reply
  22. sergeika8

    Спасибо!Добавляю плюс

    Reply
  23. AzagTot

    Спасибо! Плюсую…

    Reply
  24. Sasha25

    А можно эту обработку посмотреть avangardplus@rambler.ru

    Reply
  25. Sasha25

    Я думаю вещь нужная

    Reply
  26. lux17

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

    Reply
  27. Sintson

    (25) Поможет, только Вы уж сходите до справочника Организации и предварительно вытрите префикс там, если он есть, и своих сотрудников поругайте за то что такие вот глюки в номерах ручками делают :).

    Reply
  28. Natacia

    Можно глупый вопрос? Я скачала файл, куда мне его нужно установить чтобы в программе это работало? Я не разбираюсь в подобных вещах.

    Reply
  29. Sintson

    (27) Три варианта (по мере сложности)

    1) Открываете 1C в режиме «Предприятие», открываете скачанный файл через меню Файл/Открыть

    2) Регистрируете скачанный файл в справочнике внешних обработок

    3) Открываете 1С в режиме «Конфигуратор», вставляете в дерево конфигурации скачанный файл, после обновления базы обработка будет доступна через меню Операции/Обработки

    Reply
  30. Natacia

    СПАСИБО!

    Reply
  31. Fuego

    неудобная весчь.

    с Новым Годом

    Reply
  32. Sintson

    (30) Ну если уж минусы раздаешь, обоснуй, что не понравилось, обоснованная критика всегда приветствуется, в отличии от тро-ло-ло!

    Reply
  33. Fuego

    (31) например, хотя бы это:

    1.нужно было исправить нумерацию в текущем году. Это невозможно.

    2.В одной базе есть документы по нескольким организациям — префиксы нужны разные. За один проход этого не сделаешь этой обработкой.

    3.Несколько документов могут быть связаны одним нумератором — здесь это не предусмотрено.

    Reply
  34. Fuego

    кстати, по поводу продолжения нумерации с новых номеров. Если я не ошибаюсь, метод есть для сброса данных счетчиков: ОбновитьНумерациюОбъектов()

    Reply
  35. Sintson

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

    Все там предусмотрено с одним нумератором на несколько объектов, читайте описание, не верите, — открываете код и смотрите на реализацию.

    ОбновитьНумерациюОбъектов() сбрасывает внутренний счетчик внутри одной сессии.

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

    Reply
  36. chp13

    спасибо

    Reply
  37. Fuego

    (34)

    >> Обработка не писалась под конкретную конфигурацию, был прицел на универсальность

    Для универсальности есть методы проверки наличия каких-либо объектов в метаданных. Т.е. можно проверить наличие справочника «Организации», проверить наличие в нём реквизита «Префикс», добавить выпадающий список со значениями из базы.

    >> ОбновитьНумерациюОбъектов() сбрасывает внутренний счетчик внутри одной сессии.

    А где об этом сказано? Как-то не вяжется с этим высказыванием фраза из описания «Данный метод разрешено вызывать только администратору системы».

    >> открываете код и смотрите на реализацию

    Открыл, посмотрел. Ничего хорошего там не увидел. Очень удивился произвольному типу в реквизитах «Период», «Вид справочника» и «Вид документа». Вообще, обработка сделана из вон рук. Мелочам нужно уделять больше внимания.

    Reply
  38. Sintson

    (37) над ответом целый год думал?

    Открыл, посмотрел. Ничего хорошего там не увидел. Очень удивился произвольному типу в реквизитах «Период», «Вид справочника» и «Вид документа». Вообще, обработка сделана из вон рук. Мелочам нужно уделять больше внимания.

    Прошу прощения, с Вами забыл посоветоваться…

    PS

    Корона не жмет?

    Reply
  39. Sintson
    Для универсальности есть методы проверки наличия каких-либо объектов в метаданных. Т.е. можно проверить наличие справочника «Организации», проверить наличие в нём реквизита «Префикс», добавить выпадающий список со значениями из базы.

    Не захотел, — имею право как разработчик.

    Reply
  40. artem666

    Чем отличается от Групповой обработки объектов ?

    Reply
  41. Sintson

    (40) Всем, читайте описание. 😉

    Reply
  42. bes-kkm

    Ошибка загрузки документа .Внешняя обработка не может быть прочитана текущей версией программы.

    Reply
  43. Sintson

    (43) Какой версией программы открываете?

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

    Reply
  44. lesenoklenok

    Спасибо за обработку, периодически очень нужна, особенно если собьется нумерация кассовых документов. Но нумерацию Кассовых документов не смогла восстановить почему то :(. Буду смотреть по ходу кода что не так.

    Reply
  45. Sintson

    (45) Давайте помогу, что пишет?

    Reply
  46. DrAku1a

    Тем, кто сюда забредёт в поисках решения, и если перенумерация не помогла, документы по-прежнему нумеруются как попало.

    Процедура глобального контекста: ОбновитьНумерациюОбъектов

    (источник)

    Reply
  47. compaudit

    (47) не помогает, ничего не меняется после ОбновитьНумерациюОбъектов

    Я переименовал кривые документы чтобы они выглядели не как последние если сортировать по номеру

    Запустил ОбновитьНумерациюОбъектов, создал новый документ, сам указал там нужный мне следующий номер.

    Создаю новый документ, опять не та нумерация.

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

    Reply

Leave a Comment

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