Очистка значений периодических реквизитов справочников




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

30 Comments

  1. vovan519

    Универсальная обработка очищает периодические реквизиты справочников от лишних значений. Имеет три режима работы.

    1. «Свертка значений периодических реквизитов справочников на заданную дату»

    2. «Удаление дублей значений периодических реквизитов справочников»;

    3. «Удаление пустых значений периодических реквизитов справочников»;

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

    Reply
  2. Ёпрст

    У Вас нет доступа для формирования этого отчет

    Reply
  3. Pari

    Пара некритичных замечаний:

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

    — в ТиС есть как минимум 4 периодических реквизита с длиной идентификатора больше 50 символов (например, «УчитыватьОтрицательныеСуммовыеРазницыПриОпределенииВычетовП­оНДС»). Обработка на них вылетает.

    Reply
  4. Ёпрст

    ЗачОт метить документ на удаление…!

    Гы-гы…

    Reply
  5. vovan519

    (3) Насчет Гы-гы не понял.

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

    Существует много ситуаций когда это необходимо.

    Например изменение цен номенклатуры из документов (что-то вроде Документ.Переоценка). А хранить всю историю за 100 лет нет необходимости.

    Кроме этого на это есть отдельный флажок, который кстати по умолчанию «0».

    Так что, будь любезен, поясни «Гы-гы».

    Reply
  6. CheBurator

    картинки — где?

    Reply
  7. Ёпрст

    (4)

    >>>»Это понятно, что метить документы на удаление — это не всегда безболезненная процедура.»

    В типовых конфах это ВСЕГДА болезненная процедура. Назови хоть один документ в Типовой конфе, который можно «безболезненно» удалить ?

    Доверь сей инструмент кому-нить — привет котёнку.

    Reply
  8. Ёпрст

    err

    ОЧИСТКАЗНАЧЕНИЙПЕРИОДИЧЕСКИХРЕКВИЗИТОВСПРАВОЧНИКОВ.ERT(292)}: РассчитыватьВНалоговомУчетеСреднююСтоимостьОтгруже не является константой или периодическим параметром!

    Reply
  9. Abadonna

    (0) Взял да и затер в картинке путь к БД 🙁

    А у меня аж пятки чесались пойти по этому пути 😉

    Reply
  10. vovan519

    Обновил обработку.

    to 2 и 7 длину наименований справочников и реквизитов увеличил

    to 5 картинку вставил.

    to 6 Ты абсолютно прав. Но даже для типовой (ну почти типовой), обработка использовалась при нетиповой свертке.

    И отсутсвие этого функционала возможно кого нибудь разочарует. Я со своей стороны предпринял все меры по «спасению котенка»

    1. большое красное сообщение.

    2. отключение по умолчанию.

    3. пометка, а не полное удаление

    4. отчет о проделанной работе

    5. проверка названия прав. (хотя уже закомментировал, раз не понравилось в 1)

    to 2 к сожалению под рукой сейчас нет отдельно бухии или зп. Не подскажешь ли о «пару вызываемых в обработке функций гл. модуля нашел только в ТиС».

    Reply
  11. Ёпрст

    (9)

    глПроверкаДаты

    глПолучитьПолномочие

    Reply
  12. vovan519

    to 10 Спасибо. Убрал. Обновил.

    Reply
  13. Abadonna

    (10). Подтверждаю. В бухии даже близко не понятия «полномочия пользователя», оттвественно и функции. Это только в комплексухе и в её кастрате ТИС.

    А насчет глПроверкаДаты в бухии и речи быть не может, ибо там нет понятия точка актуальности.

    Оперучет там ёк, однако 😉

    Reply
  14. vovan519

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

    Reply
  15. Ёпрст

    подобное решение

    http://infostart.ru/projects/1367/

    Reply
  16. vovan519

    14 Посмотрел, да есть там «оптимизация». Ну не всем же быть Гагариными 🙂

    Да есть и еще подобные решения, например http://infostart.ru/profile/35029/projects/2231/

    Только свои тапочки и мягче и удобнее и предсказуемее 🙂 Может они и другим пригодятся. Ведь тапочки только чуть-чуть поюзанные.:)

    Reply
  17. Erne100

    Очень помогла опция «Удаление пустых значений»

    После переноса сотрудников Tranrefом из одного Камина1.2 в другой

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

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

    Сберёг кучу времени.

    Reply
  18. Pim

    Плюс, за то что не пришлось делать утомительную работу в два часа ночи.

    Reply
  19. makaorel

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

    Reply
  20. romul_666

    Спасибо за обработку! Пригодилась.. Только пришлось немного допилить — добавить работу с транзакциями…. иначе даже при работе только по одному справочнику после прохождения 120 000 элементов начинала совсем умирать…

    Reply
  21. white_ven

    спасибо

    Reply
  22. white_ven

    Допил конечно нужен был,но в целом норм

    Reply
  23. Reticent

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

    Reply
  24. irvin12345

    На маленьких базах сработала, на рабочей (>2гб периодических реквизитов) зависла на 2 минуте(На всякий случай подождал ночь, но чуда не произошло). Печально.

    ———

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

    Reply
  25. kaa79

    Спасибо за обработку! Единственное предложение — сделать возможность отключения печатной формы отчета. Т.к. для очень больших справочников получается стандартный баг с нехваткой памяти процессу 1с: ошибка Недостаточно памяти. Связано видимо с тем что до вывода на экран печатной формы — все телодвижения с таблицой накапливаются в оперативе.

    p.s. заткнулся на справочнике нормативов в старой ПУБ 7.7 в которой справочник номенклатуры под 800000 элементов.

    Reply
  26. vovan519

    23, 24 спасибо за интерес проявленный к обработке. Коли уж Вы программисты, то должны понять, что совершенству нет предела и дорабатывать любую обработку можно бесконечно. Если бы обработка содержала ошибки, я бы исправил. Неловко как то предлагать совсем сырой продукт. Но уж если разговор о мелких недочетах, то позвольте мне оставить как есть. Разработка датирована 2008 годом и уже давно притерпела изменения на моих базах. Надеюсь Вы согласитесь, что специфика у всех разная. Мои БД более 30Г, но периодических реквизитов не так много.

    ЗЫ Рассматриваю этот сайт, как сайт разработчиков для разработчиков. Т.е. всегда проще посмотреть, как сделал кто-то и взять идею или просто доработать под себя. И польза выложенного на этом сайте материала именно в этом. Еще раз спасибо за интерес. Может быть вернусь опять на этот сайт и выложу еще чего-нибудь.

    Reply
  27. kaa79

    vovan519 не принимайте близко к сердцу, отписался т.к. сам натыкался на этот трабл при обработке большого количества данных и при первом запуске этой обработки. Долго искал что отъедает память пока не понял про формирование таблицы в оперативке. На самом деле в Вашей обработке наверное это не совсем и актуально, т.к. попробовал погонять её на действующей базе — результат к сожалению не устраивает по скорости.. обрезка затянется на несколько дней. Так что буду рыть в сторону аналога на прямых запросах, обламывает, то что сабж при всех своих размерах справочников до сих пор на dbf в силу разных обстоятельств и рабочих примеров работы с 1sconst на 1cpp пока не нашел.

    Reply
  28. whtblck

    потестил. мне подошло. спасибо.

    Reply
  29. chmv

    А мне нет. Слишком долго

    Reply
  30. nick_krsk

    Спасибо, обработка очень помогла (при переносе КД добавила пустые записи в пер. реквизиты)

    Reply

Leave a Comment

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