Перенумерация документов, справочников (8.1)




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

24 Comments

  1. anig99

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

    Reply
  2. KukA.5

    Не судите строго — делал для себя после «натягивания» на переписанную конфу типовой — слетела нумерация у многих справочников (и как потом выяснилось и у кучи документов тоже).

    Reply
  3. KukA.5

    Согласен, универсальная обработка закрывает по функционалу то, что я сделал. …Я ПРО НЕЕ ПРОСТО НЕ ЗНАЛ 🙂

    Иногда проще написать, чем искать 🙂

    Спасибо за комментарии (и конструктивную критику)

    Reply
  4. Evg-Lylyk

    «Иногда проще написать, чем искать», а иногда проще найти чем писать. На поиск времени много не уйдет, но вы удивитесь как тут много всего на эту тему. поиск.

    Две внешних обработки то зачем O_o в одной можно сделать

    Еще не понятно зачем ставить заранее спр. Контрагенты… т.к. если в конфе нет справочника контрагенты (да такие бывают 🙂 ошибка при нажатии на выполнить

    Reply
  5. анфиска

    рАССКАЖИТЕ, А КАК ЭТО РАБОТАЕТ???

    Reply
  6. KukA.5

    Дорогая «анка», работает эта штука так:

    1)выбираем какие типы объектов будем обрабатывать…

    2) обработка запросом получает все объекты (выбранного типа метаданных) «по росту» (в порядке возрастания номеров), и создает у них новый номер (с учетом длины номера в конфигурации у данного объекта метаданных). Если указан префикс, то он присутствует в номере.

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

    **) на самом деле на диске ИТС действительно есть шикарная обработка по групповому изменению документов и справочников — по функционалу она достаточна, чтобы на эту тему уже ничего не писать. Когда я делал эти обработки, я про нее просто не знал.

    Всем удачи! …и спасибо за плюсики 🙂

    Reply
  7. nadyulya

    обработка проста, эффективна и удобна в использовании. Спасибо

    Reply
  8. zartana

    Спасибо огромное, полезная вещь, даже просто жизненно необходимая !!!!!

    Reply
  9. KukA.5

    (7) (8) спасибо за теплые слова

    Reply
  10. volna

    Отлично. При переходе с 7 на 8 помогли. Большое спасибо.

    Reply
  11. vde69

    Немного покритикую

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

    2. Грязное формирование текста запроса (замена имени таблицы далее по коду). Все равно при использовании в конфигурации, где нету «ПоступлениеТоваровУслуг» конструктор не схавает, а читабельность пострадала.

    3. Обработка позиционируется как «Универсальная» а в ней по умолчанию предлагается перенумеровывать документ «ПоступлениеТоваровУслуг». Должен быть выход а не попытка перенумерация этого документа.

    4. Предупреждение об использовании по умолчанию идет с таймаутом и без возможности отказа, то есть если я нажал кнопку и появилось предупреждение – то это равносильно табличке перед взрывом «сейчас будет БУМ», нужно использовать «Вопрос». (это критическая ошибка)

    5. На форме 2 поля, текстовое и выбора документа, гораздо проще и понятнее было бы сделать 1 список значений.

    6. Не работает с числовыми номерами документов

    7. Не работает с последовательностями по префиксам, а все сводит в одну кучу (к единому префиксу).

    Удачи.

    Прими мою критику как профессиональную поддержку коллеги по программированию.

    Reply
  12. KukA.5

    (11) Дима, как же тебя зацепила моя критика твоей перенумерации…. что ты, отказавшись от 31 (!) плюсика, снял ее с публикации 😀

    Согласен, такое творение-позорище явно их не стоит 😀

    http://infostart.ru/public/14567/ — «Публикация не активна» 😀 😀 😀

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

    То что мне не понравилось в твоем (11) комментарии:

    «…2. Грязное формирование текста запроса …» — это базар, за которым ты не следишь. Ты не владеешь техникой формирования/модификации текста запроса методом замены отдельных фрагментов, в решениях 1С это используется часто и это не только грамотно, но и удобно.

    «…обработка имеет реквизиты, за чем они нужны, остается полной загадкой..» — это и есть переменные (на время существования обработки как объекта), они доступны для всей обработки из любого ее места, мне так удобно.

    …все остальное — это сопли обиженного мальчика, которого ткнули в его же (извини) говнокод.

    Ты выдаешь реакцию по типу «…а вот ты, а вот ты… ВОТ!» 😀

    Reply
  13. vde69

    (12)я не снимал ее с публикации, и мне наплевать на рейтинги и прочее. (или кликнул случайно, или это администрация. По крайне мере я ее востановил)

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

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

    удачи!

    Reply
  14. KukA.5

    Бывает профессиональная критика (специалистов) — она ценна и полезна, потому что помогает увидеть новые аспекты проблемы или ее решения, а бывает …то что тут писал (в моей ветке) vde69

    Reply
  15. АллаБух

    Мне нужно изменить инвентарный номер ОС. Где найти обработку?

    Reply
  16. avrage

    Частично повторяет функционал

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

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

    Reply
  17. VolNat

    А у меня ПеренумерацияСправочников не запустилась. Вежливо послал со словами «не может быть открыта текущей версией программы». Конфигурация Зарплата и кадры бюджетного учреждения, релиз 16, платформа 15. 🙁

    Reply
  18. SerjVzM

    Удобно и быстро! Спасибо)

    Reply
  19. CyberPank_kmv

    Спасибо. Круто

    Reply
  20. PEDuCKA

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

    Спасибо!

    Reply
  21. revril

    спасибо автору)))очень пригодилась обработочка)))

    Reply
  22. _Тома

    Возникла необходимость срочно перенумеровать документы (у предыдущего бухгалтера нумерация была сбита, цифры вперемешку с буквами). Имеется в виду Бухгалтерия 8.1. Была большая надежда на обработку с диска ИТС. Но после ее отработки во-первых, вылетели ошибки, часть документов не перенумеровалась совсем, а у части номера пошли невменяемые — с девятками в первых позициях. Вся надежда на Вашу обработку!

    Reply
  23. yalo

    Да, если диск ИТС отсутствует, то ваша обработка придет на помощь ).

    Reply
  24. kot_stouk

    Обработка справочников не работает! (не перенуверовывает)

    Reply

Leave a Comment

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