Свертка информационной базы для УТ 11.4 (исправлена ошибка регистра накопления Расчеты по договорам кредитов и депозитов)




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

13 Comments

  1. yavezde

    Здравствуйте, для Управление торговлей, редакция 11 (11.4.6.230) не подходит?

    Reply
  2. user732170

    (1) Добрый день, подходит. Просто так как у меня не было необходимости добавлять в конфигурацию и постоянно использовать обработку в работе, я не стала писать эту процедуру (Она необходима именно для прописания обработки в базе). Просто запустите обработку через Файл => Открыть. Только что протестировала на версии 11.4.6.230 все открывается и работает.

    Reply
  3. yavezde

    (2) благодарю, попробую

    Reply
  4. laf

    Добрый день. В этой обработке можно как-то отслеживать процесс? Т.е. понимать, что происходит в каждый момент? Очень этого не хватает в стандартной, там непонятно сколько ждать осталось.

    Reply
  5. user732170

    (4) Добрый день. Нет в этом плане она один в один как стандартная.

    Reply
  6. laf

    ошибка

    Reply
  7. user732170

    (6) Добрый день. Ошибка возникла при работе на последних версиях УТ в связи с изменениями внесенными фирмой 1С. Данные изменения учла. Обработку обновила.

    Reply
  8. compaud

    По окончание обработки остаются документы с коментарием «#Не удалять при свертке базы]».

    Как этого избежать?

    И остатки взаиморасчетов по каким то клиентам вносятся в разрезе заказов, где то в разрезе договоров.

    И если по заказам, то указывается ссылка на помеченный на удаление документ.

    Все затевается как раз для удаления всех документов под чистую. Как этого добиться?

    Reply
  9. user732170

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

    Reply
  10. user775573

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

    Reply
  11. user732170

    (10) Я такой целью не задавалась, так как это по факту не корректно, но точно надо в процедурах

    СформироватьДокументыВводаОстатковТоварыСобственные()

    СформироватьДокументыВводаОстатковТоварыКомиссионные()

    СформироватьДокументыВводаОстатковВозвратнаяТара()

    СформироватьДокументыВводаОстатковТоварыВЯчейках()

    СформироватьДокументыВводаОстатковТМЦВЭксплуатации()

    в запросах поправить условия вида

    ГДЕ ТабРег.КоличествоОстаток > 0 И ЕстьNULL(ПринятаяТара.КоличествоОстаток, 0) = 0

    ГДЕ ТаблицаОстатковПоПартиям.ПредъявленСчетФактура И ТаблицаОстатковПоПартиям.Количество > 0

    И ЕстьNULL(ТаблицаОстатковТоварыСвод.Количество,0) > 0

    ИМЕЮЩИЕ Сумма(ТаблицаОстатковСвод.Количество) > 0

    И естественно осторожно с учетом деления на ноль и только экспериментируйте на копии базы!

    Reply
  12. compaud

    УТ 11.4.8.57

    В документах ввода остатков по взаиморасчетам не заполняется реквизит «Документ расчетов», а он обязателен для заполнения.

    Reply
  13. user732170

    (12) У меня, к сожалению, нет ни одной базы проверить, но таких проблем не было. Вы внимательно посмотрите, а была ли данная аналитика до свертки, не удаляли ли вы после свертки эти документы(без контроля ссылочной целостности) и не изменяли ли что в коде обработки. Ну и если что, то можно создать документ расчетов вручную, указав в нем необходимые данные, а чтоб он больше не «отсвечивался» нигде просто не проводить, и в качестве памятки, из опыта, лучше напишите в комментарии к документу что это для аналитики по свертке или что то вроде этого чтоб понятно было.

    Reply

Leave a Comment

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