Установка границы последовательности для УПП 1.3




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

12 Comments

  1. AneJIbcuH

    Чем вас не устроила типовая обработка в УПП: http://joxi.ru/Y2LQgOyTnNw11A ? К тому же гораздо функциональнее.

    Reply
  2. vano-ekt

    (1) стартмани за типовую не капают 😀

    Reply
  3. AneJIbcuH

    (2) А я тут все планы порушил )

    Reply
  4. acsent

    Но почему такой убогий интерфейс?

    Reply
  5. slag

    (1)Тем, что стандартной обработкой можно сдвинуть только границу партий, в предлагаемой обработкой можно сдвинуть границу РасчетыПоПриобретениюОрганизации и РасчетыПоРеализацииОрганизации

    Reply
  6. slag

    (2)В каком месте она типовая?

    Reply
  7. slag

    (4)Главное функционал. Те кто в УПП ведут учет по УУ и БУ, меня поймут, т.к. очень часто бухгалтерия частенько наровит поменять проводку в закрытом периоде, а из-за одного документа запускать восстановление состояния расчетов не предпочтительно, это касается тех, кто использует партионный учет

    Reply
  8. serred

    На INFOSTART-е есть обработка для восстановления последовательностей по приобретению и реализации и гораздо более функциональная (с возможностью отбора по контрагенту и договору http://infostart.ru/public/164918/). Там же принудительно устанавливаются границы без перепроведения документов.

    Reply
  9. slag

    (3)

    (8)Ни кто не заставляет вас, скачивайте то что вам нравится. Моя обработка с задачей сдвинуть принудительно границы расчетов и партий на заданную дату, справляется на 100%.

    Reply
  10. 17-40@mail.ru

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

    У нас в месяц порядка 20-25 тыс документов, каждый день несколько партий производится и перемещается, куча товаров и комплектующих, скажем смещение на 2 месяца назад грозит временем проведения и блокировки таблиц в пару дней. даже на нашем на совсем старом железе и дисковыми массивами на ссд и выделенной оперативной памятью под скуль порядка 150 гб, чтобы можно было загружать в память обрабатываемые таблицы целиком.

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

    Выход, напрямую в скуле это делать запросом вида:

    Update [dbo].[_Seq25697]

    set [_Fld25699] = 0x01

    where [_Fld25698RRef] = 0xA2B20015174CFA4511DD54A14025EB9B and [_Period] < ‘4017-01-05 00:00:00.000’ and [_Fld25699] = 0x00

    Дело нескольких секунд.

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

    Reply
  11. 17-40@mail.ru

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

    Reply
  12. novatrade

    Добавлю свои 5 копеек, хотя тема старая. Столкнулся именно в УПП.

    В УПП при проведении любого документа, входящего в последовательность и датой меньше, чем граница последовательности, сразу меняется граница последовательности на дату документа. Поэтому восстановление последовательностей надо проводить с учетом всех последовательностей, входящих в конфигурацию. Даже с учетом управленческого и бухгалтерского. Иначе, если Вы восстановите сегодня последовательность по партиям в бух.учете, а завтра в управленческом — то завтра Вы нарушите последовательность в бух. учете. Это надо учитывать всегда. Сдвиг границы последовательности никак не связан с перепроведением документов (не восстанавливает партиионный учет), а сдвигает только границу. Если Вы уверены, что перепроводить нет смысла — можно двигать границу. Но это вопрос больше к бухгалтеру, чем программисту.

    Reply

Leave a Comment

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