Быстрое сворачивание 1С 77 ТиС (от 10 до 40 минут) независимо от размера ИБ.




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

26 Comments

  1. kompas-dm

    (0) Посмотрите это http://infostart.ru/public/79573/

    Reply
  2. SiAl
    «Забыл сказать, что ИБ если SQL вариант нужно выгрузить в файловый вариант и после свертки обратно загрузить в SQL.»

    Я так понимаю это связано с тем, что

    после закройте 1С и откройте Total Commander, найдите папку ИБ и удалите все файлы по маске RA*.*, RG*.*, тем самым мы сэкономим скорость удаления документов.

    Советую автору выучить язык SQL в плане конструкции DROP TABLE.

    Может сама свертка работает и быстро, но сколько времени уходит на ТИИ, выгрузку из SQL в DBF и обратно? Сколько занимает перенос ТА с проведением документов?

    Reply
  3. etmarket

    Несомненно есть минусы — все-таки много действий вручную. Но показатель — 10-40 минут для базы в 12 Гб, очень неплох!

    Reply
  4. wolfsoft

    У меня была похожая полу-универсальная свёртка регистров, в принципе, для любой конфигурации. Только не публиковал, потому как «полу» 🙂

    Reply
  5. OrsoBear

    Как раз подобной сейчас базу сворачиваю.

    Из идей, что можно добавить:

    Выбор для каких регистров какие реквизиты не включать в свертку.

    К примеру, у меня у меня долг формируется с указанием документа, а закрывается другим документом.

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

    Приходится эти документы тянуть.

    Сделал так, что Если вид регистра «Покупатели», Значение «КоррДокумент» в определении остатков не участвует.

    Без учета документов Записей регистра остатков стало гораздо меньше, и бухгалтерию в принципе устроило.

    Так же для поставщиков и прочих регистров.

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

    Но мне встречается не первый раз.

    В остальном хорошо придумано.

    Reply
  6. SvSoft

    (0) А как насчет партий ТМЦ, периодики (цены, единицы)???

    Reply
  7. st8899

    на этапе «2» на каждом месяце спрашивает по 10-100 документам, удалить подчиненные или нет! Не понятно что жать да или нет!

    На этапе»после этапа 3, проводим все «проведенные документы», выдает ошибку:

    На документ Строка выписки банка (приход) тт00014010 (28.12.2012) не зарегистрирован счет — фактура!

    На документ Строка выписки банка (приход) тт00014021 (28.12.2012) не зарегистрирован счет — фактура!

    Проведение документа: 31.01.2014 Запись книги покупок тг00000001

    Документ — основание не проведен!

    Документ не проводится!

    Свертка делалась на 1 января 2013г, ТА 6 февраля 2015г. База ведется с 2006г.

    Вот такие пироги… обработка не рабочая, не тратьте время и деньги зря…!

    Reply
  8. TitouClair

    (7)На этапе 2 при удалении документов получаю ошибку

    ЗафиксироватьТранзакцию();

    {Обработка.СформироватьОстаткиПоРегистрам.Форма.Модуль(206)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию

    Пришлось сделать без транзакций.

    Но больше удивило, что дата выборки документов по конец года указанной даты — это зачем?

    Хотел свернуть базу на 01.01.15, удалились все доки за 15-ый год.

    Reply
  9. TitouClair

    Не учтено максимальное кол-во строк табличной части в 9999 строк. В результате док ОстаткиПоРегистрам не проводится, 1С падает с сообщением о нехватке оперативы на ПК.

    Reply
  10. CheBurator

    (9) этого недостатка лишен использованные мной и доработанные документ «Универсальный двигатель объектов». Для свертки пользуюсь им. Полностью автоматической нет, в полуавтомате. Создал документ. Выбрал какой регистр свернуть. Получил совокупность документов, разбитую на обозримые порции в каждом документе. скорость в основном определяется скоростью сворачивальщика по указанию какие регистры сворачивать и удалением ненужных документов. 8 Гиг ТиС свертывается неспешно за час-полтора-два, сперерывами на кофе. если надо быстро — то сесть и свернуть без перерывов займет те же самые 40 минут-час.

    Reply
  11. TitouClair

    (10)можете поделиться? Мне этого будет достаточно. Хотя я, наверное, и в данный метод разделение на части вставлю.

    Reply
  12. TitouClair

    Что ж вставил проверку на кол-во строк в текущем документе, наткнулся на еще одну особенность:

    номер документа дается по индексу регистра в метаданных.

    опять же, зачем? Это где-то решает проблемы с нумерацией документа?

    У меня получилось так, что документ по первому регистру содержит более 50000 строк. После моей правки док разбивался на 6 документов по 9999 строк. А этот способ нумерации оставляет тч только у первого документа, а остальные очищает, т.к. их номер соответствует индексу следующих регистров.

    Reply
  13. TitouClair

    О, ну класс, а еще время у документа не ставится в 0:0:0, как это указано в обработке

    КР.УстановитьВремя(0, 0, 0);

    КР.Записать();

    не работает.

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

    Т.о. универсальность обработки все же сомнительна. Доработка еще требуется.

    Reply
  14. корум

    свертку лучше брать испытанную на кошках, с публикацией 2006-2008 года.

    Reply
  15. Probot1c

    Ого! 10-40 минут! Звучит очень впечатляюще! у меня обычно около 2х часов уходило…

    Reply
  16. CheBurator

    (12) бред какой-то…

    Reply
  17. CheBurator

    (11) поделиться — нет.

    Reply
  18. корум

    (17) ну ты жадина, хоть бы ссылку на нормально работающую приблуду на инфостарте выложил.

    Смотри, тут теперь ВНЕЗАПНО кнопка «пожаловаться» появилась.

    Накропают донос на тебя, как упёртого кулака-единоличника.

    Reply
  19. TitouClair

    (16)Что именно бред? Способ нумерации, который сделан в обработке? Согласен, бред. Но факт, там сделано именно так:

    Для к = 1 По Метаданные.Регистр() Цикл



    ОбработатьРегистр(к, ИмяРегистра);

    Процедура ОбработатьРегистр(ИндексРегистра, ИмяРегистра)

    КР = СоздатьОбъект(«Документ.ОстаткиПоРегистру»);

    Если КР.НайтиПоНомеру(ИндексРегистра, КонДата) = 0 Тогда

    КР.Новый();

    КонецЕсли;



    КР.УдалитьСтроки();

    Reply
  20. корум

    (11) лови бесплатное.

    http://infostart.ru/public/13982/

    (19) ну недописал автор нумерацию после того, как ему про 9999 строк указали.

    Reply
  21. TitouClair

    (20)благодарю. я уже и эту допилил. Не зря ж покупал. Но на всякий и ту схороню.

    Reply
  22. bsturtle

    Неплохо. то что надо. спасибо. очень неплохой универсальный полуфабрикат. помогло

    Reply
  23. nameslav

    Всё хорошо, реально быстро работает. Но как вы решаете проблему с «Прграмме не хватает оперативной памяти компьютера» ?

    У меня на остатках по покупателям обработка выдает примерно 280 тысяч строк в документ. Само собой документ не проводится с ошибкой на нехватку памяти ! Это у меня еще 1С пропатчена до 4 Гб ОЗУ …

    Reply
  24. CheBurator

    (23) у меня свертка работает тоже быстро. я ограничился 2000 строк в документ, при превышении автоматом разбивается на доки по 2000 строк

    Reply
  25. nameslav

    Я нашел способ получше. При создании строк по Покупателям я на этом склад документов прекратил. Удалял старые доки в ручную, и проводил в ручную Начальные остатки на этом изобретенном документе. Кроме остатков по Покупателям. Эти остатки ввёл через другую обработку — она кстати меньше строк рожает и само-собой меньше места в базе оставляет при том же начальном остатке.

    Её наименование 13982_Obrabotka_Svertka_ostatkov_TiS_9.hh_.ert — она есть в Инфостарте под этим цифровым номером…

    Reply
  26. nameslav

    (24)Я нашел способ получше. При создании строк по Покупателям я на этом склад документов прекратил. Удалял старые доки в ручную, и проводил в ручную Начальные остатки на этом изобретенном документе. Кроме остатков по Покупателям. Эти остатки ввёл через другую обработку — она кстати меньше строк рожает и само-собой меньше места в базе оставляет при том же начальном остатке.

    Её наименование 13982_Obrabotka_Svertka_ostatkov_TiS_9.hh_.ert — она есть в Инфостарте под этим цифровым номером…

    Reply

Leave a Comment

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