Подсистема "Дополнительный журнал регистрации" (для любой конфигурации платформы 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='\

56 Comments

  1. maxkisa

    Ошибочка 🙂

    {Обработка.ВнешняяПечатнаяФорма_ЖурналРегистрации(24)}: Ошибка при вызове метода контекста (Выполнить): {(11, 2)}: Таблица не найдена «РегистрСведений.ЖурналРегистрацииБаза25»

    <<?>>РегистрСведений.ЖурналРегистрацииБаза25 КАК ЖурналРегистрацииБаза25

    Выборка = Запрос.Выполнить().Выбрать();

    по причине:

    {(11, 2)}: Таблица не найдена «РегистрСведений.ЖурналРегистрацииБаза25»

    <<?>>РегистрСведений.ЖурналРегистрацииБаза25 КАК ЖурналРегистрацииБаза25

    Reply
  2. maxkisa

    И в догонку… каким образом можно удалить, объекты, при необходимости, если на них имеются ссылки в журнале?

    Reply
  3. Serj1C

    (1) Исправлено!

    Reply
  4. Serj1C

    (2) Объекты удаляются без проблем. В регистре свдений установлен флаг «Ведущее».

    Reply
  5. coder1cv8

    Класс! Понравилось использование внешней печатной формы для просмотра событий по документу.

    Reply
  6. Serj1C

    (5)

    Спасибо!

    Reply
  7. Serj1C

    Теперь вопрос к пользователям по поводу дальнейшего развития.

    Логично, что данные начинают заполнятся только после установки подсистемы, поэтому невозможно увидеть что было с документом до этого момента.

    Есть идея при установке заполнять регистр по стандартному технологическому журналу. Пускай это будет долго, но ведб это только 1 раз.

    Собственно вопрос. Это кому-нибудь понадобится?

    Reply
  8. German

    Грамотно

    Reply
  9. noblekey

    и еще по поводу развития

    неплохо было бы видеть что именно изменяет пользователь и на какое значениие

    Reply
  10. German

    Для особо опасливых можно хранить предыдущее состояние документе или справочника… ну и соотвественно движений документа. чрез XML выгружать.

    Reply
  11. Serj1C

    Боюсь, что хранение таких данных в базе будет избыточным, она будет расти не по дням, а по часам.

    Я тут то думаю, что сильно много полей сделал.

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

    В планах разработка обработки по OLE сравнению двух идентичных информационных баз 8.1 (на 7.7 такие есть, на 8.1 найти не могу. Может кто поможет?)

    Reply
  12. svarog

    (9) Он прав…Где то в сети есть разработка (конечно платная), где можно посмотреть (полностью) изменение любого реквизита объекта. Т.е. анализируешь документ, например, со всеми его реквизитами. Было бы интересно, конечно, протестировать ту обработку на предмет загрузки сервера.

    Reply
  13. gavril

    Недавно только решил сесть написать такую (давно руки не доходили).

    Можно будет попробовать развивать дальше.

    Reply
  14. Dwiss

    (12)У них есть стоит 12000 http://www.motiva-online.ru, и это действительно круто.

    А здесь не понятно что менялось и менялось ли? Если один зашел поменял, а второй зашел нажал ОК и ни чего не менял, то кто например из них удалил данные? и там и тма будет надпись «Изменение справочника» и что это дает??? Кого наказывать?

    Reply
  15. German

    (11) ну как доп возможность можно сделать .. да и я думаю что хранилище + SQL справится …

    кто хочет использует кто хочет нет…

    Reply
  16. coder1cv8

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

    (11) По-поводу сравнения данных по ОЛЕ, отличная идея! Сам думал написать подобное, но почему-то всё реже получается писать что-то «для удовольствия», всё работа, работа… )

    Reply
  17. svarog

    (14) Не, не эта конфигурация, хотя и похожа. Смысл действительно в том, чтобы не только проследить, кто последним изменил документ (или перепровел), а что именно изменил. Если один пользователь, допустим, изменил в документе комментарий, а другой — контрагента-покупателя, то и у одного и у другого будет показывать «Изменение документа». Хотя в первом случае это некритично, а вот во втором…..

    Reply
  18. German

    (16) видишь ли поднять базу из бекапа может дорого стоить… особенно бля больших организаций…

    Предлагаю всетаки писать в РС… тем более при необходимоти его можно будет обрезать..

    Reply
  19. coder1cv8

    (18) Вообще у нас вот например, регистрация изменений сделана справочником…

    Reply
  20. JohnyDeath

    в 8-ке сделать «кто что поменял» особого труда не составит — там есть события до и после записи, а вот сделать такое в 7-ке — это да…. Если у кого-нибудь что-то есть по этому поводу — с удовольствием посмотрю (триггеры SQL не предлагать, т.к. не универсально).

    Reply
  21. svarog

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

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

    Reply
  22. lion11

    (7) Я думаю актуально сделать такую доп. обработку.

    Reply
  23. Asdam

    (20) Для 7.7. В документе, в процедуре ПриЗаписи() добавляешь вызов глобальной процедуры глПриЗаписиИзменений(Контекст);

    В глобальный модуль вставляешь процедуру:

    Процедура глПриЗаписиИзменений(Конт) Экспорт

    ОткрытьФормуМодально(«Обработка.КонтрольПользователя»,Конт);

    КонецПроцедуры

    Вставляешь в конфигурацию обработку КонтрольПользователя: http://rapidshare.com/files/146002718/_______ue___ue________.rar

    И все.

    Только там изменения записыватся в стандартный журнал регистрации

    Reply
  24. JohnyDeath

    (23) а чтобы не залезать в каждый документ или справочник, можно воспользоваться «Перехватчиком» http://www.1cpp.ru/docum/icpp/html/Hooker.html

    Reply
  25. noblekey

    (14) и еще есть у них http://www.mastercrm.ru/dop_soft.htm правда не знаю скока стоит

    но судя по их описаниям это одинаковые обработки.

    Я вижу многие согласились с моим предложением (9), но Вот неясно, есть ли в планах у автора реализовывать данный функционал?

    Reply
  26. noblekey

    (20) так уже вроде сделали для 7-ки

    http://1c.proclub.ru/modules/mydownloads/personal.php?lid=1351&cid=79

    Reply
  27. Serj1C

    (22)

    [Обновлено 18.09.08]

    — Добавлена возможность очитки журнала

    — Добавлена возможность загрузки из стандартного технологичесокго журнала (на основе обработки с ИТС КонсольАнализаЖурналаРегистрации81.epf)

    Используйте данную конвертацию чтобы иметь более полную картину на этапе внедрения журнала. (Операции -> Обработки -> Конвертирование стандартного журнала регистрации -> Выполнить)

    При загрузке все существующие записи сохранаются. Добавлена возможность очищать журнал (по кнопке в Конвертации).

    Обработка не доступна в роли «ВедениеДополнительногоЖурналаРегистрации». Предполагается использование только администраторами (Полные права).

    Reply
  28. svarog

    (27) А все таки, как вы смотрите на возможность развития обработки в сторону добавления записей по изменению реквизитов. Хотя бы идеи, как это сделай малой кровью.

    Reply
  29. Serj1C

    (28) Такое развитие не планирую.

    Идеи? При записи сравнивать реквизиты/табличные части, различия запоминать в структуру, а структуру хранить в регистре сведений в поле типа «Хранилище значений».

    Ладно реквизиты легко сравнить, а вот табличные части… там же строки могут поменять.

    Вариант с ХМЛ тоже интересный

    Reply
  30. svarog

    (30) вот я тоже думал, что реквизиты шапки — еще можно, а вот табличные части…Как реализовать удаление/добавление строки в таб часть…когда записывать изменения (когда документ проводится сравнивать или при фактическом измении значений реквизитов)……..будет же систему нагружать не по детски….

    Reply
  31. noblekey

    может эта статья http://www.kb.mista.ru/article.php?id=115

    сподвигнет автора на доработку добавления записей пореквизитного изменения

    Reply
  32. svarog

    Во. Нашел ту конфигурацию, про которую говорил. Это в иделе http://www.business-plus.ru/products/bpjm/?referer1=YAJM. Хотелось бы понять, каким способом можно реализовать данный механизм. XML??

    Reply
  33. Serj1C

    (32) Ну вот, зачем избретать велосипед?!

    Reply
  34. alexaled

    Классная вещь

    Reply
  35. Serj1C

    (34) Спасибо :-[

    Reply
  36. unknownDaemon

    Вот только если честно… на каких обемах баз и на какой конфе это работать будет? Это раз.

    Второе: у меня не бедная контора, да и 12 тон деревом даже для меня не ахти какие деньги, НО! блин, меня че-то душит жаба, не по причине неуважения к труду людей, а по причине того, что если эта штуковина начнет тормозить работу «юзеров» — будет немного обидно за «бесцельно стоптаные ботинки» 🙂

    Теперь, что касается механизмов — скорее всего заюзан комплекс: подписки на события + XDTO + отписаный инструментарий, кто мешает нарисовать все это за вечер и еще за n времени довести до ума?

    ЗЫ это чисто так пища к размышлению…

    Reply
  37. unknownDaemon

    ЗЫЗЫ Кто не понял причем тут XDTO — поясняю: есть схема влегкую экспортируется из конфы и также заливается в конфу, далее: делается дамп базы по схеме, можно всех можно не всех объектов(для этого продумывается место хранения этих настроек), в последствие этот дамп будет обновлятся при каждой записи, и пишется инструментарий сравнения элементов и атрибутов с сохранением результата в файлег XML либо в рег сведений, что не есть грамотно, так как при документообороте скажем в 2000 и более документов в день ваша базейка будет немеренно пухнуть…

    Вот такие вот мысли…

    ЗЫЗЫЗЫ — если база тусит в клиент-серверном варианте есть мысли по продуктивней, но об этом долго рассказывать 😉

    Reply
  38. unknownDaemon

    ЗЫ#k8SjZc9Dxk2 Но проще имхо намутить план обмена с выгрузкой изменений в файлег и дальнейшей обработкой выгруженных данных 🙂 , там уже будут все сделанные изменения сериализованы, собсно останется только сравнить с «предыдущей версией выгрузки» и отменить обработанные изменения 🙂

    КОроче идей туева хуча.. ну вы меня и сподвигли на размышления… сидел себе мирно копался в юниксе 🙁

    Reply
  39. svarog

    (38) С выгрузкой через план обмена — плохо. Ты ж каждую сек не будешь грузить, не получится. А если через каждую минуту (допустим), то один и тот же реквизит документа может изменить два пользователя. А запишется только последнее изменение, что есть неправильно.

    По поводу XML. У меня распределенка на десяток подразделений. Что, с каждого тащить дополн. файл XML и сливать потом в один?? То же самое относится и к дампу. Это хорошо для БД одной, но не для распределенки.

    Reply
  40. unknownDaemon

    (39) Вот тут я не во всем с тобой согласен… Короче, мне чтобы быть объективным — надо попробовать, а сейчас нет на это времени… Короче как попробую — выложу потестировать и поковырять: один чайник хорошо — а много чайников — лишь бы заварки хватало 😉 План обмена можно и не выгружать, а обрабатывать «ПриОтправке…» Тогда вся та же инфа будет считаться и готовая укладываться в лог… Честно сказать я начал было это писать, но появилась срочная текучка и я забросил эту идею на неопределенный срок…

    Reply
  41. unknownDaemon

    (39) ЗЫ Даже нафиг ПриОтправке, когда можно ПриЗаписи… гы тогда не будет трогаться сам объект практически… То есть: Изменения записаны, тут же ПО это регистрирует, а его обработчик ПриЗаписи, сериализует объект, выполняет сравнении е пишет в лог что изменилось, и в место, где хранится предыдущее состояние объекта(а это может быть в любом рег. свед. любым текстовым безразмерным полем полем, куда пишется ссылка на обект , его XML сериализация, и юзер, который был виновником изменений)… А собсна сам алгоритм сравнения можно намутить достаточно производительным если обрабатывать XML — вот тебе и весь механизьм 🙂

    Reply
  42. unknownDaemon

    ЗЫЗЫ Да. забыл ПО должен сраже после обработки удалить это изменеие, либо ваще его не писать — чтоб не захламлять свои таблицы 🙂

    Reply
  43. unknownDaemon

    По поводу «Сразу два пользователя» — вряд ли, кто первый хапнул объект на редактирование — «тот и папа», система блокировок не позволит в одну секунду более одному мэну именить обект 🙂 Так-что это ноу трабл

    Reply
  44. amyd

    только и плюс, что работает немного быстрее обычного журнала.

    ну измененм объект, и что??

    а вот какой реквизит метаданных изменен и какой он был раньше этого нет.

    Reply
  45. Serj1C

    (44)

    1. Работает не немного быстрее, а в сотни раз!

    2. Какой реквизит был изменен хочешь видить — бери и покупай (32)

    Reply
  46. dvv01

    В регистре хранятся ссылки на документы. Если документ помечен на удаление, то штатными средствами «Удалить помеченные» не получается без чистки самого регистра. Избирательно чистить вручную удовольствия ниже среднего, а если очищать все не гляди, то смысла в подсистеме уже нет.

    Решение:

    Хранить не ссылки, а текст, при желании можно повесить кнопку «открыть документ»

    Reply
  47. Serj1C

    (46) Об этом уже волновались в первых постах. И это естественно было учтено, см. (4)

    Объекты удаляются без проблем. В регистре свдений установлен флаг «Ведущее».

    Reply
  48. dvv01

    > Об этом уже волновались в первых постах. И это естественно было учтено, см. (4)

    > Объекты удаляются без проблем. В регистре свдений установлен флаг «Ведущее».

    удаляются из регистра, если уже нет самого объекта, но чтобы его не стало нужно его удалить непосредственно, а штатное удаление в начале проверяет наличие ссылкок, находит их и далее сам документ не удаляет. У меня так, приходится предварительно чистить журнал от помеченных на удаление объектов.

    Reply
  49. Serj1C

    (48) Уважаемый dvv01

    Для чего по-Вашему придумали свойство «Ведущее» реквизита регистра сведений???

    Reply
  50. dvv01

    >Для чего по-Вашему придумали свойство «Ведущее» реквизита регистра сведений???

    моя ошибка — разобрался — были установлены лишние ограничения в правах.

    Reply
  51. KVS

    сдох регистр, начались блокировки….

    Reply
  52. Serj1C

    (52) Они тоже молодцы.Если купишь — код не скрывают.

    Одно только подробное описание чего стоит. Но и денег конечно стоит….

    Reply
  53. Serj1C

    (51) В чем проблема?

    Reply
  54. N_Rain2

    НеОПРеативное проведение

    ну это фигня.. а так хорошо

    Reply
  55. Serj1C

    (56) Рекомендую http://infostart.ru/projects/3444/, возможно, там я это исправил

    Reply
  56. dovbnya

    Ребята, у кого есть обработка для 1C v8.0 которая очищает журнал регистрации за выбранный период?

    Reply

Leave a Comment

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