Технология обновления нетиповых конфигураций 1С:Предприятия 7.7




Принцип обмена данными из 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='\

24 Comments

  1. Ёпрст
  2. adapter

    млин, как все заморочено. Куча копипастов, а если отвлекли в процессе, то заново? Просто разрыв моего скромного мозга.

    У меня 5 конфигураторов сразу вообще не открываются 🙂

    А как насчет создать инструмент для обновления измененных конф?

    Reply
  3. alexk-is

    (3) Два последних нужны только для копирования. Их можно открывать при необходимости.

    В некоторой степени это реализовано на уровне платформы в 1С:Предприятии 8 🙂

    Reply
  4. AS108

    Спасибо за хороший материал, только-только приступила к программированию, сразу столько вопросов возникло. И приятно, что ответы тоже находятся 🙂

    И вообще — спасибо всем на этом сайте, за то что делитесь своим опытом. Успехов Вам!

    Reply
  5. artbear

    А как глобальник объединяешь?

    Лично я пользуюсь своей методикой, выполняю объединение с помощью GComp + Kdiff3 + спец.скрипты для GComp

    например, глобальник очень удобно разобрать на отдельные файлы для каждой процедуры/функции, и выполнять автообъединение на базе KDiff3 (3-стороннее объединение)

    Reply
  6. alexk-is

    (6) Все правильно… И так тоже… Нет предела совершенству…

    А точнее по поводу объединения — это зависит от количества внесенных изменений, если они вообще были в глобальном модуле. Иногда бывает быстрее перетащить несколько строк руками, а иногда приходится полностью переписывать код внесенных изменений из-за изменения законодательства или учетных методик. Как говорится, раз на раз не приходится и для каждого обновления приходится выбирать наименее затратный по времени вариант.

    Reply
  7. Oleg_46

    очень полезная информация

    Reply
  8. Denis Fox

    только начал осваивать программирование 1С, до этого работал бухгалтером. Заинтересовала именно эта статья, споткнулся на третьем этапе. Может подскажете по подробнее, кто из знающих, или есть какие-нибудь другие варианты обновления не типовой конфигурации?

    Reply
  9. bol

    «объединение с помощью GComp + Kdiff3 + спец.скрипты для GComp» стоит пробовать?

    Reply
  10. rom-x

    (6) artbear, хотелось бы поподробнее узнать о методике GComp + Kdiff3 + спец.скрипты для GComp

    Reply
  11. quarion

    Большое спасибо за статью! Вы помогли мне обновиться из типовой конфигурации, но с многими доработками.

    Reply
  12. dicwork

    А как можно разобрать Глобальный модуль после GCOMPа на отдельные процедуры и функции. Занимаюсь объединением двух нестандартных конфигураций в одну. Есть процедуры с одинаковым названием (ПриНачалеРаботыСистемы и т.д.). Сейчас собираю у себя на компьютере на тестовой базе. А реальные базы продолжают развиваться другими программистами. Когда я составлю план перехода, нужно будет приостановить работу и выполнить реальное объединение. Хотелось бы выполнить это побыстрее и с минимумом ручной работы.

    Reply
  13. dicwork

    (6) artbear

    Я бы тоже хоте поподробнее узеть о вашей методике объединения Глобальных модулей двух конфигураций. Посоветуйте может есть какие-то статьи на эту тему.

    Reply
  14. OlegSantana

    Конфигурация АК47 может разобрать (GComp) MD файлы. Сравнивает рабочую, типовую рабочую, типовое обновление. Позволяет сравнить разницу в коде (Kdiff3). И собрать новый MD из приготовленого.

    Reply
  15. AlexTorin

    А я с 1с недавно — и сразу убило то, что конфа меняется не частично а целиком (т.е. сохраняется и изменяется)…

    Хотя и есть возможность сравнения, но это все одно не то — напряжно да и как-то не оптимально.

    Я тоже иногда накатываю изменения для типовых на «не типовые» — застрелится.

    А за статью — спасибо — сравню со своими шагами в подобном.

    Reply
  16. ARTEM123456

    Хорошая статья. Спасибо. Очень пригодилась.

    Reply
  17. Rockman

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

    Reply
  18. Анна79

    Хорошая статья. Спасибо.

    Reply
  19. 2011b11

    Спасибо Вам за статью, полезная штука, ознакомилась с текстом, многое стало понятно.

    Reply
  20. Hantinka

    Спасибо за статью! В принципе примерно таким образом и обновлялась, однако после такого подробного объяснения мой «метод научного тыка» обрёл осознанную форму. Ещё раз спасибо!

    Reply
  21. aimerlive

    спасибо хорошая статья!

    Reply
  22. maxim305

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

    Reply
  23. LexSeIch

    Мир этому дому!

    Статья интересная. Как раз в ближайшее время светит обновление старинных, давно многократно правленых конфигураций. Спасибо.

    Reply
  24. nysysimara

    спасибо автору,

    помогли вспомнить нюансы при обновлении плана счетов

    с выходом нового релиза это актуально

    Reply

Leave a Comment

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