Перенумерация документов v8.1 v8.2




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

    начать минусовать перенумераторы, что ли? или пусть цветут все цветы?

    Reply
  2. GoodWinSpr

    1) я не нашел в «топе поиска» такого нумератора, почемуто все пытаются «вытащить» префикс в шапку, и по периоду мне год, по повторяющемуся номеру дают отказ, ошибку и т.д.

    2) считаю что номер должен вставать не от отредактированого префикса, а «по умолчанию», тк в дальнейшем, при создании в этом периоде новых доков, нумерация собъется на стандартный префикс

    Reply
  3. Alav

    Ну и чем групповая обработка справочников и документов не нравиться?

    Reply
  4. GoodWinSpr

    Тем что там нет восстановления нумерации…

    Reply
  5. anig99

    (4) зато есть в Универсальном подборе и обработке объектов ИТС

    Reply
  6. GoodWinSpr

    (5) Да есть, но там перенумерация идет 1) независимо от помеченных на удаение/не проведенных 2) при использовании отборов выпадает «Повтор номера:…» … здесь проще…

    Reply
  7. anig99

    (6) это как отбор настроишь. Перенумерацию тупо можно 2 раза запустить

    Reply
  8. Alav

    (4) Есть там. Удаляешь номер и он автоматом присваивает следующий

    Reply
  9. KEVE

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

    Reply
  10. GoodWinSpr

    (9) если желаемы период то будут косяки с повторяющимеся номерами

    (7) , (6) , да кстате можно 2 раза и поигратся с отбором, не подумал как-то… а тут одну кнопку нажать….

    Reply
  11. KEVE

    Но чтобы не было задваивающихся номеров при указании периода указывать с какого номера начинать нумерацию. Эта идея была у инфостаровцев по 7-ке

    Reply
  12. Yashazz

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

    Reply
  13. grum01

    пользуйтесь типовыми обработками! и удобнее и функциональнее.

    это — крайне неудобный бред. Целый год!

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

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

    это дисциплинирует сотрудников.

    Reply
  14. artmicro

    (0) В перенумерации стоит отталкиваться не от периода «год», «месяц» … а от периодичности номера документа который перенумеровываешь, иначе толку с твоей перенумерации никакого 😉

    Reply
  15. Sheron

    Спасибище огромное!!!!! Как здорово что есть такие умнички, которые так здорово помогают нам, бедным бухгалтерочкам, в нашей работе!!!!!!

    Reply
  16. Petrel

    Отлично! А то для 8.2 так до сих пор никто и не удосужился что-либо удобоваримое сделать.

    А тут — шик, блеск, красота! Раз — и РКО готовы, два — и ПКО, три — и все Авансовые по порядочку…

    grum01 пишет:

    пользуйтесь типовыми обработками! и удобнее и функциональнее.

    это — крайне неудобный бред. Целый год!

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

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

    Reply
  17. Lostris

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

    Reply
  18. bonni80@mail.ru

    Перенумератор рулит 🙂

    Reply
  19. revril

    спасибо за обраюотку)))очень помогла))

    Reply
  20. Seacobra

    Обработка полностью рабочая. Спс.Рекомендую

    Reply
  21. ivvlpe@gmail.com

    Версия 8.2 не желает работать. Пишет — «Слишком много документов»

    Reply
  22. jigan75

    Спасибо, в 8.2 у меня работает без проблем.

    Reply
  23. KostyaBu

    Обработка работает на 8.2 префиксы понимает.

    Reply
  24. kixaka

    Спасибо. самая используемая обработка.

    Reply
  25. Lea15

    спасибо, помогает

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

    Reply
  26. mgkbuh

    Спасибо, пользуюсь — очень нравиться.

    Reply
  27. Lokon

    В общем, эта обработка позволяет обрабатывать справочники и документы. Плюс есть довольно хорошая система отбора нужных объектов. Чем-то эта обработка похожа на стандартную «Групповую обработку справочников и документов». В чем-то она даже её превосходит, в чем-то — наоборот уступает.

    Вот, в частности можно перенумеровать элементы какого-либо справочника или документы определенного вида (в том числе с установкой префиксов и т.д.). Можно пометить на удаление, а можно непосредственно удалять объекты. Ну и такая полезная штука есть, как Произвольный алгоритм. Т.е. можно написать небольшой код обработки на встроенном языке 1С (прямо в режиме 1С Предприятие).

    Reply
  28. andy77777

    Перенумеровываю ПКО в 8.2 Бухгалтерии, релиз последний типовой.

    Пока документов было меньше 10000 — работала нормально обработка.

    Сейчас больше 10000 — зависает в конце первого цикла.

    Прерываю выполнение, смотрю, что в базе: документы ПКО начинаются с номеров я_+00001, доходят до 1000 и появляется пробел я_+1 001 и .т.д до я_+9 999 (с пробелом перед последними 3-мя цифрами), далее идут родные номера по порядку 00000010578 и т.д.

    Т.е. обработка зацикливается, ей номера не хватает, т.к. есть пробел в строке.

    Можете исправить?

    Reply
  29. jobkostya1c8

    Вот для простенькой задачи экстренно «перенумеровать 20 документов с начала 2015» справилась на ура. Пишут что миллион перенумераторов, но этот попался первым. Стояла задача даже поменять префиксы документов с начала года и +к этому сбой нумерации. Конечно, префиксы поменялись при работе перенумератора от срабатывания подписки на событие ПриУстановкеНовогоНомера(<СтандартнаяОбработка>, <Префикс>)

    Пытался быстро подправить — бесполезно. Как-то сильно перегружен.

    Сейчас вот вопрос — нужно ли под управляемую форму «такой».

    Reply

Leave a Comment

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