Разделительный (ликвидационный) баланс форма 230 (0503230) со счетами 303.07, 303.08, 303.09, 303.10, 303.11 и NEW с заполнением счета 210.04




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

9 Comments

  1. evgev

    ОЧЕНЬ БОЛЬШОЕ СПАСИБО! Искал эту форму, (упр.образования требовало), я эту форму написал сам,но не работала выгрузка в свод отчетов 8.1, а эта форма вроде загрузилась, надо проверить (только под другим приказом загружается — 128н, а надо 115н, щас разберусь…). А есть что-нибудь по автозаполнению формы 128 и 138 (в 77 и 8.1)? А есть эта форма (230-я) для 8.1?

    Reply ↓
  2. balthasar

    Пожалуйста! Да, забыл добавить, что поддерживается выгрузка в Свод отчетов (в 7.7 точно, но по идее в 8 тоже должно). По автозаполнению форм 128 и 138 пока ничего нет, т. к. пока нет ясности и четких инструкций по заполнению этих форм 🙁 Для 8.1 230 формы у меня к сожалению нет. Да, и не забываем плюсовать!!

    Reply ↓
  3. Dansur

    (2) 💡 =»+» 😉

    Reply ↓
  4. lihomanov

    держи ++++ 😀

    Reply ↓
  5. marikor

    СПАСИБО от всей души за бескорыстную помощь!

    ++++++++++++++++++++++++++++++++++++++

    Reply ↓
  6. balthasar

    (7) Пожалуйста! 😀

    Reply ↓
  7. Dansur

    Сдавая эту форму не забывайте что не существует законодательно утвержденного баланса со счетами 303.07 — 303.11. любые требования испольнительного органа о сдаче 130 баланса вышестоящим — тем более не законнны, т.к. этот баланс годовой. с 230 разделительно-ликвидационным ситуация аналогичная. нет утвержденного баланса-значит нет и нормальной его выгрузки, значит в форматах не зарезервинованы коды строк — и автоматическая и корректная сдача его главному распорядителю — не возможна. за обработку автору плюс , а вот просить плюсовать — не стоит — не вежливо, здесь этого многие (и я в том числе) не любят

    Reply ↓
  8. balthasar

    (9) Понятно, что требовать с учреждений ф.230 в течение года — это местная инициатива распорядителей. А по поводу того, что нет нормальной выгрузки, это вы зря! Моя форма выгружается без проблем, а если её предварительно загрузить в Свод отчетов, то данные также без проблем туда загрузятся 😀

    А что касается того, что я просил плюсовать мою обработку, так давайте порассуждаем. Если бы я выложил какую-нибудь очередную обработку, например, по перенумерации элементов какого-нибудь справочника или что-то подобное (никого не хочу обидеть, упаси боже), то моя настойчивая просьба плюсовать, конечно была бы сверхнаглостью. Но данная форма является узкоспециализированной (проще говоря никому кроме бюджетников она не нужна), эта форма является регламентированной и, поскольку, сейчас как раз «отчетная» пора, то в этой форме пользователи явно заинтересованы. То есть те 80 с лишним человек, которые уже скачали эту обработку, по-вашему, сделали это чисто из любопытства или ради интереса покопаться в коде? Я думаю, что они в ней нуждались и она им пригодилась именно в этот момент. Поэтому я не вижу ничего зазорного в своём напоминании 🙂

    И ещё раз моя искренняя благодарность тем сознательным людям, которые не пожалели своих сил и времени, чтобы нажать плюс 🙂

    Reply ↓
  9. xaker1C

    Спасибо за обработку

    Reply ↓

Leave a Comment

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