Журнал регистрации изменений (тюнинг от alexer)




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

99 Comments

  1. Bambrlog

    как ведет себя система с ИРДБ?

    Reply ↓
  2. alexer

    (1) С ИРБД не тестил, дабы такой задачи не ставилось.

    Reply ↓
  3. Evgeniy

    есть вопрос по поводу объединения уже рабочей базы с даными по изменениями от автора обработки http://infostart.ru/public/19364/?PAGEN_1=1#comm339629

    Не пропадут ли уже существующие данные в базе по изменениям при простом объединении?

    Reply ↓
  4. alexer

    (3) Простым объединением конфигураций данные не пропадут, но работать будет неправильно. Для этого потребуется сделать некую конвертацию.

    Reply ↓
  5. almas

    Вот умница. Спасибо.

    Reply ↓
  6. Evgeniy

    (4) Можно поподробнее про конвертацию?

    Reply ↓
  7. alexer

    (6) Выложил инструкцию и обработку по конвертации данных из старой версии.

    Reply ↓
  8. mawr41

    Здравствуйте. Объединил Вашу конфу со своей и выходит ошибка с ГлТекущим Пользователем??? Что можно сделать? 8.1.13.41 Управление торговлей 10.2.6.4

    Reply ↓
  9. alexer

    (8) Возможно при объединении конфигураций не сняли галочку со свойств конфигурации. скриншот

    Reply ↓
  10. Mazaloff2

    включить интелект!!! 😀

    почему галочка не стоит….

    Reply ↓
  11. DitriX

    Спасибо. На платформе 8.2 работает прекрасно.

    Reply ↓
  12. N_Rain

    Делал свою такую же , только на основании регистра сведений…Прошло 3 месяца — база стала жутко тормозить, регистр максимально оптимизирован, попробуем со справочником, спасибо!

    Reply ↓
  13. Sergey K

    + поставлю, только не понятно

    (0) а вот это зачем?

    >>Справочник ЖурналРегистрацииИзмененияОбъектов

    Reply ↓
  14. alexer

    (13) 1. ЖурналРегистрацииИзмененияОбъектов.СсылкаНаОбъект имеет тип «Строка», для того чтобы была возможность удалять объекты БД.

    2. Галочка «Включить интеллект» помогает более наглядно просматривать ТЧ объекта, когда рядом располагается СтрокаДобавлена, СтрокаУдалена с одним номером строки.

    3. Для настройки объектов понадобится добавить в конфигуратор дополнительный справочник или регистр.

    Reply ↓
  15. poet

    не получается объединится с бухией 8.0 — пишет о несовместимости структур — не могли бы выложитьвыслать исходники?

    Reply ↓
  16. alexer

    (15) конечно не объединится, она написана на 8.1.

    а что вы понимаете под исходниками?

    Reply ↓
  17. poet

    (16) куски текста кода, которые можно было бы по аналогии добавить в 8 конфигурацию

    Reply ↓
  18. alexer

    (17) Советую вам найти платформу 8.1 и посмотреть конфигурацию, так будет проще

    Reply ↓
  19. ZLG07

    Классная штука, плюсую обоим

    Reply ↓
  20. fir

    Люди, не работает ссылка на скачивание — Parse error: syntax error, unexpected ‘:’ in /usr/local/www/data/bitrix/stack_cache/MYSQL/b_iblock/30/306­004069f336106238000efc8c322b9.php on line 5

    Может кто-нибудь скинуть на fir@ya.ru? Заранее благодарен. Очень хочется попробовать сие чудо 🙂

    Reply ↓
  21. denushki

    Выходит ошибка записи в таблицу журнала изменений т.к. число строк превышает 99999.

    почему так много строк, считаем. Есть документ в который выводится 8000 строк и заполняется около 20 реквизитов строки. Получаем 8000строк*20 реквизитов получаю как минимум 160000. Исправьте ошибку, сделайте ограничение на 99999 а потом новая запись журнала изменений на оставшиеся.

    Reply ↓
  22. alexer

    (21) Понял, будет время исправлю, тем более нашел еще одну ошибку.

    Reply ↓
  23. feodorro

    Автору СПАСИБО!!!!

    Reply ↓
  24. alexer

    (23) Спасибо не булькает 🙂

    Reply ↓
  25. alekseineputin

    (24) Попробую потестировать в своем стакане 😉

    Reply ↓
  26. Polya

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

    Reply ↓
  27. udgen1986

    Внес изменения, но когда все начинают работать (примерно 15 человек) начинаются ошибки транзакций, не может завершить сессию. Я бы смирился с тем что все стало медленнее, но такие ошибки мешают работать пользователям. Где то в комментах писали что со справочниками таких проблем быть не должно. Идея то хорошая — можно отслеживать что изменилось в документе и табличной части. Посоветуйте что-нибудь.

    ПС. База sql.

    Reply ↓
  28. alexer

    (26) объекты помеченные на удаление должны без проблем удаляться

    Reply ↓
  29. alexer

    (27) работает на нашем предприятии Журнал изменений уже месяцев 8, ошибки транзакций бывают но редко, и скорее всего не из-за этого справочника.

    А какой у вас стоит SQL?

    Reply ↓
  30. udgen1986

    Ошибка указывает на код общего модуля Журнала регистрации.

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

    2005 sql

    Reply ↓
  31. Polya

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

    Reply ↓
  32. alexer

    (31) объекты помеченные на удаление должны без проблем удаляться, т.к. в справочнике «ЖурналРегистрацииИзмененияОбъектов» хранятся не сами объекты, а ссылки на эти объекты в строковом виде.

    Reply ↓
  33. Polya

    ну у меня не последняя версия, а какая то одна из первых:)

    Reply ↓
  34. axae

    Что за дата ‘20.10.2010’?

    Reply ↓
  35. axae

    А удаления объектов фиксируются? Потому что на поиск журнала регистрации сподвигла именно задача поиска виновного в удалении объектов.

    Reply ↓
  36. anchovy

    Можно настроить журнал так, что бы отслеживались еще и изменения в заданном регистре сведений?

    Reply ↓
  37. alexer

    (36) К сожалению нет, ибо изначально такой задачи не ставилось.

    Reply ↓
  38. anchovy

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

    Reply ↓
  39. mzelensky

    У меня вопрос к разработчику.

    В некоторых ситуация возникает следующая ошибка:

    {Обработка.ИсторияИзмененияОбъектов_AEMZ.Форма.Форма(113)}: Ошибка при вызове метода контекста (ЗначениеИзСтрокиВнутр): Ошибка преобразования

    НовРеквТЧ.ПослеИзменения = ЗначениеИзСтрокиВнутр(СтрокаРеквТЧ.НовоеЗначение); // alexer 28.12.09

    по причине:

    Ошибка преобразования

    по причине:

    Ошибка формата потока

    Чем это может быть вызвано??? Если не затруднит, вышлите ответ на почту: zel_maks@mail.ru

    Reply ↓
  40. alexer

    (40) знаю об этой ошибке, да нет времени поправить

    дело в том, что эта ошибка возникает если изменен реквизит с типом строка неограниченной длины, и количество символов превышает максимально возможное количество в Журнале изменений

    Reply ↓
  41. mzelensky

    (40) как можно вылечить?

    Reply ↓
  42. mzelensky

    (41)+ В том поле используется составной тип данны, что мешает присвоить строке неограниченную длину, но в приципе я же могу постаить длину «999» вместо «100» и должно прокатить?!

    Reply ↓
  43. alexer

    (42) Должно помочь.

    Reply ↓
  44. mzelensky

    (43) А не помогло!!! Поставил длину в «500» символов и все-равно ошибка в строке с длиной около 100 символов. В итоге просто поставил обработчик появления ошибки (исключительной ситуации) и если такая возникает, то просто в ручную выделяю подстроку из строки и записываю в нужное поле — вроде работает!

    Reply ↓
  45. alexer

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

    Reply ↓
  46. mzelensky

    (44) ААА…вон в чем дело…ясно! Ну в принципе моя заплатка будет работать для старых записей, а новые, по идее, теперь нормально будут создаваться. так что все ОК 🙂

    Reply ↓
  47. olegpoz

    скачал, подключил. есть поправки-мнение:

    1е — зачем используется конструкция


    …

    ОбъектПустаяСсылка = ОбъектМенеджер.ПустаяСсылка();

    Если ОбъектПустаяСсылка = Источник.Ссылка Тогда

    …

    почему просто не «Источник.ЭтоНовый()» ???

    2е — в этом самом месте нужно еще проверить

    «Источник.ПолучитьСсылкуНового().Пустая()» и использовать ее если есть,

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

    Reply ↓
  48. V.Nikonov

    Данный вариант ещё не проверял, т.к. у себя использовал вариант с записью в ЖурналРегистрацииСобытий. Но прочитав комментарии встал вопрос:

    В Торговых конфигурациях зачастую существует «Законный» поток изменений задним числом. При этом, в конечном результате изменяются складские и свободные остатки. Фактически выявляется только Номенклатура, по которой произошли существенные изменения. Собственно из этих предпосылок и начинается поиск: кто когда и где внёс изменения в документы, приведшие к изменению остатков…

    Насколько я понял из описания, запись справочника соответствует контролируемому объекту и следовательно для поиска изменений влияющих на остатки приходится строить выборку по всем табличным частям?

    Как идею, предлагаю дополнить ТЧ изменений категоризацией характера изменений (например выделить в отдельную категорию события влияющие на Остатки; влияющие на Взаиморасчёты; влияющие на Резервы и т.п.). Категорию можно использовать для дополнительной фильтрации.

    Reply ↓
  49. V.Nikonov

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

    Reply ↓
  50. sound

    Мой плюсик юбилейный :). Можно даже обработку было не делать, а сделать форму списка справочника, было бы еще меньше изменений. А вообще прикольно

    Reply ↓
  51. mtelis

    А как бороться с «объект не найден» после того, как удалил помеченные на удаление объекты? Может, сохранять наименование?

    Reply ↓
  52. bela88

    Спасибо большое автору! Журнал встроили в базу, все пока отлично работает) Пользователи довольны.

    Reply ↓
  53. Murom

    Хорошая задумка и реализация. Уже ставил в одну базу, но там мало пользователей и движений. Сейчас хочу поставить большую базу: около 30 пользователей и каждый строчит документы. Посмотрим как будет справляться на таком объеме данных. Честно говоря думаю что будут тормоза…

    Reply ↓
  54. shkl1

    Прикольная штучка. Но есть одно но… Нет отчетов по которым можно собирать данные и сравнивать. А в таком виде оперативно получить информацию об изменения при больших объемах информации весьма проблематично. А как из этого счастья сделать отчет как-то пока не придумал 🙁

    Reply ↓
  55. Триш

    Внедрили, пользуемся. Спасибо!

    Reply ↓
  56. Murom

    Тоже получил ошибку

    {Обработка.ИсторияИзмененияОбъектов_AEMZ.Форма.Форма(113)}: Ошибка при вызове метода контекста (ЗначениеИзСтрокиВнутр): Ошибка преобразования
    НовРеквТЧ.ПослеИзменения = ЗначениеИзСтрокиВнутр(СтрокаРеквТЧ.НовоеЗначение); // alexer 28.12.09
    по причине:
    Ошибка преобразования
    по причине:
    Ошибка формата потока 

    Исправил в табличной части «Изменения» реквизиты «НовоеЗначение» и «СтароеЗначение». Поставил неограниченную длину. Только вот интересует, как это скажется на базе при большом объеме данных? Или лучше будет поставить все таки ограниченную строку в 500 или 1000 символов ?

    Reply ↓
  57. von_de

    Неплохая штукенция. Только довольно громоздкая. Ставил себе на УТ — периодически вылетал журнал с ошибкой «Ошибка формата потока». И при изменении документа свыше скольки-то тысяч строк табличной части (не помню точно) запись в журнал вылетала с ошибкой. Приходилось брать конструкцию записи в попытку исключение.

    Reply ↓
  58. Mshaydurov

    Здравствуйте! Как обстоят дела с удалением объектов, в том числе, непосредственным. Ваши доработки системы помогают обработать такие ситуации?

    Reply ↓
  59. Mshaydurov

    Все уже сам посмотрел. Удалять дает без проблем. Но появляются записи «<Объект не найден>». Непосредственное удаление никак не обрабатывается

    Reply ↓
  60. anton-1c

    Для того чтобы получить результат, надо загружать ранее выгруженный журнал регистрации?

    Reply ↓
  61. alexer

    (60) anton-1c,

    если я правильно понимаю вопрос, то записи в журнале регистрации появляются после начала применения этой подсистемы, никакого отношения к типовому журналу регистрации от 1С эта подсистема не имеет

    Reply ↓
  62. Mshaydurov

    Добавил реквизит «Представление ссылки» для хранения представления ссылок объектов. Что бы потом можно было отследить что же это за <Объект не найден>. Вообще разработка — классная вещь. Спасибо автору за это!

    Reply ↓
  63. mybracho

    Спасибо, а где описан порядок установки ?

    Reply ↓
  64. mybracho

    +(64) И как сделать, что б лог велся только по конкретному объекту ?

    Reply ↓
  65. mybracho

    » Добавил обработку ЖурналИзмененияОбъекта.epf, позволяет просматривать изменения объекта из самого объекта, подключается как внешняя печатная форма (см. файлы).» — цэ

    Как просмотривать истрию изменений из самого объекта ?

    Reply ↓
  66. mybracho

    (+66) И как сделать отбор по одному объекту ?

    Reply ↓
  67. mybracho

    +(67) Со всеми вопросами разобрался. Внедрил в конфигурацию. Все работает на пять баллов. Рекомендую

    Reply ↓
  68. ScRatch

    половина записей — Объект не найден, что с этим делать? Отвественный всегда — Администратор и все чеки ККМ

    Reply ↓
  69. alexer

    (69) ScRatch,

    1.Объект не найден — означает, что были удалены объекты помеченные на удаление

    2.Полагаю, что все пользователи входят в 1С под одной учеткой — Администратор

    Reply ↓
  70. ScRatch

    это чеки ккм из розницы, они видимо каждый день после закрытия смены удаляются из УТ, как сделать, чтобы оставалось описание объекта после удаления?

    upd в плане обмена сделал чтобы они не удалялись, а только устанавливалась пометка удаления

    Reply ↓
  71. slavich

    Спасибо, обработка полезная нужная, +

    Reply ↓
  72. slavich

    Плюс, очень понравилось давно хотел что то такое, но вот да, как и писалось выше не хватает отчета…

    Reply ↓
  73. vechiy

    эх, не работает с 8.2.15.301 (

    Reply ↓
  74. vechiy

    нет ли возможности конвертнуть? спасибо

    Reply ↓
  75. PanKir

    (0)

    всё хорошо, но есть одно НО!

    это даже не к самой системе, а к оформлению…

    когда файл создается в виде конфигурации или базы данных, то надо, помимо самой системы, в конфигурации создавать ещё и как минимум двух пользователей — одного с полными правами, а второго без прав, кроме «пользователь».

    так будет видно какие права выставлять на объектах системы, если перенос происходит «КопиПастом»

    (к примеру из 8.1 в 8.2), а то пришлось самому думать дать пользователю право изменять справочник «ЖурналРегистрации» или хватит с него права добавления… 🙂

    З.Ы. в любом случае плюс за такое решение. (и предшественникам тоже)

    Reply ↓
  76. 4ur

    попробуем, интересно как будет работать когда у нас все 70-90 пользователей сразу начнут работать…

    Reply ↓
  77. agr

    А что нибудь, что фиксирует изменения в регистрах сведений существует? Или есть возможность доработки существующих?

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

    Reply ↓
  78. SAS99

    По многочисленным просьбам, добавил возможность настройки состава объектов для контроля

    http://infostart.ru/public/151285/

    Reply ↓
  79. shatshat

    спасибо. отличная вещь.

    Reply ↓
  80. shatshat

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

    почему произведено вот это изменение

    // Если НЕ РольДоступна(«УправлениеРегистрациейИзменений») Тогда // alexer— 29.12.09

    Если НЕ ИмяПользователя() = «ИмяПользователя» Тогда // alexer+++ 29.12.09

    чем проверка по роли «хуже»? или просто так захотелось?

    Reply ↓
  81. shatshat

    Здравствуйте, коллеги

    Понадобилось решить ту же задачу. Взял эту разработку за основу, посмотрел «тюнинг» от SAS99 и вот что у меня получилось:

    1. Дополнительно к СтароеЗначение и НовоеЗначение вернул СтароеЗначениеСсылка,НовоеЗначениеСсылка. Причину замены ссылок на строковый УИД понимаю (дабы дать возможность удаления объектов), но … так удобнее строить отчеты и проводить анализ

    Изменение небольшое и банальное, находится в процедуре РегистрацияИзмененийСделанныхВОбъектах.ДобавитьЗаписьВЖурналИзменений() — так что каждый может сам решить — надо оно ему или нет и отредактировать процедуру без нарушения всего механизма в целом

    2. Сделал настройку набора отслеживаемых объектов. Идея «тюнинга» от SAS99, но одним реквизитом «отслеживать» для всего объекта (справочника или документа) у него и ограничилось, так что …несерьезно это как то (хотя за идею и форму справочника настроек — спасибо).

    Сделал полную настройку — как реквизитов шапки, так и реквизитов табличных частей

    3. Ввел понятие «информационный реквизит». Смысл в следующем — допустим, мы изменили реквизит табличной части Количество. Зарегистрируется запись «изменился реквизит Количество с А на Б в строке X документа Y». Такая запись от человека, анализирующего изменения, однозначно требует дополнительных уточнений, так как не очень то информативна.

    Зато запись «Номенклатура:Яблоко, Количество изменилось с А на Б. строка X. Документ Y» уже более информативно и может даже не потребовать дополнительной детализации.

    Информационный реквизит — реквизит, который вносится в журнал, дополняя информацию об изменении отслеживаемых реквизитов.

    Настраивается в том же СправочникеНастроек. Как для реквизитов Шапки так и для ТабличныхЧастей

    4. Добавил настройку ключевых полей.

    В алгоритме alexer строки сверяются по всем реквизитам, имеющим непримитивный тип. в результате, например, при смене в строке ТЧ реквизита «Страна» имеем полный комплект «Строка удалена» + «Строка добавлена». Особенно в сочетании с настройкой отслеживаемых объектов (контроль реквизита «Страна», у примеру, нас не интересует) выглядит ужасно неудобно.

    Добавил в Настройки признак реквизита ТЧ «Ключевое». Если ключевые поля отмечены — сверка строк идет по ключевому набору, если нет — по алгоритму alexer. В вышеприведенном случае при указании ключевого поля «Номенклатура» будем иметь запись в журнале «строка изменена»

    5. «Наследственность». Механизм alexer’а дополнен, а не кардинально изменен — при замене необходимо лишь заполнить справочник «Настройки» — при указании всех галок «Отслеживать» без изменения прочих (Информационный реквизит, Ключевой реквизит) механизм будет работать абсолютно точно так же как исходный

    // ах да. еще нужно будет подправить п.1, если идея с хранением ссылок на объекты бд мешает

    Сейчас буду тестировать на УТ 10.3

    Если нужно (и можно) — выложу здесь этот очередной «тюнинг»

    Reply ↓
  82. Murom

    Давно использую этот механизм.

    Работает как часы.

    НО с недавнего времени встала необходимость отслеживать изменения в контактной информации в контактных лицах контрагентов. А информация эта храниться в отдельном регистре сведений и не регистрируется.

    Может кто-то пробовал прикрутить регистрацию изменений в регистрах сведений ?

    Reply ↓
  83. Raminus

    Надо будет глянуть и оценить. Ставлю плюсик авансом, что бы не забыть 🙂

    Reply ↓
  84. Alex-dmtr

    Спасибо

    Reply ↓
  85. internetname

    Спасибо, опробую.

    Reply ↓
  86. z8491

    Скажите плиз на УПП платформа 8.2 заработает?

    Reply ↓
  87. alexer

    (87) z8491, На любой конфигуации под обычным приложением

    Reply ↓
  88. z8491

    При попытки объеденить пишит несовместимая конфигурация (

    Reply ↓
  89. z8491

    Точнее Cтpуктуpa кoнфигуpaции нecoвмecтимa c тeкущeй вepcиeй пpoгpaммы.

    Reply ↓
  90. alexer

    попробуйте открыть сначала файл cf в конфигураторе и переконвертировать его

    Reply ↓
  91. z8491

    (91) alexer, да спасибо, уже допер, но все равно спасибо за подсказку

    Reply ↓
  92. dyak84

    Автор подскажите каствомк будет проходить работа с большими базами да них на SQL и огоромным количеством пользователей. Подвисать не будет. А можно как то организовать хранение етой базы в отдельной базе. Зарание спасибо за ответ.

    Reply ↓
  93. alexer

    (93) dyak84, Реализовывал подобный проект, когда часть журнала хранится в самой базе, например за год, а остальная часть хранится в другой базе отведенной специально для журнала событий, и при необходимости просмотра старых логов происходит подключение к архивной БД по OLE. Для очищения рабочей базы, примерно раз в квартал, делается переброска данных в базу логов из рабочей базы за некий период. По поводу подвисания, все зависит от мощности сервера.

    Reply ↓
  94. elv1988

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

    Reply ↓
  95. dyak84

    (94) Много уважаемый alexer Думал справится Сам с идеей архивации справочника Журналрегистрации при больших обэмах даных, но увы выгрузку с последующим удалением из основной базы настроил но вот как заставить адекватно и вразумительно просматривать записи в архивной базе ето как то никак не получается. Получается следующая картинаПодскажите пожалуйста как ето дело довести до ума. Зарание спасибо за ответ

    Reply ↓
  96. alexer

    (96) dyak84,

    Я разделил ТЗ истории на две таблицы: таблица текущей базы и таблица архива, и подключаю архив по необходимости.

    Судя по скриншоту, Вы не преобразовываете строковую ссылку в значение — функция ЗначениеИзСтрокиВнутр().

    Reply ↓
  97. dyak84

    (97)По сути не все получается преобразовать ошибочка не дает ето зделать

    Форма.УправлениеЖурналом.Форма(56)}: Ошибка при вызове метода контекста (ЗначениеИзСтрокиВнутр)

    Стр.НовоеЗначение = Строка(ЗначениеИзСтрокиВнутр(стр.НовоеЗначение ));

    по причине:

    Ошибка преобразования

    по причине:

    Ошибка формата потока

    Подскажите как решить етот вопрос

    Reply ↓
  98. NoRazum

    Обработка использую во многих местах работает отлично.

    Но есть магазин с РИБ. Решил дописать чтоб можно было видеть с какого узла пришли изменения.

    Добавил еще реквизит в справочник, изменил обработку чтоб дописывала в реквизит.

    При дописывании еще подумал зачем условия отсекающие если обмен?

    Обновил конфу. Сделал обмен.

    На следующий день произошел FAIL.

    При получении нового элемента через обмен записывался в журнал, но ГУИД стали разные.

    Долго разбирался. Оказалось что из-за моей дописки.

    Чтоб не наступали на грабли.

    Reply ↓
  99. Evgeniy

    (98) dyak84,

    Обнаружил такую же ошибку.

    {Обработка.ИсторияИзмененияОбъектов_AEMZ.Форма.Форма.Форма(77)}: Ошибка при вызове метода контекста (ЗначениеИзСтрокиВнутр)

    РеквШапки.ДоИзменения = ЗначениеИзСтрокиВнутр(СтрокаРеквШапки.СтароеЗначение); // alexer 28.12.09

    по причине:

    Ошибка преобразования

    по причине:

    Ошибка формата потока

    Насколько понял из кода, ошибка возникает из-за того что реквизиты «СтароеЗначение» и «НовоеЗначение» имеют длину всего 100 символов и когда изменяемый реквизит в документе (справочнике) длиной больше 100 символов, то возникает вот такая проблема, т.к. обрезается служебная закрывающая кавычка.

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

    Reply ↓

Leave a Comment

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