Очистка файлов сохраненных значений пользователя (1cv7.cfg)




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

64 Comments

  1. sCHTASS

    Товарищ, а расскажите, как сумели засунуть в обработку др. обработку и библиотеку? Оч. интресно знать.

    Reply
  2. maljaev

    (1) На самом деле там даже 2 уровня вложенности. В сумме portable-пакет состоит из 5 вложенных обработок и 1 библиотеки. Процесс засовывания/высовывания довольно подробно разжеван мной здесь: http://infostart.ru/profile/1782/projects/600/

    Reply
  3. Shaman100M

    Да, просто конфетка, супер. А можно расширить функционал? Думаю, что более востребованной функцией будет не очистка чего л. в файлах параметров пользователей одной ИБ в целях экономии пространства, а запись нового / изменение значения старого параметра (ну, например, простейшая замена значения сохраненной переменной) для нескольких однотипных ИБ и для всех пользователей.

    Reply
  4. maljaev

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

    Reply
  5. JohnyDeath

    Прям красота какая-то! +1

    Reply
  6. maljaev

    (3) Забыл добавить: обработку нескольких баз одновременно считаю нецелесообразной, больше усложняющей и загромождающей работу с обрабокой. При работе с одной базой можно скажем установить единое значение параметра всем пользователям сразу, а вот при работе с несколькими базами — не всегда — если значение представляет собой ссылочный тип «справочник», «перечисление», «документ» и т.д.

    Reply
  7. vasilykushnir

    Первое впечатление — ОТЛИЧНО! Еще поковыряю — мож замечания появятся….

    Reply
  8. support

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

    Reply
  9. maljaev

    (8) Насчет названия — может быть. Я сам уже в терминологии запутался немного, надо причесать свои мысли и текстовки.

    А вот насчет цели использования… Сейчас приведу простой пример.

    Есть у меня клиент, который давненько ведет учет в единственной локальной базе «Бухгалтерский учет». Засчет разрастания файла 1cv7.cfg открытие/закрытие некоторых окон достигает нескольких минут. Лично мне надоело ждать каждый раз по 5 минут, пока откроется окно «Регламентированные отчеты», во время моих сеансов к клиенту, а уж клиенту-то как надоело… В конце концов сделал в базе еще одного пользователя, с пустым 1cv7.cfg. На нем база разумеется летала. Сказал клиенту — хотите быстро — заходите под новым пользователем. В результате обнаруживаю что продолжают пользоваться старым. На вопрос — почему — узнаю что слишком много различных настроек теряется под новым пользователем — это и различные сохраненные каталоги, и настройки отчетов/обработок, настройки документов/справочников и т.д. Все это восстановить клиенту геморно, а я уж и подавно не знаю всего того чем он пользуется. Вот потому-то тупое удаление файла 1cv7.cfg (равно как и создание нового пользователя) чревато негативными последствиями, хотя и решает проблемы скорости. Выборочное удаления части параметров из файлов 1cv7.cfg решает проблему скорости и в то же время сохраняет все настройки, кроме деактивированных (да и деактивированные можно в любой момент восстановить).

    Reply
  10. maljaev

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

    Reply
  11. PeRom

    Работает! и отлично работает 🙂

    Reply
  12. Noy

    Очень полезная вещь!

    Reply
  13. Abadonna

    (8)>вот название у нее непонятное

    А ведь прав! Переобзови на что-нить типа «Оптимизация структуры файла 1cv7.cfg»

    Reply
  14. support

    «Редактор значений пользователя в 1С7.7»

    Reply
  15. vasilykushnir

    Я вижу здесь уже открыт конкурс на лучшее название… 🙂

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

    Вот если объединить (13) и (14), то просто и лаконично: «Редактор cfg».

    Reply
  16. vasilykushnir

    Чем проще название, тем легше в поиковике найти, ИМХО.

    Reply
  17. maljaev

    Я сегодня добавлю возможность редактирования самих значений, и пересмотрю всю терминологию как в самой обработке, так и в описаниях и названии. Хотелось бы, чтобы с одной стороны название отражало основной функционал обработки, с другой стороны было доступно для осознания простым пользователям, не знакомым с механизмом хранения значений 1с. Поэтому просто «редактор 1cv7.cfg» не подойдет — многие просто не поймут для чего его нужно редактировать.

    Reply
  18. vasilykushnir

    (17) Давай рассуждать лигически (я ж никогда не пьянею :-)): Если не поймут для его нужно редактировать, то и нафиг им этот иструмент? Это же как обезъяна с гранатой: фиг угадаешь где уронит…

    Reply
  19. Abadonna

    (17) А зачем: как раз перенеси в описание сво

    Reply
  20. Abadonna

    +(19) блин, нажал что-то…

    свой пост (9)

    Reply
  21. vasilykushnir

    (17) А ведь Абадонна дело говорит. Пост (9) действительно многое проясняет.

    Reply
  22. Abadonna

    +(19) А что сейчас наваял в описании переноси в readme — ему там самое место 😉

    Reply
  23. CheBurator

    ООО!! зачетная вещь, давно такую хотел — просто чтобы была! и сделано аккуратно!

    зачет несомненный!

    Reply
  24. ibm2007

    Сделано профессионально !!!

    Reply
  25. jhfrek

    Молодец! Вещь!

    Я как раз об этом думал, на днях поискать подобную программулину если она вообще есть.

    Как раз вовремя сделал.

    Надо будет почистить свою базу после моих экспериментов по сохранению значений.

    И естественно плюс за это.

    Reply
  26. svsrus

    Просто здорово. Причем полезность обработки, лично для меня, является сомнительной, а вот способ реализации мммм… +

    Reply
  27. Ёпрст

    (25) Падобные обработки были, просто никто не доводил их до ума, как автор этой…

    Reply
  28. vasilykushnir

    (26) Вот Именно! — способ реализации. Добротно сработано и прав (27) — пример того, как надо имено «доводить до ума», а не полуфабрикат выкладывать.

    А не захвалим ли мы автора (хоть и есть за что)? Надеюсь звездной болезнью он не болеет… А всеръез: действительно очень качественная работа.

    Reply
  29. maljaev

    (28) звездной болезнью я уже переболел, пока тусовался на проклабе, так что это мне точно не грозит. А так по жизни я вообще много времени уделяю интерфейсу и юзабилити. Возможно в этом моя ошибка — очень много времени уходит на вылизывание работ. Вот жена моя сильно не заморачивается — ляпает как на конвейере, на интерфейс вообще кладет, о юзабилити наверно и не слышала. В результате пока я 1 клиенту конфетку мастрячу, она 5 обслужить успеет, если правда сам алгоритм не сложный. Продуктивность жены выше, а оценить красоту решения не каждый клиент может, тем более качественная реализация получается дороже. Это хорошо, когда обработка бесплатная, а когда за аналогичные решения с вас попросят 2000 и 5000 — вы какое выберете? Но по-другому я писать не могу…

    Reply
  30. Шёпот теней

    МАСТЕР!!!

    семь футов под килем — 10 плюсов за разработку

    воооОооот моё мнение…

    Reply
  31. Abadonna

    (29)>я вообще много времени уделяю интерфейсу и юзабилити

    Полный одобрямс 😉

    Reply
  32. cabat

    пока не смотрел, но так как видел, откуда выросло :), уверен, что вещь качественная!

    Reply
  33. NoMax

    Потребовалось для работоспособности установить scriptru и scriptru_5.7_sp3_rereg.

    Reply
  34. maljaev

    (33) Винда 98 что ли? Необходим Windows Script Host 5.6, он даже для работы машиночитаемых форм необходим. Обычно на WinXP и Win2000 уже стоит. Если вдруг по каким-то причинам не стоит, то надо скачать и поставить, это как бы из разряда musthave. Например с сайта ГНИВЦа (http://www.gnivc.ru/Document.aspx?id=1017) — файл по ссылке «Доп_системные_средства_MS98-2000_Печать_НД_с_PDF417». Или ищите на сайте мелкософта или в нете файлы «WindowsXP-Windows2000-Script56-KB917344-x86-rus.exe» или «WindowsServer2003-Script56-KB917344-x86-rus.exe» или «Windows9x-Script56-KB917344-x86-rus.exe». Но повторяю, это если еще не стоит, мелкософт сейчас во все дистрибутивы виндов по умолчанию эти библиотеки засовывает, так что 99% что у вас это уже есть. Возможно, в какие-то пиратские сборки виндов не включают для экономии…

    Reply
  35. maljaev

    (34) Из ссылки скобки уберите.

    Reply
  36. maljaev

    Только что почитил конфиги клиента на типовой БУ, размеры этих файлов были от 2.5мб до 4.5мб. То-то думаю, че это бухгалтерия на двухпроцессорном ксеоне так тормозит… За недостатком времени очистил только от параметров «РеглОтчетНастройка*», тем не менее размеры конфигов сократились в 20 раз — база залетала.

    Reply
  37. Abadonna

    Я со всех отчетов убираю панель инструментов, фиг они у меня насохраняют особо 😉

    Только то, что я посчитаю нужным

    Reply
  38. maljaev

    (37) А это неважно. Настройки списков регламент.отч. 1с сохраняет автоматически, независимо от того хочешь ты этого или нет, и именно эти настройки в основном грузят бухгалтерию.

    Reply
  39. Abadonna

    (0) Сань, цени: завел под твои разработку папку «Маляев» 😉

    До этого были только «АЛьФ» и «Abadonna» :)))))))))))))

    Reply
  40. maljaev

    (39) Круто. И сколько их в моей папке? Или ты с расчетом на будущее? Надо изучать восьмерку, чувствую себя динозавром… 🙁

    Reply
  41. Abadonna

    (40) Конечно, с расчетом! Щас пока только эта замечательная штука там 😉

    Reply
  42. jhfrek

    Хм… Надо будет тоже папку завести…

    Reply
  43. Shaman100M

    (36) Вот вот, и я о том же. Пора усовершенствовать выполнение для нескольких выбранных баз (как в этом примере, — десятка-два типовых бухий)

    Я попробовал, — прога настолько сделана удобна, что добавления кода для этой фишки минимальны. Зато, насколько быстрее, — одним махом все типовые…

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

    Изменения передал автору, как он решит, имхо.

    Reply
  44. maljaev

    (43) не, если тока для очистки то можно.

    Reply
  45. maljaev

    Обновил версию. Основные изменения:

    1. Исправлен баг, приводящий к вылетам 1С, если размер одного параметра превышал 500 килобайт (мне на тестирование присылали файл, в котором один параметр был размером 7 мегабайт).

    2. Теперь можно обрабатывать несколько баз одновременно (хоть все имеющиеся — скорость приемлемая).

    3. Сделал мини-редактор файлов выражений фильтрации со специальным удобным функционалом.

    Reply
  46. Shaman100M

    Спасибо!

    Reply
  47. IP43

    Круто. Но не хватает кнопки «Удалить архивы» т.е. все файлы 1cv7.cfg_ или я ее не вижу… И желательно для выбранных баз.

    Reply
  48. snarkelun

    Буквально вчера нужна была обработка. У клиента файл здоровенный а компьютеры слабенькие. Плюсую.

    Reply
  49. ManBot

    Скажу за себя (адинистртора) и за нашего 1С разработчика (за вложения один в один + дллка, тобиш за сорцы)

    +1

    Reply
  50. sml

    то (10) — мне интересно, ща как раз стоит задача при подключении через ОЛю к нескольким базам прописывать сохраняемый параметр «НеЗапрашиватьПодтверждениеПриВыходе». Попытался, было, тупо заставить ОЛю выполнить бач: СохранитьЗначение(), но эта коза не хотит ничего писать. Вот теперя ищу возможность редактировать cfg — файлу

    Reply
  51. sml

    кстати, классно ты список баз читаешь — я только додумался через текстовый файл получать — до объектов не дозрел. Еслиб было можно, еще б плюсов понаставил ;)))

    Reply
  52. Svetlana_E

    Раньше просто удаляла этот файл, бухи ворчали, но… А теперь — красота!

    Reply
  53. KurashovAlex

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

    2. При нажатии кнопки «Записать» обновляются файлы 1cv7.cfg и 1cv7.cfg_ даже если изменений не было. ИМХО, это не хорошо. Во-первых время на запись тратится, во-вторых даты файлов меняются. Мне, например, по файлу 1cv7.cfg удобно определять дату последнего входа пользователя в базу.

    Reply
  54. aldan

    Спасибо за обработку.

    Работа 1С существенно ускорилась, а полезные данные не потерялись.

    Reply
  55. Franchiser

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

    Reply
  56. Crazy1CC

    Отличная работа!!!!

    Reply
  57. Delf

    Спасибо за разработку, давно уже плюс ставил и использую. Но вот понадобилась возможность копировать сохраненные значения от одного пользователя к другому и добавлять значения хотя бы примитивных типов. Может Вы сможете добавить такую возможность? С уважением …

    Reply
  58. maljaev

    Сделать можно всё, но извини Delf, сейчас загружен несколькими проектами одновременно, времени нет. И объясни зачем добавлять значения, когда это можно легко сделать командой «СохранитьЗначение()». Это удалять нелегко, а добавить как раз просто.

    Reply
  59. serega3914

    Спасибо отличная разработка!

    Reply
  60. nike2fate

    Спасибо! То что нужно! +1!

    Reply
  61. vitn

    Да, разработка реально помогла.

    Reply
  62. b-dm

    Хорошая обработка, надеюсь ещё многим поможет…Совет — все же описать подробнее какой из выложенных файлов что означает…

    Reply
  63. BorisBelov

    Спасибо за полезную обработку. +1

    Reply
  64. kurpekov

    Обработка очень помогла, спасибо. Отдельное восхищение от старого семерочника за оформление внешнего вида обработки и удобства пользования. Отлично, просто отлично.

    Reply

Leave a Comment

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