<?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='\
Разве это не типовой функционал БСП?
https://its.1c.ru/db/bsp302doc#content:1858:1:issogl1_%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80_%D0 %B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8_%D0%B8%D0%B7%D0%BC%D 0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5% D0%BA%D1%82%D0%B0
Документация:
Можно перейти к отчету по всем версиям объектов и отобрать в каких версиях конкретные интересующие реквизиты менялись…
«Найти решения не удалось» — садись, два. Идите учить БСП и на пересдачу.
(1) круто придумали!
что еще я не знаю?
(2) не кидайте камнями — это легче всего, покажите путь и дайте фонарь
(4) Открываем конфигурацию «Библиотека стандартных подсистем» и изучаем подсистему «Версионирование объектов».
Что же вы там за «проекты» делаете с такими знаниями типовых подсистем ?
(5) Хорошо, простой вопрос — какая функция мне вернет одно значение — кто изменил реквизит?
(1) Абсолютно верно, именно об этом и и писал в самом начале статьи, рад что вы «Внимательно» прочитали
(1)
(2) Товарищ магистр БСП, подскажите неучу каким образом можно получить в отчет на СКД кто изменил тот или иной реквизит
(9) Не подскажу, так как это нафиг никому не нужная вещь , есть типовой отчет сравнения версий вызываемый из любого объекта подключенного к подсистеме.
Но вы всегда можете изобрести велосипед под хотелку заказчика, ваше право.
(10)т.е. нет такого функционала в БСП? Или Вы плохо знаете БСП?
Про типовой отчет сравнения версий написано ещё в начале статьи, и почему он не используется в некоторых случаях.
(11) Т.е. заполнить левую форму отбора набором параметров проще, чем пару раз ткнуть?
Ответ на вопрос-то где? «Почему нельзя просто посмотреть сравнение версий объектов ткнув туда, потом туда, затем туда и потом ещё два раза». Что улучшено? Как было, как сейчас? Почему это лучше в вашем сценарии? Почему в общем случае лучше БСП, а не ваш сценарий?
Где ответы на вопросы? Я вижу портянку текста кода и поноса мыслей, простите, а ответа на то почему стало лучше решать главный вопрос «КТО ПОСЛЕДНИЙ МЕНЯЛ?!?» не вижу.
(12)Левая форма была как пример использования функций.
Для анализа изменений одного реквизита одной реализации пользователю нужно сделать 5 действий и проанализировать портяночный отчет, что бы посмотреть кто сделал последним изменение.
Вопрос — сколько нужно действий что бы проверить 1000 реализаций?
(12) все ответы в конце статьи, зачем использовать эти функции, их минусы и плюсы.
Данный функционал можно так же прикрутить к кнопке на форме документа, которая будет возвращать вам информацию о том, кто последний изменял скидки в заказе по которому сделана реализация или к примеру того, кто изменил условия оплаты договора перед тем, как провести реализацию и т.д.
(14) т.е. это не общее решение, а точечно, да еще и программировать надо…
и это вместо того, чтобы, считаем:
1. перейти на вкладку
2. открыть форму отбора реквизита по которому надо найти изменения
3. применить отбор
4. нажать кнопку сравнения версий
Вот если выбирать что проще, написать отчет или сделать кнопку с выводом или это же сделать в форме отчета бсп в режиме пользователя, что проще?
(13) Зачем проверять 1000 реализаций? Какая проблема решается?
Не понял. Что это за регистр ВерсииОбъектов ?
Разве в новой платформе версионирование не встроено ?
в любом случае, какая ни была статья, обсуждение полезно
(16)Например проблема кто и когда менял документы за определенный период. Этого отчета очень нехватает в типовых конфигурациях. Клиент хочет знать простой ответ, кто менял какие документы.
(17) Да, все верно! Есть типовое решение которое позволяет в рамках одного документа посмотреть его версии (если включено версионирование), но порой не хватает отчета который покажет массово объекты и пользователей их изменяющие.
(16) Допустим отдел аналитики хочет понять, кто из ответственных обособленных подразделений выставляет больше скидок, а кто больше наценок за прошедший год для премирования.
(18) Абсолютно верно!
(15) С точки зрения программирования — проще отправить пользователя в типовой. Это не замена ему, а расширение. Для решения локальной задачи в рамках одного объекта, в большинстве случаев, лучше использовать типовой вариант. Данное решение имеет место быть если нужно получать информацию по большому объему объектов.
(19) Журнал регистрации?
(21) Зачем для такого отчета версии? Для премирования надо использовать реальные продажи и реальные полученные деньги, а не скидку, которая потом была отменена. Да и вообще строить отчет с аналитикой для принятия управленческого решения по данным из документа, а не из регистра, это моветон.
Можно ли по регистру сведений получить срез последних и показать отдельной колонкой к примеру в справочнике контрагенты (форма списка) дату и автора последних изменений (и вообще имеет ли смысл записывать признак изменения и авторство в элемент справочника партнеры при модификации к примеру соглашения или условий договора) вместо/по аналогии с типовой датой создания и менеджером?
(24) можешь пример отчета из такого журнала привести.Период месяц показать все реализации которые менялись в этом месяце.
(27) Администрирование, Обслуживание, Журнал регистрации, Установить отбор: Интервал, События, Метаданные.
(26) В том и проблема, что нельзя напрямую, т.к. данные (дата и автор версии) хранятся в регистре в хранилище значений как двоичные данные и запросом пока нет технической возможности получить, для этого нужны данные функции.
Мог зайти человек создать контрагента и записать его номер телефона. Следом зашёл другой человек и изменил номер, но допустил ошибку, вот можно использовать эти функции, что бы рядом с номером указывать того, кто этот номер ввёл и какой он был раньше.
(25) Это как пример и причины могут быть использовать именно версии.
На местах могут работать команды которые заводят и редактируют данные в хаотичном порядке. Менеджером продажи выступает один человек, о ценах договаривался другой человек, отгрузку и логистику рассчитывал третий человек, и если изначально не реализовано техническим, что фиксируется кто последний менял, а потом за год хотят получить эти данные, то журнал регистрации не несёт в себе ни какие были данные, ни когда их устанавливали. А когда штат работающий с 1с переваливает за 1к пользователей с каждой обособкой разбираться никто не захочет, но данные требуют уже вчера. По этому и приходится делать варварские решения (почему они не эффективны тоже описано в статье), но предоставляющие необходимые данные. Бывают и другие жизненные ситуации когда данные можно получить из регистра версий, но как правило приходилось отказывать клиентам.
(25) С опытом, и в Вашей практике появятся задачи требующие решения, пусть и не самого рационального на первый взгляд и это не единственный случай.
(28)И он тебе покажет все документы которые записывал менеджер за месяц. а нужны только дважды записанные.
Устарело.
В текущих версиях можно использовать ИсториюДанных.
Ну или журнал регистрации будет интересней, чем версионирование.
Надеюсь в скором будущем 1С откажется от этой подсистемы в пользу ИсторииДанных