Как облегчить обновление нетиповой конфигурации?




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

39 Comments

  1. Alraune

    Спасибо. Очень нужная информация.

    Reply
  2. anig99

    Сегодня ещё постараюсь добавить примеры кода

    Reply
  3. Шёпот теней

    я конечно уже старый … и мне не понять многого … но когда я читаю такие статьи невольно закрадывается такое ощущение будто 1С это нанотехнология …



    по поводу и без : «У Гегеля была замечательная фраза про людей, которые возбуждение принимают за вдохновение, напряжение за работу, а усталость за результат.» …

    это я относительно непонятной для меня усложнЁнности 1С и твоей статьи, как мне кажется поддерживающей эту усложнённость …

    … такое ощущение что «сложность» это цель …

    … вот …

    Reply
  4. anig99

    (3) Насчет усложнения у 1с — соглашусь отчасти. Они, конечно, что сами усложняют, но что-то вынуждены усложнять для соответствия требованиям государства… Взять хотя бы тот же расчет среднего заработка — это же кошмар какой-то…

    А насчет статьи… Те же самые философы тоже любят писать толстенькие и не очень книжки, где обмусоливают с разных сторон одну и ту же мысль. И делают они это иногда тоже вынуждено — чтобы понять одну казалось бы простую мысль, нужно полностью повторить все размышление предшествующие им. Так и в моей статье — к коротким 5ти пунктам я шел несколько месяцев. Можно сразу прочитать их и если не понятно что-то прочитать остальное.

    Reply
  5. Ish_2

    Нет главного пункта.

    1. Постоянная, даже на грани фола борьба против изменений конфигурации.

    Пользователь должен кровью и потом доказывать необходимость таких изменений .

    Без этого пункта статья превращается в инструкции для мальчика по затыканию дырок (виноват , по обновлению конфигурации).

    Reply
  6. Поручик

    (4)

    Я бы ещё добавил применение Методики переопределения и вызова обработчиков событий формы в 1С 8 для внесения своих «дописок»

    http://www.infostart.ru/public/16980/

    Один из примеров использования здесь

    http://infostart.ru/profile/18346/blog/867/

    Reply
  7. Шёпот теней

    отвлечЁнное:

    согласен с (5) ….

    что такое конфигурация — худо-бедно — методология обозначенная в методике и облечённая конкретными расчётами …

    … основные перемены это изменение расчётов … большой роли они не оказывают … хоть меняй и переписывай на дню по 10 раз …

    … другое дело — методика а ещё хуже изменение методологии …

    … если изменения касаются методики … это доказательство через «пот»

    … если изменения касаются методологии … это доказательство через «кровь»

    … к сожалению программисты ещё не вышли на уровень — когда с ними хоть что-то обсуждают … они до сих пор на уровне мальчиков — программистов …

    … извечное желание программистов всЁ «усложнить» а бухгалтеров всЁ «улучшить» и приводит к появлению частных случаев которые к «поломке» 1С и бухгалтерии как «системы» …

    … вот …

    Reply
  8. Поручик

    (7)

    >>> к сожалению программисты ещё не вышли на уровень — когда с ними хоть что-то обсуждают … они до сих пор на уровне мальчиков — программистов …

    Смотря где и с кем. Ещё как обсуждают, а шаг влево, вправо карается, как бы это помягче выразиться, непечатными словами неважно в чей адрес.

    Reply
  9. Serj1C

    УПП. Один общий «НашМодуль». А как же параллельная работа с хранилищем нескольких разработчиков?

    Reply
  10. anig99

    (5) абсолютно согласен…просто этот пункт у меня уже или 0 или вообще -1… Любое изменение, которое просят сделать, сначала пробиваю на предмет «кому надо,зачем, законно ли, как можно решить типовыми средствами»

    Reply
  11. anig99

    (9) НашМодуль — это частности. Я работаю с этой конфой абсолютно один. Это раз. Во вторых, когда появляется кто-нибудь ещё, то разработку он ведёт в тестовой конфе.

    К проблемам размещения в одном модуле ещё могу добавить конфликт процедур внутри модуля, если они относятся в модулям с различными флажками «Клиент», «Сервер», «Привелигированный»…

    Reply
  12. 8c1.ru

    Если ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда

    Возврат;

    КонецЕсли;

    можно так, или я что то упустил? :

    Если РольДоступна(«ПолныеПрава») Тогда

    возврат;

    КонецЕсли;

    Reply
  13. anig99

    (12) можно

    Reply
  14. strange2007

    УПП внедряю несколько месяцев. Все другое. Бухи учёт с ног на голову перевернули. Задаю вопросы везде, на всех форумах. Результат — конфу обновляю не задумываясь и все работает.

    4 пункт на заметку взял себе

    Reply
  15. Wolfis

    Раньше работал на торговле, сейчас на УПП Мясокомбинат, работаю меньше месяца, уже переправил кучу процедур.недавно гдето прочитал название УПП, программист называл ее не как иначе как «УППырышь». в чем-то согласен.Пункт 4 взял на заметку.

    Reply
  16. Арчибальд

    (15) УППырь. В смысле, кровопийца 😎

    Reply
  17. strange2007

    (15) ну и зря. Потом придет внедренец с опытом и будет всё возвращать на место

    Reply
  18. mad_maksim

    Пункт 4 — интересное решение.

    Reply
  19. Wolfis

    не дурак и не когда себя таким не считал, внедрял не одну программу. Правил именно то что надо было править из дописок.

    Reply
  20. icwiner

    Вся информация и так интуитивно понятна, но п4 не использовал… Очень полезная поправочка. Большое спасибо 🙂

    Reply
  21. icwiner

    З.Ы. За ссылку на декомпилятор формы отдельнео спасибо

    Reply
  22. vint2008

    Полезная статья за ссылку отдельное спасибо 🙂

    Reply
  23. alexkl

    Программист в тот момент. когда соглашается на изменение основной конфигурации, не мальчик для битья, а наркодилер, сажающий на иглу дорогих удовольствий.

    Reply
  24. strange2007

    (24) …и подписывающий себя на четвертование

    Reply
  25. BalVlad

    (24)(25) — Подписываюсь под Вашими словами.

    Reply
  26. Inerren

    Спасибо за статью. Править конфигурацию начали ещё до меня, а обновляться, чувствую, скоро придётся.

    Reply
  27. vovka-x13

    Поиском можно найти нужную информацию

    Reply
  28. vbvirus

    какие обработки, не придумали, чтобы обновить не типовую базу, всё равно приходится, брать бубен, побольше пива, и обновлять ручками. Иначе что то можно пропустить что выстрелит, через месяц или два. Последствия могут быть плачевными. Да и бухи всегда хотят не работать, в смысле работать так чтобы работало за них, им при этом ничего не делать.

    Reply
  29. metmetmet

    Спасибо автору, обязательно попробую при следующем обновлении глбально доработанных, да и еще не качественно и коряво. А то блин понапишут, по дорабатывают, а другим сопровождать и разбираться в коде-каракулях! Накипело…

    Reply
  30. adhocprog

    про ярлыки — не понял их назначения.

    где почитать подробнее? 🙂

    Reply
  31. anig99

    (31) цитату к которой вопрос можно?

    Reply
  32. adhocprog

    (32) «4. Замена вызовов типовых процедур и функций в самописном коде (в т.ч. и во внешних обработках) на вызов процедур из собственного модуля. Эти процедуры по сути «ярлык» для вызова типовых. Преимущество в том, что нужно проверить только их, а не искать множество вызовов в куче самописного кода.»

    т.е. в принципе не понял зачем это надо?

    Reply
  33. anig99

    (33) предположим Вы регулярно в доработках и внешних обработках используете типовые функции и процедуры (например, ПолучитьНомерНаПечать). Во время обновления 1с поменяли местоположение функции (разбили модуль на несколько других модулей), поменяли её название или формат возвращаемых данных. Вам при обновлении нужно отследить такое изменение, а значит пересматривать весь свой код в конфигурации и внешних обработках и проверять работоспособность кода. Если же Вы заранее переназначили вызов через свою функцию-оболочку, то проверить нужно будет только её одну. Т.е. в типовом коде будет ПолучитьНомерНаПечать, а в Вашем коде будет нашПолучитьНомерНаПечать, где внутри будет тот же самый вызов типового ПолучитьНомерНаПечать.

    Reply
  34. adhocprog

    (34) понял. Спасибо 🙂

    Reply
  35. mr.Kot

    Забыл «не» перед «хотелось»:

    Повторять такое обновление мне хотелось — начал думать как облегчить следующее.

    Я даже поначалу удивилось, как же может такое обновление хотеться повторить.

    Reply
  36. Оля_

    Спасибо, очень полезная статья, жаль что не нашла её раньше — пришлось учится на собственных ошибках (-:

    Reply
  37. Andryxa

    Спасибо, Александр! Очень интересно и познавательно.

    Reply
  38. DragonAgo

    Спасибо, интересно и можно взять себе на заметку

    Reply
  39. vis_tmp

    Спасибо, полезная статья про облегчение обновления нетиповой конфигурации

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *