<?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='\
Интересно.
Как в просмотре журнала это смотрится…
Да, точно. Автор, покажи картинку.
http://www.kb.mista.ru/article.php?id=115
ps. мне еще вот это понравилось:
//This code is ported from
«Кофе энд булочка. Ниче, что я по-английски?» — From a joke
Как-то так.http://forum.aeroion.ru/download434.png
Имя пользователя и машины я потёр, что бы не попалить
(2) 🙂 То, что тебе понравилось, это привычка с модописательства для phpbb
(3) Если реквизит был изменен, то хочется видеть на что именно. А то заблудиться можно. Картинку лучше в статью прилепи.
(4) Я так и понял, что привычка. У меня имха, что это как-то нелепо смотрится.
Разукрашенный код намного удобней и приятней смотреть)
И еще. Если это делается для пользователей, то лучше использовать не идентификаторы объектов, а синонимы.
>> Если реквизит был изменен, то хочется видеть на что именно.
Ну так кликни по строке в журнале и увидишь полную раскладку по данному событию.
(7) Уже понял. Я просто картинку изучаю))
(6) ну тут на каждый чих не наздравствуешься.
Полезная вещь.. 🙂 Но я лично, дополнительно решил пойти несколько другим путем — пусть каждый объект еще и сам хранит историю своих изменений, и более подробную…
Если нужна история изменений, да ещё и подробная, да ещё и с восстановлением, вам сюдаhttp://infostart.ru/projects/4040/ или в аналогичные.
Немного изменил процедуры. Добавлено обработка отказа и изменения владельца или родителя для элементов справочников.
Ну не знаю, насчет журнала регистрации.
1. Учитывая что анонсировано для 8.1, то почему бы не использовать подписку на события? и типового изменения меньше
2. Кто нить пробовал наложить фильтр на журнал регистрации в случае активной работы? И вы еще хотите туда что-то еще добавлять? и как это потом анализировать?
сорри, не увиждел про подписку.
блин, на семерке этих разработок — вагон и тележка.. и все на 8-ке тех же клоунов лепим.. хоть бы чего нового…
.
1. отслежтвается программное изменение реквизитов? если нет — в сад!
2. способна прога понять, что изменение порядка строк не является изменением? если нет — в сад!
.. пока хватит..
CheBurator, взад
1. Отслеживается. Подписка на событие срабатывает в любом случае. Учи матчасть. В сад.
2. не способна, так как и не требовалось по условиям матча. Остальное пох. опять же ва сад.
Любопытно.
http://v8.1c.ru/solutions/product.jsp?prod_id=32
А пику. Есть ли какие законченные продукты для управления проектами?
Я знаю только:
Уж по деньгам кусаеться.
Надо бы заценить вашу идею.
>>>> 2. Кто нить пробовал наложить фильтр на журнал регистрации в случае активной работы? И вы еще хотите туда что-то еще добавлять? и как это потом анализировать?
http://infostart.ru/projects/3904/
Кстати для этих целей я внедрил в конфу быстрый журнал регистрации.
С сабжем добавление не связано.
Завтра в работу пустим, посмотрим как покажет себя ))
Из найденного — не регистрирует изменения для ПВХ и планов счетов, ошибка на строчках:
Если МетаданныеОбъекта.Иерархический ….
И
Если (МетаданныеОбъекта.Владельцы.Количество() …..
Нет для них таких свойств метаданных
В этиx cтрoкax дoбaвить уcлoвиe ЭтоСправочник. Будет нopмaльнaя cвязь c ceтью, иcпpaвлю.
(20)
та это понятно, я для себя исправил уже.
да, ещё — не регистрирует изменение констант. мне в принципе не особо надо было, поэтому не дорабатывал — но теоретически было бы неплохо.
Случай для справочников исправил. А с константами песня отдельная и потребности такой у нас тоже нет.
Чем не устроил типовой механизм версионирования? Позволяет не только видеть какие реквизиты менялись, что менялось, но также проводит сравнения и откатываться на любую версию. Да и кода многова-то…
(23) Версионирование где? В УПП? Есть такое, начиная с релиза 1.2.23
А в других конфах?
Или он, по-твоему, зашит на уровне платформы или появляется по щучьему велению?
(24) А в других «конфах» можно эту идею реализовать с минимальными изменениями. Либо дождаться очередного релиза, благо не долго ждать.
Желающие, конечно, могут подождать. Учитывая расторопность 1С
(25) Совершенно не уверен, что 1С будет подобные «идеи» реализовывать во всех типовых конфах.
Например, ИМХО в БП им это нафиг не нужно, до сих пор механизм полезнейший механизм свойств не добавили 🙁
В ЗиК-е вполне могут добавить, хотя также очень сомневаюсь.
(23) Кода многовато? ты в УПП-то код версионирования видел? 🙂
Изменений в коде нет.
Поменял только ссылку на источник вдохновения (первоначальная уже не работала).
Изменения в коде после одной массовой обработки справочника.
Сделал игнорирование удаления ведущих или ведомых пробелов в строковых реквизитах.
А как бы еще добавить отслеживание изменений в Регистрах сведений? Ладно те, которые регистраторам подчиняются — в большинстве случаев все изменения можно в документах увидеть, а у нас еще есть такие, куда пользователи ручками изменения вносят — изменения налоговых ставок, вычетов НДФЛ, периодических констант и много чего еще, так вот хотелось бы видеть кто, что и когда внес, изменил. По аналогии сделать не удалось — в событиях ПриЗаписи и Запись есть только Отказ и Замещения, сами данные-то не передаются. Киньте идею как реализовать, чтобы данные так же заносились в журнал регистрации? (конфа зарплатная, не типовая, написана на заказ)
При использовании этой схемы в 8.1.15/14 мои пользователи стали жаловаться на постоянные блокировки
Причем система до этого работала не один месяц, проблемы с блокировками были незаметны.
В результате анализа выяснил, что ошибка в использовании объектного подхода — типа ПрежнийОбъект.Номер
А прежний объект — это ведь ссылка, и идет получение инфы из базы.
Перевел код на использование запросов, блокировки исчезли.
(31) Значит, мне ещё везёт, сам таких жалоб не слышал. Будет время, займусь переписыванием.
(32) Могу выложить готовый код.
В мыло или в личку или в аську.
(33) Кинь в личку, завтра может помозгую.
Как раз собираюсь конфу обновлять.
Не знаю, кому это ещё нужно, но выложил обновлённый вариант с чтением реквизитов запросом.
Идея хороша, но изнутри транзакции проведения документа писать лишнее в журнал регистрации — не айс. Это далеко не самый быстрый объект.
Лучше накапливать изменения и записывать их в журнал после того как зафиксирована транзакция и освобождены все блокировки
Не спорю, но заморачиваться уже нет особого желания и времени.
(35) Мне надо. То есть тут не последняя версия?
(38) Это и есть последняя версия. Та, которую протестил в прежней конторе, перед выпиливанием оттуда.
(39) А все .. понял, сорри, не увидел что текст запроса кусками формируется
PS блин так неудобно стало когда обработку от обсуждения отделили…
Тема актуальная.Кстати в какой модуль это прикручивать?
(41) Расскажу за деньги, если читать не умеешь.
Спасиба почитал повнимательнее в том числе код.)))
Очень простое и гибкое решение… нечто подобное для 7-ки делал в свое время, правда без подписок на событие естетственно ))). По поводу блокировок — ни я ни пользователи не заметили проблем.
(44) Как эту статью вижу, так сразу вспоминаю контору, в которой тогда работал. Не от хорошей жизни пришлось выдумывать и прикручивать.
Пожалуйста подскажите тому кто не понимает, а очень надо: в каком документе/модуле это все надо дописать?
(46) Обратитесь лучше к специалисту, не то донаписываете.
Спасибо! особенно, что просто приведен код для вставки в конфигурацию. То, что надо!
Статья супер! Очень пригодилось! Спасибо огромное автору!
Кстати говоря, на 8.2 в режиме управляемого приложения, приведенный код будет исполняться на клиенте. В 8.1. с этим в порядке, исполнение идёт на сервере.
В 8.2 в управляемом приложении в ряде конфигураций появилась сущность «блокируемые реквизиты», т.е. реквизиты, которые нельзя/не рекомендуется изменять после того, как «элементы» (типа Справочника, ПВХ) используются в документах.
Прикрутил. Все супер!
Что-то волна пошла. Это поделие ещё кому-то интересно?
Из этого всего страдает самое важное — ПРОИЗВОДИТЕЛЬНОСТЬ!!!
ИМХО — надо использоввать ПОДСИСТЕМУ «Версионирование» предложенною самой 1С.
(54) Надо, только её нет в БП, УТ, и куче других не топовых типовых 🙂
Я, пожалуй, попробую запилить в свою конфу, посмотрим, как дело пойдет =)
Запилил, все работает! Спасибо большое, а то админы давно просили. Единственное, что я добавил, так это возможность вкл/выкл возможность записи в журнал регистрации по значению константы «Вести дополнительный журнал регистрации», мало ли тормоза нарисуются в будущем. А так респект!
И да, реально не хватает контроля записи в РС, например Контактная информация или Ответственные лица. Как бы реализовать, нет мыслей?
Получилось неплохо. Я тоже сделал но мой код все таки немного хуже оказался, может даже заберу твой, зафигачу к себе после обработки напильником. Кароч, жирный «+», жаль нельзя два поставить.
(58) the1, Подпись на события перед записью не предлагать? (в рамках обсуждаемого решения)
см. справку по РегистрСведенийНаборЗаписей
метод Метаданные() у объекта есть, см. Имя Регистра, определяем нужно ли по нему вести историю
Отбор — доступен, через него можно же получить текущее состояние ИБ
Сравнить Источник и Текущее состояние в ИБ.
Буду пробовать у себя в конфе, спасибо за инфу!
Сделано «для себя») подправить?
Спасибо. Внедряю у себя…
Просто удивительно, насколько популярным и востребованным даже спустя четыре года оказалось это поделие.
(64) Да вот все ждем когда 1С займется средой разработки. Давно пора журнал регистрации вести в СУБД и серьезно его доработать.
Решение интересное, но с оговоркой, для больших баз лучше использовать подсистему версионирования из БСП.
В типовом варианте сериализация в XML и сохранение в регистр работать будет значительно быстрее, а значит вероятность получить дедлок существенно меньше, т.к. в обоих случаях работаем в рамках транзакции записи.
Вываливается в ошибку в серверном варианте работы базы «Попытка передачи мутабельного значения с клиента на сервер», т.к. подписка на события находится в общем модуле Клиент (обычное приложение) и Сервер, а регистрация изменений происходит в ОМ Сервер. Что бы такого лучше сделать?
(67) Внимательно прочитать тему и снять флажок сервер с модуля.
(68) внимательно прочитал еще раз
добавил
а вот это не катит, иначе как у меня будет работать модуль, если его вообще нЕоткуда вызвать?!
Может, подписки и регистрацию изменений разместить в одном модуле?
(69) 300 рублей и займусь вашей проблемой.
(69) Таки добавил в один модуль, вроде все работает. Буду тестить…
(70) Думаю, сам разберусь 😉
Спасибо, мне очень пригодилось на управляемых формах!!!
Понравилось, попробую по возможности.
Спасибо за статью! Очень пригодилась!
Спасибо)