Обработка перенумерации документов/справочников




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

34 Comments

  1. tango

    надо сразу признаваться:

    а) чем отличается от ИТС

    б) чем лучше, чем с ИТС

    с) чем отличается от других имеющих место быть

    Reply
  2. Abadonna

    (0,1) По ходу путь к звездам у семерочника начинается с перенумераторов, а у восьмерочника с консоли запросов ;))))

    Reply
  3. Abadonna

    +(2) В общем так:

    — Ваш любимый полонез?

    — Огинского

    — Ваше любимое произведение Огинского

    — Полонез

    :))))))))))))))))

    Reply
  4. tango

    кансоль эта наша вабще всё

    Reply
  5. gutentag

    Потренировался на приходниках и расходниках — понравилось 🙂

    Reply
  6. t-nex

    To: tango

    Честно сказать, никогда не видел обработку перенумерации с дисков ИТС, поэтому признаться, чем эта отличается от обработки с диска ИТС, сказать не могу 🙂

    А вот по поводу отличается от других:

    эта обработка написана на базе разработок другого человека (см. контекстное описание обработки), но добавлены следующие возможности:

    — перенумерация сразу всех справочников и документов

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

    Вот 🙂

    Reply
  7. XLstarter

    работает, но хотелось бы только изменить префикс, не меняя номера. Получить существующий префикс из базы и заменить на новый (например для расходной накладной) с возможностью сдвига (например ближайший ноль к последней букве префикса заменить на букву) — Было ПП-0000123 Стало ППШ0000123 либо ППШ-000123

    Reply
  8. Khaliff

    перенумерация кодов в справочнике Номенклатура делает?

    чем это чревато? в документах хранятся коды товаров и получается, что все документы уже не будут отображать нужные товары, которые в них были?

    или всё же использование этой обработки не повредит целостности данных

    (ссылки останутся правильные)?

    Reply
  9. Душелов

    Изменение наименования и кода никак не влияет на ссылку, если только в коде явно не прописано «НайтиПоКоду»…

    Reply
  10. ChugaevArtem

    Работает… Искал,искал… и нашел именно то, что мне нужно было!!! Самому уже совсем ничего писать не хочется… СПС за обработку! Просто это действительно вещь стоящая, не то что мне попадались… грохнутые…. недописанные…

    Reply
  11. gutentag

    Обработка то что надо.

    Спасибо! Помогло!

    Reply
  12. wazup

    Спасибо! Отлично перенумровалось!

    Reply
  13. Helena_Byron

    Спасибо! то что надо!

    Reply
  14. k@tush@

    какой перенумератор скачать для 1с предприятие 7.7 виста!

    Reply
  15. CheBurator

    (15) любой!

    Reply
  16. k@tush@

    а порядок куда дальше этот файл вставить не подскажите? я сделала следующее:

    скорировала этот файл в базу в папку ExtForms

    потом зашла в 1с сервис-доп.возможности

    выбрала внизу кнопку «изменить» -> «внести в список»

    там этого файла нет. что-то не то сделала?

    Reply
  17. k@tush@

    а все справилась. спасибо ))

    Reply
  18. brr

    Не работает в случае если справочник подчиненный

    Reply
  19. Snegir

    а на 8,1 можете сделать?

    Reply
  20. Snegir

    прошу прощенья, нашла 😀

    Reply
  21. Vseslovur

    ЗафиксироватьТранзакцию();

    {\…..EXTFORMSSDRENUM.ERT(471)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию

    Reply
  22. Tp9lcorycka

    перенумерацию за период не делает, сразу за весь год. если бы не копия-хана бы базе! 😮

    Reply
  23. rovix

    Ещё трабла:

    Есть документ с числом номеров в номере документа 5

    Нумерация документа была без периодичности и подошла уже к 99999

    Последние есть, но нет уже в базе первых.

    Что думалось произойдёт — документы станут с номера 1 и до сколько их там сейчас в базе

    Вышло — ошибка транзакции, почему — вначале обработка пытается задать номера 100001 и т.д..Естественно, 1С не дала задать такие номера документам.

    Reply
  24. sergey_irk

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

    Reply
  25. alex_fursov

    Обработка помогла, единственное я сначала выбрал все справочники и все БИКи банков у меня заменились на порядковые номера.

    Reply
  26. chukait

    Спасибо.Отличная вещь

    Reply
  27. serezhka87

    Спасибо. Хорошая вещица. Должна пригодится. Бухи часто портят нумерацию.

    Reply
  28. irishen

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

    Reply
  29. Пуд

    Хорошая обработка,но нужно быть внимательным при выборе объектов, чтобы не захватить те, где номера имеют значение — вроде РТУ или СФ.

    Reply
  30. uhuh

    Как увидеть хотя бы скриншот. Была у меня хорошая обработка, но скачана еще до введения внутренней валюты, а теперь качаю не глядя все подряд…

    Reply
  31. Lava596

    Мне понравилась обработка, пригодилась, спасибо =)

    Reply
  32. chorochol

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

    Reply
  33. v.a.ryag

    мне нужно поменять нумерацию чтобы проставились новые префиксы.. Поможет?)

    Reply
  34. kotenok17_90

    Спасибо! То что нужно нам было. Бухгалтера совсем а то с ума сходят, постоянно сами ручками номера меняют, а потом жалуются, что у следующего документа номер левый.

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

    Reply

Leave a Comment

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