Обновление типовой доработанной конфигурации для начинающих




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

20 Comments

  1. karpik666

    Инструкция из серии: рисуем линию, а затем рисуем сову, она точно для начинающих? Как открыть файл поставки у вас куча иллюстраций, а вот в самом важном обновлении у вас практически ничего. Интересен момент со снятием и установкой галочек перед обновлением, но по моему эти действия излишни. Как обновлять роли, критерии отбора? Что делать, если при обновлении выскочит окно, что есть связанные объекты, но не помеченные?

    Reply
  2. docerman

    (1) Как обновлять роли, критерии отбора?

    — об этом есть в статье: У ролей и тех объектов, у которых изменен состав – устанавливаем «объединить с приоритетом новой конфигурации поставщика».

    — Что делать, если при обновлении выскочит окно, что есть связанные объекты, но не помеченные?

    — об этом тоже есть: …игнорируем страшные предупреждения программы если они появляются и не соглашаемся на предложения включить дополнительные объекты в объединение…

    Писал статью, вспоминая как сам делал первые обновления — мне бы эта статья пригодилась.

    Reply
  3. Светлый ум

    (2) Статья годная.

    Reply
  4. karpik666

    (2)

    об этом тоже есть: …игнорируем страшные предупреждения программы если они появляются и не соглашаемся на предложения включить дополнительные объекты в объединение…

    Этот момент, когда читал в статье не понял.

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

    А вообще я читал вот такую статью http://infostart.ru/public/18562/, хоть она и старая, но сохраняет актуальность и на текущий момент, надеялся, что в этой статье можно почерпнуть что-то новое.

    Reply
  5. docerman

    (4) По поводу ролей:

    Если из типовой роли убирались права — об этом нужно знать. Особенно это может касаться роли «Пользователь» — очень много прав в типовых у нее. Проверить это можно запустив отчет о сравнении старой конфигурации поставщика и основной конфигурации. Но и в этом случае я думаю нужно объединять с приоритетом новой конфигурации поставщика, а в получившейся конфигурации убрать не нужные права. Спасибо за замечания.

    Reply
  6. Armando

    Почему-то ничего не сказано, например, про kdiff3. С ним модули обновлять одно удовольствие — вжух и готово.

    Reply
  7. docerman

    Отстал от жизни, работаю в основном на 8.2, на 8.3 возможностей для объединения модулей больше: http://v8.1c.ru/o7/201404merge/index.htm

    Reply
  8. docerman

    (8) Спасибо за внимание уделенное статье. По пунктам отвечать не буду. Инструкцию считаю полезной для новичков (сужу по себе).

    Reply
  9. klinval

    (9) Вот именно, что это больше похоже не на статью, а на памятку самому себе. И как любая памятка — она не всегда понятна для постороннего, некоторые советы в других конфигурациях бесполезны и/или вредны.

    И очень странная реакция на конкретную критику: «Спасибо, но учитывать не буду. Для меня и так сойдёт». Вы написали не в текстовый файл для себя, а на ИС для других. Тут правильно либо оппонировать, если считаете критику необоснованной, либо исправить статью в соответствии с критикой…

    Для новичков всё-таки рекомендую читать статью: Технология обновления нетиповых конфигураций 1С:Предприятия 8. Букв больше придётся прочитать, но знаний и правильных мыслей тоже больше.

    Reply
  10. klinval

    (11)

    4.

    4. Пробовал — результат разный — в первом случае выбрано больше объектов чем необходимо.

    Специально проверил, хотя был уверен в результате — после предложенных вами манипуляций не горит кнопка сохранения настроек объединения в файл! Это значит, что настройки сохранённые ранее не были изменены и сохранять нечего. Так что перепроверьте, результат не отличается! Релиз платформы: 8.3.8.2054. Возможно в вашей версии платформы он по-умолчанию ставит галочки неправильно (косяк конкретно версии).

    6.

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

    …О том как определить что форма изменена, в статье указано.

    В статье написано:

    Для того чтобы понять что менялась сама форма а не просто модуль, делаем следующее: встаем на необходимый объект, нажимаем правую кнопку мыши и выбираем «Отчет о сравнении объектов»

    Что мы увидим благодаря этому: что форма поменялась (или не поменялась) относительно сравнения «Основная конфигурация» — «Новая конфигурация поставщика». А смысл смотреть, анализировать, если до этого не был произведён анализ, а меняли ли мы сами эту форму (ситуацию, когда мы наизусть помним что меняли не учитываем)? Т.е. не произведено сравнение «Основная конфигурация» — «Старая конфигурация поставщика». Вот об этом ни слова.

    7.

    Перепрыгивать через несколько релизов при накатывании конфигурации на рабочую базу считаю вполне допустимым — никогда проблем не было.

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

    Релиз 1. В конфигурации есть Реквизит1 в каком-нибудь справочнике.

    Релиз 2. Реквизит1 переименовывают в УдалитьРеквизит1 и создают новый Реквизит2. В обработке обновления данные из УдалитьРеквизит1 переносятся в Реквизит2. 1С-ники так часто делают. Реквизит2 может иметь другой тип, или взамен одного реквизита создали два или наоборот.

    Релиз 3. УдалитьРеквизит1 удаляют, т.к. он не нужен. Все данные перенесены в Реквизит2.

    Вы рабочую обновляете с релиза1 сразу на релиз 3. Данные пропадут.

    Стоит «удачно» прыгнуть и будет косяк. Не факт, что его сразу заметят. Рекомендовать прыгать через несколько релизов новичкам точно не стоит.

    Reply
  11. docerman

    (12)

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

    6. Написано что нужно сравнить формы и сравнение может потребоваться и то какое указали вы, и различные другие в том числе на отличие старой конфигурации поставщика от новой конфигурации поставщика. Если мы на сравнении основной конфигурации от новой конфигурации поставщика не видим в отчете изменений то можно дальше не анализировать.

    7. Это полезное замечание. Нужно читать описание каждого релиза — что конкретно менялось. что-бы не попасть в такую ситуацию. Я думаю что удаление реквизитов описанное вами происходит (если смотреть пример) не на 3 релизе, а значительно позже, а может и вообще не происходит так и остаются реквизиты «УдалитьРеквизитТакойТо» — поэтому и проблем нет. Но что бы перестраховаться — я согласен лучше делать последовательно.

    Reply
  12. klinval

    (13)

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

    Я на разных версиях пробовал — всегда результат предсказуем. Он аналогичен тому что у вас после ваших манипуляций. Я просто предположил, что возможно у вас косяк конкретной версии платформы. Можете скрин дать объекта (в окне сравнения конфигураций), у которого в настройках по-умолчанию стоит галочка, а после ваших действий не установлена. У меня на новой версии платформы загорается строка, если настройки по-умолчанию изменены. После предложенных вами манипуляций ничего не загорается, т.к. мы получаем те самые настройки по умолчанию.

    6. Написано что нужно сравнить формы и сравнение может потребоваться и то какое указали вы,

    Об этом я и пишу, что часть основных моментов не отражено. Вы написали про «Отчет о сравнении объектов», а начинать надо сравнение с «Отчет о сравнении объектов основной конфигурации со старой конфигурацией поставщика» или «Отчет о сравнении объектов новой конфигурации со старой конфигурацией поставщика» (в зависимости от выбранной тактики).

    Reply
  13. docerman

    В приложенных файлах:

    а1 — по умолчанию (фильтр — Показывать отличия основной и новой конфигурации поставщика от старой конфигурации поставщика)

    а2 — с установленным фильтром — Показывать отличия новой конфигурации поставщика от старой конфигурации поставщика

    Версия платформы 8.2.19.130

    Надеюсь хоть в этом вам статья оказалась полезной.

    Reply
  14. klinval

    (15) похоже у вас глючит платформа. Посмотрите сами: у вас есть 2 общие формы:

    1. НастройкаПрограммы

    2. ПодборРолейУправляемая

    Обе формы изменены вами по сравнению со старой конфигурацией поставщика. Обе формы не изменены в новой конфигурации поставщика по сравнению со старой. Т.е. чисто по логике обе должны быть «без галочки». Так на моей памяти работает любая версия платформы. А у вас одна с галочкой, другая без.

    Если хотите проверить: скачайте платформу посвежее — там обе формы будут без галочки! Или даже подревнее — там тоже должно быть всё ОК.

    Reply
  15. docerman

    (16) Даже если это глюк платформы (платформы разных версий работают порой странно) — в чем я лично сомневаюсь — скорее именно в том, что и как менялось в объекте, то способ предложенный в статье позволяет избежать таких ошибок, к тому же понятно какие именно объекты и зачем выбираются.

    Reply
  16. citicat

    За статью спасибо большое! Добавила бы, что, по опыту работы, удобнее добавлять новые объекты (те же роли, справочники или документы), а не изменять существующие. Не всегда это возможно, но желательно.

    Reply
  17. Jestery

    Здравствуйте, а можно поподробнее, зачем ставить галку «разрешить удаление объектов основной конфигурации»?

    Reply
  18. rozer

    (17)

    то способ предложенный в статье позволяет избежать таких ошибок

    в этом нет смысла — в (16) написано верно. Галка «дважды измененные» работает нормально только если стоит фильтр «Показывать отличия основной и новой конфигурации поставщика от старой конфигурации поставщика» т.е. показывает то что изменили вы и 1с и типо «дважды». Кста. интересно что использование внешних ПО объединения http://v8.1c.ru/o7/201404merge/index.htm при «тройственном» объединении (конф на поддержке) удобнее «штатной объединялки» 1с — визуально показывает например сразу три фрагмента кода…

    Reply
  19. rozer

    + (20) хотя туплю… это

    Показывать отличия новой конфигурации поставщика от старой конфигурации поставщика

    вообще не имеет смысла ибо вы потом все равно ставите «дважды измененные» что означает всего лишь один из фильтров…. за

    Reply
  20. AlexeyMalko

    а я вот не понял зачем снимать с поддержки ? сколько уже обновлял и просто загружал cf и всё отлично — зачем эти лишние движения?

    Reply

Leave a Comment

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