<?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='\
Спасибо. Очень нужная информация.
Сегодня ещё постараюсь добавить примеры кода
я конечно уже старый … и мне не понять многого … но когда я читаю такие статьи невольно закрадывается такое ощущение будто 1С это нанотехнология …
…
по поводу и без : «У Гегеля была замечательная фраза про людей, которые возбуждение принимают за вдохновение, напряжение за работу, а усталость за результат.» …
это я относительно непонятной для меня усложнЁнности 1С и твоей статьи, как мне кажется поддерживающей эту усложнённость …
… такое ощущение что «сложность» это цель …
… вот …
(3) Насчет усложнения у 1с — соглашусь отчасти. Они, конечно, что сами усложняют, но что-то вынуждены усложнять для соответствия требованиям государства… Взять хотя бы тот же расчет среднего заработка — это же кошмар какой-то…
А насчет статьи… Те же самые философы тоже любят писать толстенькие и не очень книжки, где обмусоливают с разных сторон одну и ту же мысль. И делают они это иногда тоже вынуждено — чтобы понять одну казалось бы простую мысль, нужно полностью повторить все размышление предшествующие им. Так и в моей статье — к коротким 5ти пунктам я шел несколько месяцев. Можно сразу прочитать их и если не понятно что-то прочитать остальное.
Нет главного пункта.
1. Постоянная, даже на грани фола борьба против изменений конфигурации.
Пользователь должен кровью и потом доказывать необходимость таких изменений .
Без этого пункта статья превращается в инструкции для мальчика по затыканию дырок (виноват , по обновлению конфигурации).
(4)
http://www.infostart.ru/public/16980/
Я бы ещё добавил применение Методики переопределения и вызова обработчиков событий формы в 1С 8 для внесения своих «дописок»
Один из примеров использования здесь
http://infostart.ru/profile/18346/blog/867/
отвлечЁнное:
согласен с (5) ….
что такое конфигурация — худо-бедно — методология обозначенная в методике и облечённая конкретными расчётами …
… основные перемены это изменение расчётов … большой роли они не оказывают … хоть меняй и переписывай на дню по 10 раз …
… другое дело — методика а ещё хуже изменение методологии …
… если изменения касаются методики … это доказательство через «пот»
… если изменения касаются методологии … это доказательство через «кровь»
… к сожалению программисты ещё не вышли на уровень — когда с ними хоть что-то обсуждают … они до сих пор на уровне мальчиков — программистов …
… извечное желание программистов всЁ «усложнить» а бухгалтеров всЁ «улучшить» и приводит к появлению частных случаев которые к «поломке» 1С и бухгалтерии как «системы» …
… вот …
(7)
>>> к сожалению программисты ещё не вышли на уровень — когда с ними хоть что-то обсуждают … они до сих пор на уровне мальчиков — программистов …
Смотря где и с кем. Ещё как обсуждают, а шаг влево, вправо карается, как бы это помягче выразиться, непечатными словами неважно в чей адрес.
УПП. Один общий «НашМодуль». А как же параллельная работа с хранилищем нескольких разработчиков?
(5) абсолютно согласен…просто этот пункт у меня уже или 0 или вообще -1… Любое изменение, которое просят сделать, сначала пробиваю на предмет «кому надо,зачем, законно ли, как можно решить типовыми средствами»
(9) НашМодуль — это частности. Я работаю с этой конфой абсолютно один. Это раз. Во вторых, когда появляется кто-нибудь ещё, то разработку он ведёт в тестовой конфе.
К проблемам размещения в одном модуле ещё могу добавить конфликт процедур внутри модуля, если они относятся в модулям с различными флажками «Клиент», «Сервер», «Привелигированный»…
Если ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
Возврат;
КонецЕсли;
можно так, или я что то упустил? :
Если РольДоступна(«ПолныеПрава») Тогда
возврат;
КонецЕсли;
(12) можно
УПП внедряю несколько месяцев. Все другое. Бухи учёт с ног на голову перевернули. Задаю вопросы везде, на всех форумах. Результат — конфу обновляю не задумываясь и все работает.
4 пункт на заметку взял себе
Раньше работал на торговле, сейчас на УПП Мясокомбинат, работаю меньше месяца, уже переправил кучу процедур.недавно гдето прочитал название УПП, программист называл ее не как иначе как «УППырышь». в чем-то согласен.Пункт 4 взял на заметку.
(15) УППырь. В смысле, кровопийца 😎
(15) ну и зря. Потом придет внедренец с опытом и будет всё возвращать на место
Пункт 4 — интересное решение.
не дурак и не когда себя таким не считал, внедрял не одну программу. Правил именно то что надо было править из дописок.
Вся информация и так интуитивно понятна, но п4 не использовал… Очень полезная поправочка. Большое спасибо 🙂
З.Ы. За ссылку на декомпилятор формы отдельнео спасибо
Полезная статья за ссылку отдельное спасибо 🙂
Программист в тот момент. когда соглашается на изменение основной конфигурации, не мальчик для битья, а наркодилер, сажающий на иглу дорогих удовольствий.
(24) …и подписывающий себя на четвертование
(24)(25) — Подписываюсь под Вашими словами.
Спасибо за статью. Править конфигурацию начали ещё до меня, а обновляться, чувствую, скоро придётся.
Поиском можно найти нужную информацию
какие обработки, не придумали, чтобы обновить не типовую базу, всё равно приходится, брать бубен, побольше пива, и обновлять ручками. Иначе что то можно пропустить что выстрелит, через месяц или два. Последствия могут быть плачевными. Да и бухи всегда хотят не работать, в смысле работать так чтобы работало за них, им при этом ничего не делать.
Спасибо автору, обязательно попробую при следующем обновлении глбально доработанных, да и еще не качественно и коряво. А то блин понапишут, по дорабатывают, а другим сопровождать и разбираться в коде-каракулях! Накипело…
про ярлыки — не понял их назначения.
где почитать подробнее? 🙂
(31) цитату к которой вопрос можно?
(32) «4. Замена вызовов типовых процедур и функций в самописном коде (в т.ч. и во внешних обработках) на вызов процедур из собственного модуля. Эти процедуры по сути «ярлык» для вызова типовых. Преимущество в том, что нужно проверить только их, а не искать множество вызовов в куче самописного кода.»
т.е. в принципе не понял зачем это надо?
(33) предположим Вы регулярно в доработках и внешних обработках используете типовые функции и процедуры (например, ПолучитьНомерНаПечать). Во время обновления 1с поменяли местоположение функции (разбили модуль на несколько других модулей), поменяли её название или формат возвращаемых данных. Вам при обновлении нужно отследить такое изменение, а значит пересматривать весь свой код в конфигурации и внешних обработках и проверять работоспособность кода. Если же Вы заранее переназначили вызов через свою функцию-оболочку, то проверить нужно будет только её одну. Т.е. в типовом коде будет ПолучитьНомерНаПечать, а в Вашем коде будет нашПолучитьНомерНаПечать, где внутри будет тот же самый вызов типового ПолучитьНомерНаПечать.
(34) понял. Спасибо 🙂
Забыл «не» перед «хотелось»:
Повторять такое обновление мне хотелось — начал думать как облегчить следующее.
Я даже поначалу удивилось, как же может такое обновление хотеться повторить.
Спасибо, очень полезная статья, жаль что не нашла её раньше — пришлось учится на собственных ошибках (-:
Спасибо, Александр! Очень интересно и познавательно.
Спасибо, интересно и можно взять себе на заметку
Спасибо, полезная статья про облегчение обновления нетиповой конфигурации