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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *