Плагин для лечения выгрузки и загрузки больших баз в 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='\

70 Comments

  1. chicago

    Спасибо!

    Reply
  2. vasilykushnir

    Вещь знакомая по мисте. Но поскольку там не принято оценивать — ставлю плюсик с чувством исполненного долга. Вещь оббалденная!

    Reply
  3. cs25

    Дельно. Плюсуем !!!

    Reply
  4. Dolly_EV

    Плюсую сразу, без проверки. Где ж ты был раньше!! точнее, чегож я раньше не был на infostarte…

    Reply
  5. Alexandra

    помню эту штуку еще по Мисте. Успешно пользую.

    Большое спасибо!

    Reply
  6. Shaman100M

    Спасибо, romix.

    Успехов в этом и в Новом!

    Reply
  7. Abadonna

    Ваще молодец! Некоторые пытаются паролить дешевые отчетики из 15 строчек, а тут солидные исходники. +1

    Reply
  8. nemchenko

    Столкнулся с описанной проблемой, попробовал плагин. Проблему решает 🙂 Однако все же есть замечание — выгрузка требует наличие человека чтобы нажать кнопочку «Да». А если выгрузка выполняется ночью в пакетном режиме? Хотелось бы иметь возможность настройки выполнения плагина в диалоговом или автоматическом режиме. А в остальном супер! плюсую.

    Reply
  9. BOZKURT

    Респект!!

    Reply
  10. romix

    (nemchenko) На праздниках я обновил разработку — теперь она не останавливается при выгрузке, а выдает все сообщения не окном с кнопкой ОК, а в трее. Я несколько раз потестил, но прошу отозваться у кого все хорошо заработает.

    Также обновил индикацию при загрузке — она тоже в трее (так кажется лучше — иначе пропадало отображение на белом экране).

    Reply
  11. sdemon72

    А можно, что бы то же самое работало для выгрузки УРБД?

    Reply
  12. sdemon72

    Плюсую. Помогло при создании новой периферийной БД. Выгрузку сделать удалось без помощи посторонних средств (перехватил файл 1Cv77.dat) , а вот загрузку я бы без плагина не сделал.

    Reply
  13. jlab13

    При загрузке данных в DBF версию зависает на 2 009Мб. Выгрузка проходит нормально!

    Reply
  14. romix

    (jlab13) Так и должно быть — потому что DBF-версия 1С содержит ограничение в 2 гига в расчете на каждый файл DBF.

    То есть каждый файл DBF не может быть больше двух гигов.

    Есть и еще одно ограничение — один гиг при многопользовательской работе (адреса свыше 1 гига 1С использует для блокировок).

    Снятием такого рода ограничений занимался Hogik (на данном сервере есть его разработки и патчи для улучшения DBF-версии).

    В SQL версии размер базы не ограничен.

    Reply
  15. jlab13

    (romix) Проверил на SQL базе созданной с нуля! Застряло на 2 038 из 2 113 (96,42%)!

    Reply
  16. jlab13

    (romix) Сори все отработало только очень долго после (96,42%) около двух часов!

    Reply
  17. malex

    Есть ли какое — то решение для УРБД?

    Reply
  18. Rom99

    Пользуюсь уже полгода,СПАСИБО!! А можно ли сделать чтоб в имени файла romix.dat была дата? чтобы не переименовывать его вручную

    Reply
  19. Joh

    Выгрузил базу из SQL файл дат получился больше 2 Гб

    не могу базу загрузить в дбф. помогите, плиз!

    Reply
  20. mariman88

    К сожалению не могу скачать, приведенные ссылки все битые, а опробовать очень хочеться, может кто-нибудь поделиться? Заранее благодарен…

    Reply
  21. momiko

    Просто дуже класна утилітка.Дякую!!!!

    Reply
  22. dan777

    «Также обновил индикацию при загрузке — она тоже в трее (так кажется лучше — иначе пропадало отображение на белом экране).»

    А не можете индикацию при выгрузке в трее отображать, а то 1С при переключении на другое приложение перестает в статусной строке что либо отображать.

    Reply
  23. n0isy

    (+)

    Reply
  24. slawa

    При установленном плагине, при завершении конфигуратора, происходит сворачивание 1С-ки в коврик.

    Это только у меня одного ? (нет ни одного сообщения на эту тему)

    Посмотрел исходники.

    ИМХО

    Это происходит из-за того, что при загрузке плагина, перехватываются функции из kernel32.dll, а при завершении конфигуратора, ни какого обратного действия не происходит.

    Думаю нужно отменить перехват.

    Подскажите, пожалста, как можно получить управление в плагине при завершении работы конфигуратора ?

    Reply
  25. mvgrob1

    Спасибо

    Reply
  26. Looking

    В Windows7 плагин не работает, или я что-то не так сделал? Может какие-то другие действия нужны, или 1С надо как-то по другому запускать — режим совместимости и т.д.

    Reply
  27. 13hohol

    Никто не встречал ошибку перед загрузкой = «Ошибка чтения из архива»?

    а то я даже демо базу не смог прогрузить, а очень надо .

    Reply
  28. viddik

    (13hohol) При загрузке указывай архив zip, который указывал при выгрузке. Там конфигурация и пустой .dat. После загрузки конфы плагин у тебя спросит, откуда брать romix.dat

    Reply
  29. hogik

    (29)

    А вот тут я поставлю минус под сообщением!

    Т.к. на аналогичное («бредовое») сообщение под своей разработкой ставить минус не очень тактично.

    http://infostart.ru/public/77617/?PAGEN_1=1#comm398883

    Reply
  30. mosAdm

    Спасибо. Очень спасло.

    Вчера была рутина, обновлял бух. 77 типовую, перед обновлением (почти случайно 🙂 сделал копию методом «выгрузить данные»). Сегодня звонит бух. и говорит «полетел мол справочник такой-то, что делать?». Ну сильно не заморачиваясь отвечаю: «восстановите данные из копии которую вчера делали». Админ местный начинает восстанавливать сразу в рабочую. Звонят через часа два: все висит, база не восстановилась. Ищем с администратором ближайшие резервные копии, их есть за октябрь месяц прошлого года. Забираю архив к себе начинаю танцы с бубном. Есть архив -не восстанавливается, была рабочая база с битым справочником — и уже нету. Гружу на сервер с SQL — висит. Загрузил восстановлением два сервера — ничего. Ближе к обеду нашел публикацию на ИС, запустил, и случилось, можно сказать, чудо — база восстановлена.

    Еще раз спасибо.

    Reply
  31. MihSerg

    ПОставили Винду 2008 x64 и SQL 2008 x64 на старом серваке спасибо плагину всё выгрузи, а вот в новом загрузить не можем не работает плагин x64 может что подскажете?

    Reply
  32. anri123

    Идея и воплощение выше всяких похвал!

    Только возникла маленькая загвоздка: для выгрузки террабайтной базы, надо где-то радобыть ещё террабайт свободного места на том же диске 🙂

    Нельзя ли добавить выбор места для *.dat файла?

    Reply
  33. igor_1c

    Отличная штука. В последнем релизе отключено предупреждение и по умолчанию файл остается в каталоге в виде romix.dat, а можно ли как нить сделать, чтобы он всё таки запаковывался и удалялся из каталога — т.е. штатно

    Reply
  34. vitaliy.ermolenko

    планируется ли поддержка windows 7 и/или windows 2008?

    Reply
  35. AlexB.

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

    Reply
  36. avgreen
    villy пишет:

    планируется ли поддержка windows 7 и/или windows 2008?

    Проблему с Win7 решил. Как только получу разрешение автора — опубликую здесь, или рядом…..

    Если это конечно еще актуально.

    Reply
  37. ZabbaZabba

    Очень-очень актуально!!!

    Никак не могу на win 2008 загрузить большую базу выгруженную!

    Reply
  38. avgreen
    ZabbaZabba пишет:

    Очень-очень актуально!!!

    Никак не могу на win 2008 загрузить большую базу выгруженную!

    Сейчас пытаюсь выложить. Оформил публикацию — модераторы завернули «из-за отсутствия картинки, описания» и внимание!!!! — «СКРИНШОТОВ». Сделать им снимок окна конфигуратора что-ли? 🙂

    Reply
  39. avgreen

    О блин! Не прошло и пол-года 🙂 http://infostart.ru/public/96481/

    Reply
  40. ZabbaZabba

    ОООО, спасибо тебе, добрый человек!!! Всю ночь промучкался. Причем выгрузка у меня прошла. А загрузка не работает. Я пытаюсь файл подпихивать — он начинает грузить, а когда доки грузит — вылетаяет с ошибкой «Ошибка в поиске в неизвестном файле». Вылечится это , как думаете?

    Reply
  41. avgreen

    (41) ZabbaZabba, А как ты умудрился выгрузить и при загрузке файл подкинуть? 1С ведь там паузы не делает. Ну выгрузку чисто теоретически можно поймать на том, когда он начала архивировать но еще не удалил DAT. Хотя это нужно еще тем терпением запастись. А при загрузке как? Тоже «ловить момент»?

    А вылечится или нет ….. у меня выгрузка нормально проходила и загрузка тоже. Но загрузку я пробовал еще под WiinXP. Хотя теперь разницы быть не должно — принцип там один и не зависит от версии ОС.

    Reply
  42. ZabbaZabba

    выгрузил я с помощью плагина.

    а на новом сервере винда 2008. там плагин не работал. а когда делаешь загрузить данные — указываешь откуда, он спрашивает «что все данные будут замещены» итп. Так в этот момент — оказывается 1с уже zip файл распаковала в каталог иб/uz0000 — там 3 файла — md, dat и usr. Так вот здесь то я его и подменял.

    Reply
  43. ZabbaZabba

    все сработало, спасибо

    Reply
  44. ukgh

    Молодец! Некоторые пытаются паролить дешевые отчетики из 15 строчек, а тут солидные исходники. +1

    Reply
  45. Kurya

    Здравствуйте уважаемые!

    Столкнулся со следующей проблеммой: База ДБФ 12Гиг комплексная (это не я ее довел, я только три недели работаю в этой конторе). Выгружаю с помощью плагина от Romix. Получается дат файл 5.5 гиг. Гружу в SQL базу (SQL 2005 enterprise). Загрузка проходит нормально, без ошибок, файл mdf получается 12 гиг (как бы маловато будет). ЗАхожу в загруженную 1С — а там пусто. Ни документов, ни итогов, ни справочников. Смотрю таблицы в SQL — записи есть. Сейчас запустил ТиИ, но ждать результата часов 10-15.

    Может кто сталкивался с подобной ситуацией и подскажет куда копать?

    Reply
  46. hogik

    (46)

    Вячеслав (Kurya).

    Попробуйте загрузить в пустую DBF-ную базу. Чего получится?

    Reply
  47. Kurya

    Спс. Проблемма решена. Как говорится сам дурак. Скопирорвал в папку с загруженной конфигурацией различные папки и файлы из старой. В том числе и cfg 🙂

    Естественно при запуске 1С создались пустые файлы ДБФ.

    Reply
  48. ssaapp

    Добрый день

    Дайте ссылку на публикацию

    Reply
  49. Ronnie81

    Где скачать плагин Ромикса?

    Reply
  50. tana1257

    Подгружала плагин Romix. Загрузка в пробную базу прошла. У меня Win2008 64, sql 2008 64. 1с v7.7 релиз 27. bkend пропатченный, но выгрузка не работает, так же дает ошибку — ошибка при чтении файла, вообщем как и без плагина. Ваш плагин еще не опробовала, так как хочется услышать мнение тех, у кого этот плагин заработал.

    Reply
  51. Styvi

    Пришёл и мой час 🙂 — буду пробовать обойти гограничение в 2 Гб для файла .DAT

    Спасибо romix за информацию — а то я уж думал, что иначе как обрезать базу других вариантов не будет…

    Reply
  52. vadimlp77

    У меня не получается выгрузить переферийную базу первый раз (большая выгрузка). Плагин кажись не срабатывает в этом случае. Так ли это? Кто то пробовал выгружать базу не из меню «Администрирование/Выгрузка данных», а из «Администрирование/Распределенная ИБ/Управление/Выгрузить данные» для конкретной переф. базы ??

    Reply
  53. kirsenn

    Отлично! Спасибо, все работает. Windows Server 2008 R2 x64 база 6 гигов!

    Reply
  54. Styvi

    Замечательно плагин работает, правда, ускорения процесса по причине отказа от архивирования не заметил, но это и не важно…

    Спасибо за разработку…

    Reply
  55. sorb

    (53) vadimlp77:

    У меня не получается выгрузить переферийную базу первый раз (большая выгрузка). Плагин кажись не срабатывает в этом случае. Так ли это? Кто то пробовал выгружать базу не из меню «Администрирование/Выгрузка данных», а из «Администрирование/Распределенная ИБ/Управление/Выгрузить данные» для конкретной переф. базы ??

    Та же проблема. Может кто-нить уже разобрался? Жутко не хочется ставить дельфи и ковырять исходники…

    Reply
  56. knight

    те на выгрузку в периферийную базу этот плагин не распространяется?

    Reply
  57. romix

    (knight)

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

    По хорошему эту проблему нужно один раз решить на уровне фирмы 1С, со своей стороны я готов предоставить фирме 1С все свои наработки по этой теме, если потребуется, — безвозмездно, а для этого нужно от кого-то из пользователей (например от Вас) с этой проблемой письмо с идентификационным номером в линию поддержки hline@1c.ru. Там изменение таково: убрать через ини-файл архивирование файла дат и заменить функции чтения-записи текстовой строки в файл на простые системные, где нет ограничения 2 или 4 Гб.

    Reply
  58. vadimlp77

    (58) Вряд ли они станут заморачиваться. Они развивают 8.3, а с 7.7 связываться не будут, имхо.

    Reply
  59. romix

    (59) Решение именно этой проблемы поспособствует развитию обеих систем, т.к. выгружают большие базы обычно в SQL, а где SQL там и 8.3. Альтернативой являются ежегодные обрезания базы, а обрезанные базы не создают благоприятных предпосылок к переходу на более мощное аналитическое ПО.

    Reply
  60. Ivan.Krechko

    romix,

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

    Reply
  61. zuza

    Не могу понять ,почему то при загрузке вылетает конфигуратор… 🙁 мож кто знает в чем причина?

    Reply
  62. romix

    (61) Спасибо 🙂

    (62) Ну может константу там нужно в пустой базе создать (как написано в инструкции). Или попробовать на более старой версии ОС выполнить загрузку (у меня тестировалось на Windows XP).

    Reply
  63. AndKovalchuk

    Самый большой недостаток этой библиотеки в том, что ее нельзя запустить опционально. У нас наряду с большой зарплатной базой есть куча мелких баз. И очень неудобно каждый раз выгрузку переделывать. Переименовывать romix.dat и сохранять файл в архив выгрузки под именем 1cv77.dat

    Reply
  64. popiksergey

    у меня тоже база весит 10 гигов, при выгрузке получилось 4,3 гига, в SQL сначала пробовал в связке секретный релиз 7.7.027.1, не получалось, после 3% просто процесс загрузки базы останавливался. ПО на котором пытался загружать базу (выгрузка из DBF базы прошла без проблем) Win 7 + 1C 7.7.27.1 + MS SQL 2014 (2008 совместимость).

    я решил что в пропатченом BkEnd.dll дело, поднял виртуалку с WinXP + MS SQL 2000 PE + 1C 7.7.025 (потому как разработчик использовал именно 25 релиз при тестировании), но и тут не выходило ничего приложение 1С просто вылетало на том же самом месте.

    и только благодаря комментам в этой ветке я нашел решение своей проблемы загрузки.

    у меня был добавлен еще один общий реквизит (строковый реквизит ограниченной длины 50 символов), который как раз оказался последним.

    и как только опустил общий реквизит Комментарий и сделал его последним. выгрузка пошла дальше

    Reply
  65. user794773

    Сделал все по иструкции не выгружается в dat ! в чем проблема , выгружается база в простой стд ZIP , не могу понять куда копать , файл патчил , др файл подкладывал , папку плагин создавал , по идее плагин запускается , проверял подменой пути , он сразу ругается , но при выгрузке получаю на выходе стд ZIP…. помогите ….

    Reply
  66. Slypower

    (67) в этой папке вы получаете zip, а в папки с базой у вас лежит файл romix.dat.

    Reply
  67. _OLEG

    на 7-винде плагин не запускается(не задет вопросов)

    Reply
  68. Slypower

    (69) на 7 винде работает при правильной установке, проверено

    Reply
  69. _OLEG

    (70)

    так вроде, двоякой установки файл редми который идет вместе с плагином не подразумевает, релиз 27 sql 2008, винда 7-я и ничего не спрашивает(((( ПРОВЕРЕНО!!!!

    Reply
  70. Yugentar

    Восстановил файловую базу из dat файла! Обычная загрузка данные поднимала не полностью. Просто громадное спасибо! Прога отработала под windows 10.

    Reply

Leave a Comment

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