История хранения данных. Теперь в составе платформы




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

70 Comments

  1. o.nikolaev
    После первых 10 скачиваний — при наличии позитивных отзывов планирую повышение цены.

    Это вот прям, гениальный маркетинговый ход, если честно.

    Reply
  2. vasilev2015

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

    Reply
  3. vshish

    Да тоже скачивал эту платформу для посмотреть историю.

    Но до подробных игр не дошло.

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

    Минус. это надо устанавливать режим совместимости 8.3.11

    Для старых конфигураций может быть неприменим.

    Reply
  4. vasilev2015

    Здравствуйте !

    (3)

    можно ли выбрать запросом например какие изменения были сделаны определенным пользователем

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

    Reply
  5. Jockered
    «Для табличных частей это свойство не имеет смысла»

    Почему? Ведь большинство изменений происходит именно в ТЧ. И данный механизм поддерживает отслеживание изменений в ТЧ.

    Reply
  6. vasilev2015

    (5) я подразумевал, что для каждого реквизита табличной части это свойство задается отдельно, а в целом у табличной части нет такого свойства. Добавил фото экрана к статье.

    Reply
  7. script

    Интересно как создаются версии? Тупо при каждой записи объекта или происходит сравнение того что изменилось? И записываются только изменения — это было бы логично.

    Reply
  8. maikl007

    (7)Данные истории мы храним в отдельных таблицах информационной базы. Для повышения эффективности мы храним только разницу между версиями данных. Если у вас есть «тяжёлый» документ с большим количеством строк в табличной части, а вы меняете только один реквизит в самом документе, то в истории данных сохранится только одно это изменение. То есть у вас не будет храниться множество копий этого объекта, и занимать место на диске

    Reply
  9. pnamik

    «Откроем обработку «НастройкаХраненияДанных», которая позволяет изменять настройки в режиме предприятие и находить отличия.»

    Где эта обработка? Как открыть эту обработку?

    в 8.3.11.2831 и конфигурация Розница 2.2.7 другая картина

    http://prntscr.com/hb2qm3

    Reply
  10. vasilev2015

    (9) Обработку написал сам, для этой статьи. Находится в приложенном файле. Если нужна помощь — обращайтесь.

    Reply
  11. Win98

    (8) Прошу прощения, а вы это кто? Таки мы тоже тестируем данный механизм. Получаем множество записей в истории немеющих различий между собой, такое ощущение что при каждом нажатии «Записать» (или вызове Записать()) не зависимо от того были изменения или нет создается запись в «истории данных». Это такая фича?

    Reply
  12. AnotherSide

    (8) это выдержка с Зазеркалья, т.е. текст от разрабов

    (11) подтверждаем, версии создаются при любой перезаписи объекта, даже без изменений.

    Шикарная экономия места на диске…

    Reply
  13. poyson

    Надо брать, дайте две :)…

    Reply
  14. Yashazz

    И теперь ещё года три эта хрень будет косячить, терять данные, сбиваться и тд. Нетушки. Лучше уж проверенными способами, если на рабочих-то проектах. Как-то неохота объяснять клиентам, что это «новая фича глючит, все вопросы к 1С».

    Reply
  15. vasilev2015

    (14) Здравствуйте, Яков ! Обычно Вы характеризуете мои статьи емким словом «боян». И поэтому мне пришлось написать первую на сайте (а может и вообще) статью про историю хранения данных. Налицо прогресс ))) Спасибо.

    Reply
  16. maikl007

    (11) Доброе время. Это выдержка из статьи 1с, по поводу данного механизма истории…

    Reply
  17. Yashazz

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

    Так что натурально рад за Вас. Честно, рад.

    Только вот описывать «свежак» от 1С — неблагодарное дело. Я, помнится, накатал статью об особенностях порядка выполнения обработчиков событий в расширениях форм, а они бац, и переделали всё. Так и с этой «историей изменений» стопицот раз ещё всё поменяется.

    Reply
  18. tunesoft

    (1) что в файле для скачивания ?

    Внутри платформы уже есть визуальные инструменты для просмотра, сравнения и восстановления версий.

    Reply
  19. tunesoft

    (9)обработки встроены в платформу 8.3.11

    Reply
  20. rusinfostart

    обработка «Восстановить данные», это что-то новенькое, попахивает увеличением места, но как идея очень хорошо.

    Reply
  21. vasilev2015

    (18) файл — архив конфигурации с обработками, написанными специально для этой статьи. С примерами использования новых программных методов языка 1С.

    Встроенных инструментов платформы не нашел. Если у Вас есть — подскажите, где.

    Reply
  22. tunesoft

    (21) в форме элемента справочника нажать «Ещё — История изменений».

    Откроется форма, в которой есть отборы, переход на версию, сравнение и тп

    К сожалению стандартный язык запросов 1С не позволяет получать данные по изменениям, можно использовать только специальную функцию для выборки изменений.

    Reply
  23. vasilev2015

    (22) Увидел, спасибо )). Появляется только для тех объектов, у которых история включена.

    Reply
  24. Tolpinski

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

    Так пришлось вставить проверку на количество записей, больше 100к не пишет, а такое количество легко достигается в ЗУП, в расчетных документах.

    Как тут с таким, изменение порядка строк будет считаться изменением?

    Reply
  25. bad_wag

    Выдержка из документации к платформе 8.3.11

    Состояние объекта с точки зрения механизма истории данных можно условно разбить на две части:

    1. настройки истории данных, сделанные в конфигураторе;

    2. настройки истории данных, сделанные в режиме «1С:Предприятия».

    Кто нибудь знает где искать эти настройки в режиме Предприятия?

    Reply
  26. vasilev2015

    Здравствуйте ! я тоже долго искал. Сначала написал свой интерфейс, потом подсказали меню «ЕЩЕ», смотрите коммент 22.

    Reply
  27. bad_wag

    (26) В комментарии 22 написано как посмотреть история изменений, а мне не понятно как ВКЛЮЧИТЬ или выключить эту историю для объектов в режиме предприятия

    Reply
  28. vasilev2015

    (27) Здравствуйте ! Включить или выключить историю изменений можно с помощью программного кода. К статье приложена конфигурация с утилитой, которая позволяет это сделать.

    Reply
  29. bad_wag

    (28) Да как это сделать с помощью программного кода это понятно и в документации очень подробно все расписано. Но как я писал (25) там так же упоминается возможность включения истории для объектов в режиме предприятия, но ГДЕ и КАК это делается почему-то ни слова не написано…

    Reply
  30. vasilev2015

    (29) Здравствуйте ! Да, действительно. Мне было проще написать утилиту, чем искать. Как говорится: моя не читатель, моя — писатель. ))

    Дайте пожалуйста обратную связь, когда разберетесь ))

    Reply
  31. VasilVtoroy

    (12) Создается только запись о факте записи версии. Если не было изменений — то никакие больше данные в ней не храняться. Поэтому много места даже много таких версий не съедят

    Reply
  32. sokir

    А если из 100 строк ТЧ документа удалена первая, то что за различия выдаст этот механизм?

    Выдаст типа — изменено 99 строк и в каждой менялась номенклатура с количеством и ценой и суммой и т.д.?

    Reply
  33. VasilVtoroy

    (32) Нет, он покажет удаление одной строки

    Reply
  34. memb3r

    Под полными правами команда «История изменений» в форме элемента видна, а как её добавить пользователю с базовыми правами?

    Дал пользователю права на роли «ЧтениеВерсийОбъектов» и «ЧтенииИнформацииОВерсияхОбъектов», но не помогло. Команда скрыта.

    Reply
  35. Jokemas

    (22) Вот прямо зря. автор маркетинговый ход использует с повышением цены, чтобы быстрее накачали, а вы совет бесплатно даете. Рыночные отношения должны быть рыночными. Раз уж автор проявляет излишний интерес к sm, значит и сам должен за информацию платить =))). Коммерсанты блин. =)

    Reply
  36. Светлый ум

    (9) Обработка интересную вещь содержит — настройки конфигуратора, но в общем чисто Интерфейсная

    Чтобы добавить объект в версионироване БСП, должно выполниться три условия:

    — Добавить в определяемый тип: «ВерсионируемыеДанные»

    — Добавить в подписку на событие: «ЗаписатьВерсиюОбъекта»

    — у реквизитов должно быть установлено свойство: «История данных» — использовать

    Настройки версионирования (вкл/выкл) объектов делаются на стороне пользователя: в регистре «Настройки версионирования объектов».

    Reply
  37. vova-1c

    Почему если изменить значение «История данных (Предприятие)»

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

    Почему у приходной в форме документа есть команда Еще — История изменений,

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

    Аналогично, если у приходной снять флаг Изменение данных, то команда Еще — История изменений не пропадает.

    Как добавить или убрать эту команду?

    Reply
  38. vasilev2015

    (37) Здравствуйте !

    Посмотрите определяемый тип «ВерсионируемыеДанные..»

    Более подробно сказать не могу — не знаю, какая у Вас конфигурация.

    Reply
  39. vova-1c

    Ок

    Reply
  40. vova-1c

    У Вас нет никакого определяемого типа «ВерсионируемыеДанные..»

    Reply
  41. vova-1c

    может ли повлиять версия платформы ?

    Reply
  42. vasilev2015

    (40) тут посмотрите

    Reply
  43. clition

    В Вашей выложенной конфе нет такого определяемого типа

    Reply
  44. vasilev2015

    (43) я думал, vova-1c задает вопрос по прикладной конфигурации, а не по приложенной к статье конфигурации. Постараюсь за выходные ответить.

    Reply
  45. vova-1c

    ОК спасибо

    Reply
  46. acanta

    Спасибо за публикацию, очень хорошо обьясняет.

    Поскольку хранение истории настраивается, разница между версиями храниться не может, только вся версия на момент записи.

    И каким бы не был это механизм, реквизита в справочнике/документе он не заменяет.

    Reply
  47. clition

    (44) не появляется команда «История изменений» в форме объекта при включении истории данных через предприятие

    Reply
  48. vasilev2015

    (47) Здравствуйте !

    Это в приложенной конфигурации или в другой ?

    Reply
  49. clition

    (48) В приложенной

    Reply
  50. vasilev2015

    (49) Извините, что медленно отвечаю. Большая загрузка на работе.

    Reply
  51. clition

    (50) вопрос актуален

    Reply
  52. vasilev2015

    (51) Здравствуйте !

    посмотрел: действительно в меню документа Поступления есть история, в меню документа Реализация — отсутствует, хотя в конфигурации между этими документами нет различий. Это системное меню, определяется кодом 1С в файле mngbase_root.res. Разбираться с этим файлом смысла не вижу — его изменение может расцениваться как нарушение лицензионного соглашения. Чтобы меню было одинаково в обоих документах — следует добавить его программно на обе формы.

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

    Reply
  53. vasilev2015

    (37) Здравствуйте ! постарался ответить. Добавил СМ, чтобы кто-то ответил лучше.

    Reply
  54. clition

    (52) Если у вас нет ответа на этот вопрос, то об этом, наверное, следует сказать в статье, потому как, я, например, качал эту обработку только для того, чтобы разобраться с этой проблемой, но смысла в этом не оказалось.

    Reply
  55. vasilev2015

    (54) Здравствуйте !

    Проблема интерфейсная, при чем здесь обработка ?

    В статью включать не буду: народ по комментариям поймет, что ему нужно.

    Выставил аццкое вознаграждение. Кто-то ответит.

    Reply
  56. user703966_martynyuknatalia

    а много места тратиться на запись инфи?

    Reply
  57. vasilev2015

    (56) Здравствуйте !

    История размещается в тех же таблицах, что и основные данные.

    Две версии объекта занимают в два раза больше места, чем одна.

    Место зависит от количества версий.

    Если объект много-много раз изменяется, нужно ли хранить его историю ?

    Reply
  58. dtripleh

    Настроена история данных для двух справочников. Но почему-то на форме одного справочника в меню Ещё есть команда «История изменений», а на второй форме нет такой команды. С чем может быть связано?

    Reply
  59. vasilev2015

    (37) (58) Здравствуйте, уважаемые коллеги !

    Это самый популярный вопрос по статье.

    Сам ответить не могу, объявил вознаграждение 5 СМ тому, кто ответит.

    Чувствую свою ответственность.

    Reply
  60. dtripleh

    Все, я понял, почему команда «История изменений» не видна на форме.

    Необходимо запустить базу в режиме обновления, как вариант с ключом «/C ЗапуститьОбновлениеИнформационнойБазы»

    Reply
  61. vasilev2015

    (60) Вы попробовали и у Вас получилось, или это предположение ?

    Reply
  62. dtripleh

    (61) Я настроил историю для одного справочника, перезашел в базу и смотрю, что команда не появилась. Запустил базу в режиме обновления с ключом, и только после этого команда появилась.

    Предлагаю всем попробовать, у кого была такая проблема (странно, что об этом в описании не написано).

    Reply
  63. vasilev2015

    (62) Здравствуйте, коллега !

    попробовал, у меня НЕ получилось.

    На картинке нет пункта «История» в меню «Действия» документа Расходная накладная.

    платформа 1С:Предприятие 8.3 (8.3.12.1714), серверная.

    Моей сообразительности хватает только на то, чтобы предложить вознаграждение.

    :)))

    Reply
  64. dtripleh

    (63) какая конфигурация?

    Reply
  65. vasilev2015

    (64) Здравствуйте !

    конфигурация, которая приложена к статье.

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

    вознаграждение в силе.

    Reply
  66. frkbvfnjh

    А что за форма sysForm:DataHistoryVersions, это вообще законно? Что за названия форм такое, в документации где нибудь описано такое, или может есть русскоязычные аналоги?

    Reply
  67. vasilev2015

    (66) Здравствуйте !

    название формы спрятано в одном из служебных файлов.

    смотреть туда — законно, изменять — нет.

    Reply
  68. frkbvfnjh

    (67) Как и кто вообще до этого додумался, есть предыстория? Может тут статейка есть где-то, которую я не видел, по этому поводу? Где или как можно получить полный перечень sysForm?

    Reply
  69. vasilev2015

    (68) Ищите на ИС имя файла mngbase_root. Есть статья «Недокументированное использование…»

    Reply
  70. frkbvfnjh

    (69) Спасибо, ваще улёт! Но там ничего не сказано про непосредственное открытие этих форм через префикс sysForm:. Там в комментариях был прямой вопрос

    А как программно открыть такую форму?

    и ему ответили, что без выноса во внешнюю обработку — никак, а тут оказывается, что можно. Хочется понять как догадались использовать префикс sysForm:

    Reply

Leave a Comment

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