<?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='\
до кучи …
млин, как все заморочено. Куча копипастов, а если отвлекли в процессе, то заново? Просто разрыв моего скромного мозга.
У меня 5 конфигураторов сразу вообще не открываются 🙂
А как насчет создать инструмент для обновления измененных конф?
(3) Два последних нужны только для копирования. Их можно открывать при необходимости.
В некоторой степени это реализовано на уровне платформы в 1С:Предприятии 8 🙂
Спасибо за хороший материал, только-только приступила к программированию, сразу столько вопросов возникло. И приятно, что ответы тоже находятся 🙂
И вообще — спасибо всем на этом сайте, за то что делитесь своим опытом. Успехов Вам!
А как глобальник объединяешь?
Лично я пользуюсь своей методикой, выполняю объединение с помощью GComp + Kdiff3 + спец.скрипты для GComp
например, глобальник очень удобно разобрать на отдельные файлы для каждой процедуры/функции, и выполнять автообъединение на базе KDiff3 (3-стороннее объединение)
(6) Все правильно… И так тоже… Нет предела совершенству…
А точнее по поводу объединения — это зависит от количества внесенных изменений, если они вообще были в глобальном модуле. Иногда бывает быстрее перетащить несколько строк руками, а иногда приходится полностью переписывать код внесенных изменений из-за изменения законодательства или учетных методик. Как говорится, раз на раз не приходится и для каждого обновления приходится выбирать наименее затратный по времени вариант.
очень полезная информация
только начал осваивать программирование 1С, до этого работал бухгалтером. Заинтересовала именно эта статья, споткнулся на третьем этапе. Может подскажете по подробнее, кто из знающих, или есть какие-нибудь другие варианты обновления не типовой конфигурации?
«объединение с помощью GComp + Kdiff3 + спец.скрипты для GComp» стоит пробовать?
(6) artbear, хотелось бы поподробнее узнать о методике GComp + Kdiff3 + спец.скрипты для GComp
Большое спасибо за статью! Вы помогли мне обновиться из типовой конфигурации, но с многими доработками.
А как можно разобрать Глобальный модуль после GCOMPа на отдельные процедуры и функции. Занимаюсь объединением двух нестандартных конфигураций в одну. Есть процедуры с одинаковым названием (ПриНачалеРаботыСистемы и т.д.). Сейчас собираю у себя на компьютере на тестовой базе. А реальные базы продолжают развиваться другими программистами. Когда я составлю план перехода, нужно будет приостановить работу и выполнить реальное объединение. Хотелось бы выполнить это побыстрее и с минимумом ручной работы.
(6) artbear
Я бы тоже хоте поподробнее узеть о вашей методике объединения Глобальных модулей двух конфигураций. Посоветуйте может есть какие-то статьи на эту тему.
КонфигурацияАК47 может разобрать (GComp) MD файлы. Сравнивает рабочую, типовую рабочую, типовое обновление. Позволяет сравнить разницу в коде (Kdiff3). И собрать новый MD из приготовленого.
А я с 1с недавно — и сразу убило то, что конфа меняется не частично а целиком (т.е. сохраняется и изменяется)…
Хотя и есть возможность сравнения, но это все одно не то — напряжно да и как-то не оптимально.
Я тоже иногда накатываю изменения для типовых на «не типовые» — застрелится.
А за статью — спасибо — сравню со своими шагами в подобном.
Хорошая статья. Спасибо. Очень пригодилась.
Спасибо. Статья хорошая, но уж слишком запутано. Мне для обновления трех конфигураций хватает: старая рабочая, старая неизмененная и новая.
Хорошая статья. Спасибо.
Спасибо Вам за статью, полезная штука, ознакомилась с текстом, многое стало понятно.
Спасибо за статью! В принципе примерно таким образом и обновлялась, однако после такого подробного объяснения мой «метод научного тыка» обрёл осознанную форму. Ещё раз спасибо!
спасибо хорошая статья!
Полезная статья, многое для обновления нетиповых конфигураций приходилось добывать самому, в этой статье появилась возможность обобщить накопленный опыт.
Мир этому дому!
Статья интересная. Как раз в ближайшее время светит обновление старинных, давно многократно правленых конфигураций. Спасибо.
спасибо автору,
помогли вспомнить нюансы при обновлении плана счетов
с выходом нового релиза это актуально