Очень долгое обновление типовой БП с релиза 2.0.41.х. Простой способ лечения.




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

50 Comments

  1. mad_maksim

    Релиз 2.0.41.5 разработчиками признан ошибочным (в части нового регистра).

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

    Reply
  2. Styvi

    Мне повезло — я ещё не обновился до 42.6

    Текущая моя конфа 41.3

    Спасибо за статью — воспользуюсь советом обязательно…

    Reply
  3. kuzev

    У меня в компании типовая 1С БП КОРП.

    22.11.2012 вышел релиз 2.0.42.6. Т.к. в выходные обновиться не удалось, то 26.11.2012 я уже через франчайзи написал письмо в 1С с описанием ситуации. 29.11.2012 получил следующий ответ (привожу немного сократив):

    «После обновления на 2.0.42.5 необходимо запуститься в режиме Предприятия для запуска пакета обработок и только потом обновиться на 2.0.42.6. Регистр «Данные первичных документов» у вас в ИБ пустой, т.к. до релиза 2.0.42 он использовался исключительно для учета ИП. Регистр обязательно должен заполниться при обновлении на 2.0.42, т.к. начиная с этого релиза он является хранилищем основных реквизитов для всех документов.

    Какой объем ИБ у Вас, сколько примерно документов?»

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

    В итоге обновление на 2.0.42.6 с 2.0.41 у меня заняло 18 (!) часов, вместо обычных 30 минут. За это время регистр сведений наполнился около 1,5 миллиона (!) записями, что сопоставимо с количеством документов базе.

    Короче, нет слов. Браво сотрудники «1С»!

    Проверю переход на 2.0.43…

    Reply
  4. DoctorRoza

    Возьму на вооружение, может пригодится!

    Reply
  5. tango

    (3) kuzev,

    Регистр «Данные первичных документов» … начиная с этого релиза он является хранилищем основных реквизитов для всех документов.

    т.е. они «эмулировали» семорошный журнал документов?

    ну, что ты скажешь, браво!

    верните АлексаО — только он сможет точно сформулировать

    Reply
  6. kuzev

    Автор, исправьте «…до предпоследнего на сей день релиза 2.0.42.6…» на «…2.0.43.6…».

    Reply
  7. kuzev

    (5) tango,

    я вообще не понял, зачем ТАКОЕ делать.

    Комментариев от 1С можно не ждать, я так понимаю.

    Reply
  8. Новиков

    (6) kuzev, последний релиз на текущее время 2.0.43.6. ПРЕДпоследний релиз (на сей день) 2.0.42.6.

    Зачем что-то исправлять?

    Reply
  9. tango

    (7) kuzev, каменты от 1с так же предсказуемы, как от АлексаО

    а вот хотелось бы послушать звуков от позитивных наших

    Reply
  10. kuzev
    После обновления на 2.0.42.5 необходимо запуститься в режиме Предприятия для запуска пакета обработок и только потом обновиться на 2.0.42.6.

    А на это я вообще наплевал, т.к. времени на обновления потребуется в 2 раза больше. Сначала ждать, когда обновится база с 2.0.42.5, затем, обновив конфигурацию на 2.0.42.6, опять ждать обновления базы. И в том, и в другом случае регистр сведений заполняется/перезаполняется.

    Reply
  11. Новиков

    Коллеги, данная короткая публикация направлена НЕ на разжигание религиозной/классовой/подставить_нужное ненависти к ребятам с Селезневки.

    Это просто мое альтруистическое желание сэкономить Вам всем нервы/время. И не более того.

    Поэтому не ищите здесь тайных смыслов.

    Кому актуально — просто сделайте как написано.

    Reply
  12. tango

    (11) да ладно, чё тут разжигать-то 🙂

    плеснул керосинчика в эпицентр хиросимы 🙂

    Reply
  13. logos

    Божественно, как раз поленился на 42й релиз обновляться.

    Reply
  14. kuzev

    Как и обещал, запустил обновление базы на 2.0.43.6. Скорость заполнения регистра сведений увеличилась, но не в разы. Имхо, где-то раза в полтора. Ничего божественного =((( О результатах сообщу…

    Reply
  15. KapasMordorov

    Нужно заполнение регистра реквизитов документов закомментировать в конфигурации (в обработке обновления).

    А регистр заполнить после обновления, сделав внешнюю обработку.

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

    Reply
  16. tango

    а он вообще зачем — этот регистр?

    подозрение имею, что только ради электронного оборота

    ну так и пусть заполняют, кто к электронной россии учаснег

    Reply
  17. kuzev

    Я не понимаю, чего народ так плюсует топикстартера. У кого документов в базе мало, тем все равно, т.к. и не заметят обновления. Остальные же будут иметь головную боль и выкраивать время для апдейта. Жаль, что нет кнопки минус «разработчикам» 1С.

    Reply
  18. tango

    (17) kuzev, если основная работа — поддержка, причем именно бухии, то самое ценное из всего, что есть на ИС — это именно сабж и всё такое

    так что ТС — два плюса 🙂

    Reply
  19. zzz_natali

    Мальчики, вместо того, чтобы руки в стороны раздвигать, доказывая, что щука была ничуть не меньше во-о-о-т такого размера, скажите лучше: безболезненно ли прыгать через несколько релизов на последний с полной цф’ки? Не будет какого-нить «копенгагена» при обновлении, как в своё время с Комплексной/УПП? Спасибо.

    Reply
  20. kuzev

    (18) tango,

    дождемся моих замеров, а то их что-то нет у ТС 🙂

    Reply
  21. kuzev

    (19) zzz_natali,

    мне давали полную cf-ку с 2.0.42.6. Результат аналогичен. Так что прыгайте.

    Reply
  22. tango

    (19) zzz_natali, ап 🙂

    Reply
  23. ViksVik

    Спасибо за статью. Пригодится. Вообще, все обновления 1С – это хождение по минному полю, приходилось не раз сталкиваться с различными проблемами. Разработчики с Селезневки не очень-то заботятся тестированием своих «творений». А вывод – тривиальный – обязательно делать резервные копии баз перед обновлением. И если «подорвались» (что-то пошло не так), забейте на всё, верните в работу копию базы и ждите следующего обновления (то бишь исправления их ошибок).

    Reply
  24. RomanUzmov

    Плюс за лаконичность…. 🙂

    Reply
  25. Goruch

    Краткость сестра таланта.:)))

    Спасибо.

    Reply
  26. SirYozha

    очень вовремя заметил статью, спасибо

    Reply
  27. JohnySC

    Я еще не раз замечал, что файл БД (при файловом конечно же режиме) может быть сильно фрагментирован (актуально для старых и забитых дисков в WinXP) и если его до обновления, или еще каких работ, дефрагментировать (может помочь например WinContig), то скорость обработки может увеличиться не то что в разы — а на порядки! 🙂

    Reply
  28. sarun

    недавно обновлял бухгалтерию, база небольшая — не заметил. Действительно в режим 1с предприятия можно не заходить, тогда при первом запуске происходит последовательное обновление с релиза на релиз. Если не прав то поправьте, так как давно не занимаюсь обновлениями типовыми.

    Reply
  29. iov

    ага у меня почасовка вообще шикарно подсобила фирма 1С. клиент выбрал обновление по часам а не по каждому обновлению оплатить. И тут такая засада +4 часа.

    Reply
  30. kuzev

    Докладываю. Обновление заняло 10 часов 20 минут, вместо 18 часов. Итого затрачено времени примерно на 40% меньше. Ну, хоть что-то «товарищам» удалось исправить. В таком случае, обновление можно на ночь запустить на буднях.

    Reply
  31. Lyns_owner

    А обновить с помощью .cf сразу до 2.0.43.6 с любого релиза вам что мешает? о_О

    Reply
  32. bloodline223

    (31) так не делают

    Reply
  33. Новиков

    (31) Lyns_owner,

    А обновить с помощью .cf сразу до 2.0.43.6 с любого релиза вам что мешает?

    Мешают знания.

    Reply
  34. Lyns_owner

    (33) Конкретнее? Через релиз перешагнуть вполне можно.

    Reply
  35. tango

    (34) Lyns_owner, достаточно одного раза, чтобы априори придерживаться рекомендованной последовательности

    Reply
  36. Lyns_owner

    (33) (35) tango, Обновление на один релиз и последующее обновление на другой релиз, БЕЗ открытия предприятия — равнозначно обновлению с помощью .cf на эти 2 релиза.

    (33) вам мешают «Знания»? Так почему, в таком случае, они вам не мешают обновлять 2 релиза подряд без открытия предприятия?

    Reply
  37. bloodline223

    (36) Lyns_owner, ты сам писал же С ЛЮБОГО релиза, может ты через 6 релизов предлагаешь вообще, я вот не читаю мысли

    Reply
  38. Abadonna

    На площадке шум и звон,

    Не работает «Аргон»,

    Ни разведки, ни захвата,

    Про@@ались до заката!

    Последний опыт: около пяти баз обновилось нормально, одна — фиг вам.

    На 42.6 встала нормально, при обновлении на 43.6 в процессе «Сравнение объектов» «Инструкция обратилась по адресу… бла-бла», т.е. вышибает движок. Чего только не пробовал: на разных движках, на разных машинах, на разных ОС — именно так и вылетает. Базу, разумеется, протестил и конфигуратором, и chdbfl.exe, кажет — ОК.

    Обновление через cf, а также «Сравнить, объединить» через cf — точно так же вылетает, и именно в процессе сравнения объектов.

    Плюнул на всё, снял с поддержки, сделал «Загрузить конфигурацию из файла» — прошло. Практически день на эксперименты ушел 🙁

    Reply
  39. 1cmax

    (36) Lyns_owner, Так какие проблемы есть с умеренным (2-3 релиза ) перепрыгиванием через релизы?

    Reply
  40. kuzev

    (38) Abadonna,

    На 42.6 встала нормально, при обновлении на 43.6 в процессе «Сравнение объектов» «Инструкция обратилась по адресу… бла-бла», т.е. вышибает движок.

    Для статистики.

    У меня вот тоже вылетела платформа с ошибкой при обновлении с 2.0.40.8 на 2.0.42.5.

    Не стал экспериментировать и обновил сначала на 2.0.41.3, как делал и раньше, а затем на 2.0.42.6. После чего на 2.0.43.6.

    Reply
  41. tango

    сейчас бухия не захотела принять выгрузку из ЗУПа: 43 ей подавай!

    сделал 40.8 -> 42.5 -> 43.6 штатно

    полет нормальный

    Reply
  42. evn-zorin

    Спасибо, грамотно, толково и экономит практически час времени!

    Reply
  43. vechiy

    А если в 2.0.42.5 я уже запустил в режиме предприятия? Если теперь закрою его, обновлюсь дальше, до 43.6, поможет ли это?

    Reply
  44. vechiy

    вопрос снят, нормуль, на 43.13 минут за 10 обновилась

    Reply
  45. beard1

    внесу свои пять копеек… со временем обновления особо проблем не было, заметил что подольше, но незначительно, а сейчас узнал откуда ноги растут, респект автору!

    НО! посмотрел ссылки в на регистр в конфигураторе, спросил ИТС поиском, и-нет бегло посмотрел, но так и не понял оно (регистро) зачем собственно?

    Reply
  46. beard1

    али услышал звон, да не понял где он? я про ДанныеПервичныхДокументов, а автор упоминает РеквизитыПервичныхДокументов…

    Reply
  47. Новиков

    (46) beard1,

    а автор упоминает РеквизитыПервичныхДокументов…

    Маленькое историческое пояснение для потомков: регистр сведений РеквизитыПервичныхДокументов использовался в документе акт сверки. Если бы этот регистр не заполнялся, то правильная работа конфигурации не гарантировалась.

    Reply
  48. a1ex4ndr
    «Могли бы предупредить!» — возмущался я, но сотрудник франчайзи ответил, что «они никогда этого не делают, потому что им…».

    в точку франч ответил 😉

    Reply
  49. fr.myha

    Спасибо

    Reply
  50. alex15650

    Помогло, спасибо! )

    Reply

Leave a Comment

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