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




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

    Здравствуйте. Будет работать с версией 3.0.67.74?

    Reply
  2. insurgut

    (1) да, структура документа Операция не меняется, поэтому на любой версии работать будет.

    Reply
  3. ksenym

    Замену сделал не во всех документах, почему так?

    Reply
  4. insurgut

    (3) слишком много вариантов, чтобы однозначно ответить. Очень часто не закрыв период (год) сворачивают базу и пытаются избавиться от старых документов — в этом случае уже индивидуально нужно смотреть документ операции и регистр, по которому переносятся остатки и дорабатывать обработку под себя. Возможно в книге покупок/продаж, сформированных позднее есть ссылки на документы старого периода — обработка в данном случае не поможет, т.к. обрабатываются только документы Операция сформированные переносом. Так же ссылки остаются в последовательности документов, которая использовалась при переносе с бухгалтерии 2.0 — опять таки обработка данная к этому отношения не имеет, и убрать ссылки из данной последовательности можно только сняв на время конфигурацию с поддержки, удалив в конфигураторе данную последовательность, удалив после этого документы, после чего вернув конфигурацию обратно на поддержку.

    Часто акты сверок содержат ссылки на старые документы — тут перед удалением акты сверок лучше убрать из базы.

    Reply
  5. ksenym

    База свёрнута после закрытия периода, операции сформированы переносом, система но — УСН. Актов сверок в программе нет.

    Reply
  6. insurgut

    (5) каким переносом? Если каким-то сторонним, то вероятнее всего документы, на которые ссылаются операции записаны с признаком Проведен, чего при стандартной свертке документов не бывает, т.к. документы помечаются на удаление. Эта обработка заменяет ссылки только для тех документов, которые помечены на удаление.

    Reply
  7. ksenym

    Стандартная свёртка 1С ((((. Все документы помечены на удаление вижу их в журнале операций. Удалилось больше половины, остальное, видимо, уже только после ручной замены ссылки в документах, которые остались.

    Reply
  8. fenix2015

    День добрый, могу ли я купить вашу обработку минуя данный сайт?

    (им пользуюсь редко, а покупать абонемент из-за одной обработки дорого)

    Reply
  9. user1226970

    Подскажите пожалуйста,где что посмотреть,чтобы ушла ошибка при подключении обработки-«Нарушение прав доступа!»

    Reply
  10. user1226970

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

    Reply
  11. insurgut

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

    Reply
  12. user1226970

    Я поняла,что сначала мы запускаем вашу обработку,а потом уже стандартное удаление,я про это и говорю,что остаются документы типа сф,пакеты Эл.документов и т.д,у которых замена не произошла и в итоге при Удалении объектов они не уходят!

    Reply
  13. insurgut

    (12)

    Я поняла,что сначала мы запускаем вашу обработку,а потом уже стандартное удаление,я про это и говорю,что остаются документы типа сф,пакеты Эл.документов и т.д,у которых замена не произошла и в итоге при Удалении объектов они не уходят!

    Не все базы одинаковые. Нужно смотреть какие именно документы/записи регистров ссылаются на помеченные на удаление документы. Обработка в основном работает с регистром Хозрасчетный. Всех нюансов учесть она не может.

    Ещё много ссылок остается, если свертка базы происходит при некорректно закрытом (не закрытом) периоде, на конец которого происходит свертка.

    Reply

Leave a Comment

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