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




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

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 не будет опубликован. Обязательные поля помечены *