<?php // Полная загрузка сервисных книжек, создан 2025-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='\
(0)
После 1С:Эксперта «заболел» регулярками?
в Notepad++ можно писать макросы, зачем тогда скрипт?
думаю для того чтобы написать макрос и ничего не качать
Спасибо, добрый человек.
(1) да, это заразно.
Круто
Может я чего-то не понимаю, но судя по скриншоту не применен фильтр «дважды измененные». Зачем такой геморрой себе придумывать?
(6) Здравствуйте !
Как правило, при обновлении я использую этот фильтр.
Но если искать разницу между двумя конфигурациями по предложенной методике, то такой фильтр не нужен:
1. Расхождение между формами могло появиться в предыдущем обновлении,
в результате прыжка через несколько релизов.
2. Список дважды измененных объектов тоже может быть большим. Работает команда программистов.
За всеми не уследить, а в результате работы скрипта получается несколько строк. Проще контролировать.
(2) Здравствуйте !
Выкладывайте макрос. Плюс заочно.
«супер-пупер мега скрипт» сохранен в кодировке utf-8 (re.sh)
При запуске получаю ошибки:
(9) Подправил в строках awk, поставив двойной \
(9, 10) Здравствуйте !
я ввожу скрипт в командную строку консоли, у меня те же сообщения,
но это правильно: символами * и . я обозначил звездочку и точку.
С двумя косыми сообщения пропали, результат работы остался неизменным ?
Главное, чтобы файл ОтчетОСравнении.txt был в кодировке utf8.
Интересно: какой результат у вас выдает скрипт ?
(11) Добрый день. Написал в личку.
(12) Спасибо, мне интересно. В движениях показаны добавленные регистры с локальным префиксом. Это немного странно: если в окне сравнения рабочая конфигурация слева, а конфигурация поставщика справа — то должны показываться добавленные типовые регистры, они без префикса. Чтобы результат стал чище, вместо символов — <— в скрипте по движениям давайте использовать — <—Регистр (внесу правку в статью). Попробуйте — пришлите результат в личку.
(13) Только вечером, т.к. все действия были на личном компьютере.
(14) и еще в файле ОтчетОСравнении.txt посмотрите пожалуйста
ключевые слова Имя — Различаются значения
и ключевые слова <—Реквизит, <—Колонка реквизита, <—Параметр
маловероятно что различий нет
(15) Таких ключевых полей в отчете нет. Отчет — итог сравнения с конф поставщика в базе, а не конф поставщика обновленной.
Вот такие слова только встречаются:
Ну и добавленные нетиповые реквизиты:
— —>Справочник.Контрагенты.Реквизит
(16) приложил пример добавления реквизита на форму.
(17) вот у меня в отчете добавленный реквизит
Очень может быть, что результат без этих строк, т.к. я неправильно в скрипте поменял эти стрелки…
(18) на картинке не реквизит, а элемент формы. я такие случаи пробовал искать, но не удалось сформулировать скрипт корректно.
Если префикс «т_» является префиксом разработки, и поскольку добавлен элемент с префиксом разработки —
значит последовательность сравнения конфигураций должна быть другая.
Слева основная конфигурация, справа — конфигурация производителя (как на картинке в статье).
(19) Первая строка — как раз добавленный реквизит. И потом он же выведен на форму.
Сравнение конф так и производилось. Первая — основная, вторая — поставщика.
(20) сообразил: т_ЦФО это реквизит объекта и он добавлен на форму как элемент.
Скрипт из статьи находит только добавленные реквизиты формы и параметры формы.
Реквизиты объекта как правило, успешно добавляются при обновлении.
А элементы формы я не смог описать в скрипте.
До той поры, пока 1сники не нарисуют лишнюю запятую в отчете о сравнении..
(22) Здравствуйте !
Автор придерживается тех же взглядов.
Поэтому фраза с вопросом и не в конце статьи, а между третьим и четвертым примером.
У меня методика обновления измененной конфы примерно следующая.
1. Делаю краткий отчет о сравнении текущей рабочей конфигурации и текущей типовой конфигурации. Получаем список объектов которые были изменены.
2. Делаю краткий отчет о сравнении текущей типовой конфигурации и новой типовой конфигурации. Получаем список измененных объектов в типовой конфигурации.
3. Сравниваем список объектов из 1 и 2. Объекты присутствующие в обоих списках требуют контроля при обновлении. А убрав из списка 2 совпадающие объекты, получаем объекты которые обновляем на автомате (тупо ставим галочку при обновлении).
Конечно есть масса особенностей и граблей.
— Порядок объектов. В большинстве случаев абсолютно не критично (но может создать большой размер файла о сравнении). Теоретически можно почистить от этой информации файл сравнения. Если у изменяемого объекта меняется ТОЛЬКО порядок, то можно убрать и сам объект из файла о сравнении.
НО, наблюдаем потенциальную граблю — изменение порядка реквизитов (измерений, ресурсов для регистров) для документов (справочников, регистров и проч.). Если есть обмены в которых просто передаются объекты, то обмен может встать пока новая конфигурация не будет загружена в передающий и принимающий узел. То есть, если вдруг используется при приеме данных Объект = ПрочитатьXML() и хотябы порядок реквизитов не совпадает — объект не будет принят.
— Случай когда указывается что форма (обычная) отличается от формы в типовой конфигурации, хотя на самом деле это не так (и в ряде случаев можно обновлять ее просто заменив на форму из типовой). Как это получается. Изменили тип ревизита объекта и он выводится на данной форме (например в справочнике увеличили длину кода и сравнение будет показывать различия по элементу формы который выводит код).
— Случай когда при обновлении вроде на затрагиваются измененные процедуры и функции, а просто добавляются пара новых процедур. И можно не напрягая мозг просто добавить новые модули.
Возможные грабли — было процедура Расчет() в которой вы внесли изменения, а тут добавилась процедура Расчет2019() которая будет применяться с 01.01.2019. Если в новую процедуру не внести ваши изменения, то у пользователей могут возникнуть вопросы.
Ну и другие нюансы. Хотя, с развитием платформы в сторону Расширений, это все теряет актуальность. И если вдруг кому-то помог — буду рад.
(24) Здравствуйте !
Чем отличается пункт (3) от списка дваждыизмененных объектов, который формируется штатно ?
(25) Однажды, когда начинал заниматься обновлением, заметил что окно обновления почему-то не выделило объект который необходимо обновить. С тех пор не надеюсь на это окно. Хотя, возможно, платформа была устаревшая.
(26) Здравствуйте !
За полгода постоянных обновлений только один раз у меня было что-то подобное.
Поэтому я считаю, что типовой механизм очень надежный.
(27) Заметил один раз? Если полгода сравнений типового механизма с другой методикой — это одно. А если только заметил один раз — это другое. Вполне вероятно что не заметил еще раз 5 или 10.
Кроме того, имхо, не считаю надежным механизм, который работает непредсказуемо. Опять же, здесь как с бекапами — лучше сейчас потратить лишних полчаса, чем потом разгребать последствия полнедели без сна.
(27) Пожалуйста пример. Обновление УПП с 1.3.124.1 на 1.3.124.2.
Изменений кот наплакал. Но по дефолту общий модуль ИнтеграцияЕГАИССлужебныйКлиент не становится на обновление, хотя он в нашей конфе не изменялся. Можно заметить отличающийся квадратик в левой части, но у меня различающихся объектов порядка 10000, поэтому все просматривать весьма утомительно.
Плюс маленькая засада для юных падованов — дважды измененные объекты никак не выделяются на общей картине (смотреть на ветку Документы). И если начинающий специалист по обновлениям не знает куда смотреть то он может упустить это.
(29) Здравствуйте !
Похвально, что Вы так скурпулезно подходите к обновлению.
Вы анализируете файл ОтчетОСравнении.txt регулярками или другими средствами ?
(30) Здравствуйте.
Уровень скурпулезность работы зависит от сложности решения потенциальных проблем. Одно дело база на 5 человек. Другое дело база на 100 человек. И совсем отдельный случай когда база с филиалами по всей стране работает 24/7 и когда 1 час простоя это многмилионные убытки. У меня примерно второй вариант.
У меня для анализа 1с-обработка. На обычных формах и внутри мракобесие (делал одну функцию, со временем прикручивал доп. функционал, короче бардак, но работает).
Упрощенно — два отчета о сравнении (вид — краткий, текстовый), а) между стврой и новой типовой конфой и б)между текущей и типовой конфой нормализуются и сравниваются между собой. Получаем список дважды измененных объектов (получается это быстрее чем при процессе обновления (ну у меня точно), можно распечатать (и видеть не только в момент обновления), можно примерно оценить сложность обновления — как много дважды измененных и как много среди них форм (обновление дважды измененых обычных форм самая сложная проблема (когда элементы форм начинают появляться, исчезать).
Нормализация — приведение к виду «Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента».
Плюс учет разных граблей. Учитывать или нет изменение порядка. Отслеживать изменение в наименовании и прочее.
Если изменений достаточно много, то самый простой контроль. Отчет о сравнении (опять же вид краткий текстовый) между старой и новой ТИПОВЫМИ конфигурациями должен совпадать с отчетом о сравнении между предыдущей и обновленной рабочей конфигурациями.
Также должны совпадать отчеты о сравнении между рабочей и типовой конфигурациями до и после обновления. Это если нет ваших изменений в рабочую конфигурацию.
Опять же повторюсь — на перспективу смотрите на расширения конфигурации.
А если изменений много то воспользуйтесь услугой по обновлению. Если не вру — фирма ИжТиСи, пару лет назад прайс был 12К рублей за год.
(31) Здравствуйте !
Когда руководитель предложил мне делать обновления — я тоже его связал с ИжТиСи.
Они составили нам смету — догнать один год стоит около 1 млн, длительность обновления — три месяца.
Но три месяца — это долго ))) — поэтому решили делать самостоятельно.
(32) Догонять — это отдельная песня. И опять все упирается в количество измененных по сравнению с типовой конфигурацией объектов. Насколько я знаю, в ИжТиСи для обновления конфигурации делают через «Выгрузить конфигурацию в файлы», обновления, «Загрузить конфигурацию из файлов». А эта загрузка/выгрузка занимает много времени (если конфигурация не маленькая). Плюс вроде как у них проводится тестирование.
А руководителю можно рассказать старую историю — «быстро, качественно, не дорого» — выбирайте любые два параметра.
Самое главное «грамотно» вносить изменения в конфигурацию и проблем с обновлениями вообще не будет.
Какой-то геморр если честно. Вполне достаточно штатного функционала по сравнению и объединению, даже если очень сильно переписана конфигурация
На управляемых формах стало более менее понятно.
Но на обычных формах без детального анализа будет тяжеловато.