<?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='\
Это вот прям, гениальный маркетинговый ход, если честно.
Спасибо. Но у меня остается слабая надежда, что программирую я лучше, чем продаю. С другой стороны, старт мани у меня не ассоциируются с деньгами. Только для развлечения.
Да тоже скачивал эту платформу для посмотреть историю.
Но до подробных игр не дошло.
конечно. очень интересо в каком виде хранятся данные, и можно ли выбрать запросом например какие изменения были сделаны определенным пользователем. или кто изменял опеределенные реквизиты.
Минус. это надо устанавливать режим совместимости 8.3.11
Для старых конфигураций может быть неприменим.
Здравствуйте !
(3)
Да, можно, только не запросом. В документации описаны возможные отборы перед получением таблицы версий. Их слишком много, я не стал их программировать. Отбор по пользователю есть.
Почему? Ведь большинство изменений происходит именно в ТЧ. И данный механизм поддерживает отслеживание изменений в ТЧ.
(5) я подразумевал, что для каждого реквизита табличной части это свойство задается отдельно, а в целом у табличной части нет такого свойства. Добавил фото экрана к статье.
Интересно как создаются версии? Тупо при каждой записи объекта или происходит сравнение того что изменилось? И записываются только изменения — это было бы логично.
(7)Данные истории мы храним в отдельных таблицах информационной базы. Для повышения эффективности мы храним только разницу между версиями данных. Если у вас есть «тяжёлый» документ с большим количеством строк в табличной части, а вы меняете только один реквизит в самом документе, то в истории данных сохранится только одно это изменение. То есть у вас не будет храниться множество копий этого объекта, и занимать место на диске
«Откроем обработку «НастройкаХраненияДанных», которая позволяет изменять настройки в режиме предприятие и находить отличия.»
Где эта обработка? Как открыть эту обработку?
http://prntscr.com/hb2qm3
в 8.3.11.2831 и конфигурация Розница 2.2.7 другая картина
(9) Обработку написал сам, для этой статьи. Находится в приложенном файле. Если нужна помощь — обращайтесь.
(8) Прошу прощения, а вы это кто? Таки мы тоже тестируем данный механизм. Получаем множество записей в истории немеющих различий между собой, такое ощущение что при каждом нажатии «Записать» (или вызове Записать()) не зависимо от того были изменения или нет создается запись в «истории данных». Это такая фича?
(8) это выдержка с Зазеркалья, т.е. текст от разрабов
(11) подтверждаем, версии создаются при любой перезаписи объекта, даже без изменений.
Шикарная экономия места на диске…
Надо брать, дайте две :)…
И теперь ещё года три эта хрень будет косячить, терять данные, сбиваться и тд. Нетушки. Лучше уж проверенными способами, если на рабочих-то проектах. Как-то неохота объяснять клиентам, что это «новая фича глючит, все вопросы к 1С».
(14) Здравствуйте, Яков ! Обычно Вы характеризуете мои статьи емким словом «боян». И поэтому мне пришлось написать первую на сайте (а может и вообще) статью про историю хранения данных. Налицо прогресс ))) Спасибо.
(11) Доброе время. Это выдержка из статьи 1с, по поводу данного механизма истории…
(15) Здравствуйте) Понимаете, Николай, я и свои поделки так характеризую в большинстве случаев, и чужие) Хорошо, что сподвиг Вас написать статью. Я вот несколько своих статей недавно посмотрел — хрень полная, для моих коллег сгодится, а на ИС уже было и было лучше, ну и не стал выкладывать мусор, естессно.
Так что натурально рад за Вас. Честно, рад.
Только вот описывать «свежак» от 1С — неблагодарное дело. Я, помнится, накатал статью об особенностях порядка выполнения обработчиков событий в расширениях форм, а они бац, и переделали всё. Так и с этой «историей изменений» стопицот раз ещё всё поменяется.
(1) что в файле для скачивания ?
Внутри платформы уже есть визуальные инструменты для просмотра, сравнения и восстановления версий.
(9)обработки встроены в платформу 8.3.11
обработка «Восстановить данные», это что-то новенькое, попахивает увеличением места, но как идея очень хорошо.
(18) файл — архив конфигурации с обработками, написанными специально для этой статьи. С примерами использования новых программных методов языка 1С.
Встроенных инструментов платформы не нашел. Если у Вас есть — подскажите, где.
(21) в форме элемента справочника нажать «Ещё — История изменений».
Откроется форма, в которой есть отборы, переход на версию, сравнение и тп
К сожалению стандартный язык запросов 1С не позволяет получать данные по изменениям, можно использовать только специальную функцию для выборки изменений.
(22) Увидел, спасибо )). Появляется только для тех объектов, у которых история включена.
Используем свою наработку для хранения истории, честно скачанную и переделанную. История пишется в табличную часть справочника.
Так пришлось вставить проверку на количество записей, больше 100к не пишет, а такое количество легко достигается в ЗУП, в расчетных документах.
Как тут с таким, изменение порядка строк будет считаться изменением?
Выдержка из документации к платформе 8.3.11
1. настройки истории данных, сделанные в конфигураторе;
2. настройки истории данных, сделанные в режиме «1С:Предприятия».
Кто нибудь знает где искать эти настройки в режиме Предприятия?
Здравствуйте ! я тоже долго искал. Сначала написал свой интерфейс, потом подсказали меню «ЕЩЕ», смотрите коммент 22.
(26) В комментарии 22 написано как посмотреть история изменений, а мне не понятно как ВКЛЮЧИТЬ или выключить эту историю для объектов в режиме предприятия
(27) Здравствуйте ! Включить или выключить историю изменений можно с помощью программного кода. К статье приложена конфигурация с утилитой, которая позволяет это сделать.
(28) Да как это сделать с помощью программного кода это понятно и в документации очень подробно все расписано. Но как я писал (25) там так же упоминается возможность включения истории для объектов в режиме предприятия, но ГДЕ и КАК это делается почему-то ни слова не написано…
(29) Здравствуйте ! Да, действительно. Мне было проще написать утилиту, чем искать. Как говорится: моя не читатель, моя — писатель. ))
Дайте пожалуйста обратную связь, когда разберетесь ))
(12) Создается только запись о факте записи версии. Если не было изменений — то никакие больше данные в ней не храняться. Поэтому много места даже много таких версий не съедят
А если из 100 строк ТЧ документа удалена первая, то что за различия выдаст этот механизм?
Выдаст типа — изменено 99 строк и в каждой менялась номенклатура с количеством и ценой и суммой и т.д.?
(32) Нет, он покажет удаление одной строки
Под полными правами команда «История изменений» в форме элемента видна, а как её добавить пользователю с базовыми правами?
Дал пользователю права на роли «ЧтениеВерсийОбъектов» и «ЧтенииИнформацииОВерсияхОбъектов», но не помогло. Команда скрыта.
(22) Вот прямо зря. автор маркетинговый ход использует с повышением цены, чтобы быстрее накачали, а вы совет бесплатно даете. Рыночные отношения должны быть рыночными. Раз уж автор проявляет излишний интерес к sm, значит и сам должен за информацию платить =))). Коммерсанты блин. =)
(9) Обработка интересную вещь содержит — настройки конфигуратора, но в общем чисто Интерфейсная
Чтобы добавить объект в версионироване БСП, должно выполниться три условия:
— Добавить в определяемый тип: «ВерсионируемыеДанные»
— Добавить в подписку на событие: «ЗаписатьВерсиюОбъекта»
— у реквизитов должно быть установлено свойство: «История данных» — использовать
Настройки версионирования (вкл/выкл) объектов делаются на стороне пользователя: в регистре «Настройки версионирования объектов».
Почему если изменить значение «История данных (Предприятие)»
и нажать кнопку «Установить настройки», после повторного заполнения метаданных внесенные изменения не сохраняются?
Почему у приходной в форме документа есть команда Еще — История изменений,
а у расходной нет, в то время когда у расходной через предприятие я устанавливаю флаг Изменение данных на самом документе и через обработку «Восстановить данные» историю изменений вижу?
Аналогично, если у приходной снять флаг Изменение данных, то команда Еще — История изменений не пропадает.
Как добавить или убрать эту команду?
(37) Здравствуйте !
Посмотрите определяемый тип «ВерсионируемыеДанные..»
Более подробно сказать не могу — не знаю, какая у Вас конфигурация.
Ок
У Вас нет никакого определяемого типа «ВерсионируемыеДанные..»
может ли повлиять версия платформы ?
(40) тут посмотрите
В Вашей выложенной конфе нет такого определяемого типа
(43) я думал, vova-1c задает вопрос по прикладной конфигурации, а не по приложенной к статье конфигурации. Постараюсь за выходные ответить.
ОК спасибо
Спасибо за публикацию, очень хорошо обьясняет.
Поскольку хранение истории настраивается, разница между версиями храниться не может, только вся версия на момент записи.
И каким бы не был это механизм, реквизита в справочнике/документе он не заменяет.
(44) не появляется команда «История изменений» в форме объекта при включении истории данных через предприятие
(47) Здравствуйте !
Это в приложенной конфигурации или в другой ?
(48) В приложенной
(49) Извините, что медленно отвечаю. Большая загрузка на работе.
(50) вопрос актуален
(51) Здравствуйте !
посмотрел: действительно в меню документа Поступления есть история, в меню документа Реализация — отсутствует, хотя в конфигурации между этими документами нет различий. Это системное меню, определяется кодом 1С в файле mngbase_root.res. Разбираться с этим файлом смысла не вижу — его изменение может расцениваться как нарушение лицензионного соглашения. Чтобы меню было одинаково в обоих документах — следует добавить его программно на обе формы.
Возможно, Вас не удовлетворит мой ответ: в конфигураторе Вы видите то же, что и я. Поэтому я добавляю вознаграждение, чтобы кто-то мог предложить правильное решение и получить СМ. Если решения не будет, через один месяц вознаграждение сниму.
(37) Здравствуйте ! постарался ответить. Добавил СМ, чтобы кто-то ответил лучше.
(52) Если у вас нет ответа на этот вопрос, то об этом, наверное, следует сказать в статье, потому как, я, например, качал эту обработку только для того, чтобы разобраться с этой проблемой, но смысла в этом не оказалось.
(54) Здравствуйте !
Проблема интерфейсная, при чем здесь обработка ?
В статью включать не буду: народ по комментариям поймет, что ему нужно.
Выставил аццкое вознаграждение. Кто-то ответит.
а много места тратиться на запись инфи?
(56) Здравствуйте !
История размещается в тех же таблицах, что и основные данные.
Две версии объекта занимают в два раза больше места, чем одна.
Место зависит от количества версий.
Если объект много-много раз изменяется, нужно ли хранить его историю ?
Настроена история данных для двух справочников. Но почему-то на форме одного справочника в меню Ещё есть команда «История изменений», а на второй форме нет такой команды. С чем может быть связано?
(37) (58) Здравствуйте, уважаемые коллеги !
Это самый популярный вопрос по статье.
Сам ответить не могу, объявил вознаграждение 5 СМ тому, кто ответит.
Чувствую свою ответственность.
Все, я понял, почему команда «История изменений» не видна на форме.
Необходимо запустить базу в режиме обновления, как вариант с ключом «/C ЗапуститьОбновлениеИнформационнойБазы»
(60) Вы попробовали и у Вас получилось, или это предположение ?
(61) Я настроил историю для одного справочника, перезашел в базу и смотрю, что команда не появилась. Запустил базу в режиме обновления с ключом, и только после этого команда появилась.
Предлагаю всем попробовать, у кого была такая проблема (странно, что об этом в описании не написано).
(62) Здравствуйте, коллега !
попробовал, у меня НЕ получилось.
На картинке нет пункта «История» в меню «Действия» документа Расходная накладная.
платформа 1С:Предприятие 8.3 (8.3.12.1714), серверная.
Моей сообразительности хватает только на то, чтобы предложить вознаграждение.
:)))
(63) какая конфигурация?
(64) Здравствуйте !
конфигурация, которая приложена к статье.
если есть желание разобраться, но лень скачать — могу прислать.
вознаграждение в силе.
А что за форма sysForm:DataHistoryVersions, это вообще законно? Что за названия форм такое, в документации где нибудь описано такое, или может есть русскоязычные аналоги?
(66) Здравствуйте !
название формы спрятано в одном из служебных файлов.
смотреть туда — законно, изменять — нет.
(67) Как и кто вообще до этого додумался, есть предыстория? Может тут статейка есть где-то, которую я не видел, по этому поводу? Где или как можно получить полный перечень sysForm?
(68) Ищите на ИС имя файла mngbase_root. Есть статья «Недокументированное использование…»
(69) Спасибо, ваще улёт! Но там ничего не сказано про непосредственное открытие этих форм через префикс sysForm:. Там в комментариях был прямой вопрос
и ему ответили, что без выноса во внешнюю обработку — никак, а тут оказывается, что можно. Хочется понять как догадались использовать префикс sysForm: