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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *