Универсальная свертка + корректировка регистров SQL 1.0




Принцип обмена данными из 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. Вадимко

    Если необходимо контролировать ссылки в остатках на подчиненные и прочие документы — делаем по аналогии

    ДокП.ВыбратьПодчиненныеДокументы(,,Док.ТекущийДокумент());

    Пока ДокП.ПолучитьДокумент() = 1 Цикл

    Если ЕстьСсылкиНаОбъект(ДокП.ТекущийДокумент()) = 1 Тогда

    ЗаписьВЛог(Строка(Док.ТекущийДокумент())+» есть остатки по подчиненным документам, не удален»);

    Удалять = 0;

    Прервать;

    КонецЕсли;

    КонецЦикла;

    В общем надеюсь понятно

    Отработала обработка в этот раз за час (можно еще ускорить), в прошлом году на базе тех же клиентов — примерно 2.5 на DBF (старая обработка)

    Reply
  2. devsvc

    > (не забываем про картинки)

    Как это сделать попроще?

    Reply
  3. Вадимко

    Сохранить картинки в файл из моей конфиги и потом добавить в свою библиотеку

    Reply
  4. Вадимко

    Кое какие мелочи делались на ходу без проверки

    Основные моменты прошли боевое крещение

    Так что пишите письма ежели что

    Reply
  5. devsvc

    Перед запуском Свертки видимо нужно запустить Wrap например на 31.12.06.

    Создадутся остатки на эту дату.

    Что проще сделать чтобы не удалить их Сверткой.

    Reply
  6. Вадимко

    Ничего запускать не надо

    Свертка сворачивает регистры

    Проводки в базе заказчика я делал по-тупому (все обнулял и заливал остатки)

    Важнее было понять что можно удалять а что нет (инфа есть в регистрах и т.п.)

    Reply
  7. devsvc

    >Проводки в базе заказчика я делал по-тупому (все обнулял и заливал остатки)

    Например я провел Свертку на 31.12.06.

    Половина документов (проводки остались) не удалена из за наличия ссылок.

    И как мне залить бухгалтерские остатки?

    Я думал сделать wrap (удалить проводки) свертку бухгалтерии на 31.12.06.

    Затем свертку Регистров на 30.11.06.

    Reply
  8. Вадимко

    Разницы нет, но логичнее делать манипуляции с проводками после свертки, не правда ли (в том случае если документы имеют и проводки и движения)?

    Как залить?

    Списать остатки в ноль

    А потом выгрузить из эталонной базы

    Reply
  9. Вадимко

    Пробовали в деле?

    Reply
  10. devsvc

    Я пока на 1 стадии

    Стандартная Wrap очень долго (10-15 часов 2 года убирает), база 15 гб — комплексная. Log файл разрастается до 13 гб.

    Занимался wrap_sql_dbf — Быстрая свертка Бухгалтерских баз (1c.proclub.ru).

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

    Черновые проходы свертки Регистров делал, достаточно неплохо.

    Но мы оставляем 2 года и возрат ТА в текущее состояние занимает время 2-3 часа.

    Для сверки баз купил ж. диск 500 гб — завтра поставлю.

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

    Reply
  11. Вадимко

    В общем-то более быстрым может быть только удаление объектов напрямую (весьма быстро)

    Но это потребует последующего ТиИ, на базе 10 гиг у моего компа ушло 8 часов

    Такой долгий перенос ТА :0

    Возможно из-за идиотского регистра в котором ведется УСН…

    Если не сдвигать ТА — замедлится удаление

    ЗЫ. Ну это я преувеличил слегка, есть поле для оптимизации 🙂

    Reply
  12. VV

    Вадимко, а что — тока для СКУЛя работает?

    Reply
  13. Вадимко

    Да, для DBF не буду делать

    По сути мало будет отличаться

    Reply
  14. kalleka

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

    Reply
  15. kalleka

    к 14, имелось в виду основание не висит в остатках

    к примеру до свертки

    остаток на дату свертки 0

    докоснование движение: остатки ТМЦ товар расход 10 (датаДок до свертки)

    корректировка: остаки ТМЦ товар расход -10(датаДок после свертки)

    : остаки ТМЦ товар расход 5

    остаток после корректировки 5

    после свертки:

    основания нет, корректировка делает движения: остаки ТМЦ товар расход 5

    остаток после корректировки -5

    после свертки* основания нет

    Reply
  16. Вадимко

    (14) Не очень понятно из-за чего такое может случиться

    Конечно я сталкивался с похожим (допустим частичная оплата документа в обрезаемом периоде) — все было корректно

    Документ «Двигатель регистров» должен был зафиксировать остаток +5 по-любому

    Может базу обрезали не на ту дату что надо либо меняли даты документов ДвижениеРегистра

    Ну или кривое что-то в сторнировке 🙂

    Если все же действительно что-то не так — можно проверять такие ситуации см. пост № 1 и не удалять некоторые документы

    Reply
  17. UserPro

    ❓ Проверил работает.

    Режим стандартной обработки ( неиспользую внешнюю компоненту ).

    Добавил простую процедуру удаления документов

    (удаляем все доки на дату свертки) с контролем % выполнения удаления

    интересно до 80% удаление происходит быстро после резкое торможение.

    ❓ ? кто знает почему.

    Reply
  18. Svetos

    Как ее установить? Я объединила конфигурации, но теперь называется мой предприниматель сверткой 1.0 СКЛ, журналы открываются с ошибкой, документы видимо пустые, т.к. не вижу ни контрагента, ни суммы. А дальше то что?

    Reply
  19. yrancev

    Столкнулся с проблемой на SQL 2005, Сам я прямые запросы не знаю поэтому прошу помочь исправить данную обработку под SQL 2005. Ошибка:

    «ТЗ = ЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);

    {Обработка.СверткаSQL.Форма.Модуль(527)}: State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ’77’.»

    Reply
  20. var_ad

    Комментарии настораживают… но, думаю, рискнуть стоит, а вдруг получится… Другими свертками не удалось свернуть базу sql в 12 гигов. А вдруг получится)))

    Reply

Leave a Comment

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