Распределение номенклатурной группы по 23 счету для случая 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='\

15 Comments

  1. cbr900

    Да, только стандартное Закрытие месяца потом не сможет правильно закрыть.

    Reply
  2. ifal

    (1) Написали А, напишите и Б.

    Reply
  3. cbr900

    Нет движений по регистру Выпуск продукций.

    Для подобных проводок 23-23 надо использовать ОПЗС.

    Заполнение статьи затрат по Кт счета не предусмотрено и будет потом с точки зрения пользователя «странно» закрыто.

    Reply
  4. ifal

    А если нет никакого выпуска продукции? Если там затраты другого рода. Видимо я не удачно назвал номенклатурные группы. А про выпуск продукцию согласен, поправил статью.

    Reply
  5. cbr900

    Если есть Кт 20,23,29 счетов — это выпуск (продукцииуслуг).

    Затраты иного рода — это что «перекидка» затрат? Так тогда это тоже выпуск: НГ 1 оказала услуги НГ 2, все укладывается в логику ОПЗС.

    Reply
  6. ifal

    (5) Есть к примеру объекты производственные разные, на которых происходят работы, когда известно, к какому объекту отнесены расходы, то тут понятно как оформлять документы, а когда не известно, то данные аккумулируют на каком-нибудь субконто, например, есть 5 произ. объектов, каждый это ном. группа, произвели платный мед. осмотр сотрудников, которые на нескольких объекта задействованы, затраты упали на 23, но как их распределить по объектам? Поэтому их собирают на какой-нибудь ном. группе, а потом долями перераспределяют. ОПЗС нет.

    Reply
  7. cbr900
    Поэтому их собирают на какой-нибудь ном. группе, а потом долями перераспределяют

    Все верно. Это делается через ОПЗС

    Reply
  8. TODD22

    (6)

    произвели платный мед. осмотр сотрудников, которые на нескольких объекта задействованы, затраты упали на 23

    Платный медосмотр сотрудников имеет отношение к вспомогательному производству?

    Reply
  9. ifal

    (7) Перепроверил, действительно получается по сути тоже самое, кроме того, что движения по КТ по 2,3 Субконто пусто, но это не критично для закрытия месяца, ресурсы оборотные, только если бухгалтера не перфекционисты. Так же появляются движения по рег. накоплению Выпуск продукции, но для этой задачи его можно и не заполнять. Склоняюсь к тому, что все-таки правильней было бы делать в документе ОПЗС. Однако задачу решил как ее поставили.

    Reply
  10. ifal

    (8) Это условный пример, в данном случае суть не в этом.

    Reply
  11. TODD22

    (10)Так привели бы реальный пример…..

    Reply
  12. ifal

    (11) Возьмите, например, транспортные расходы. Суть-то не поменяется.

    Reply
  13. TODD22

    (12)У вас есть свой парк например. И вы не отражает выпуск услуг/работ по вспомогательному производству?

    Reply
  14. ifal

    (13) Сторонние контрагенты оказывают определенные транспортные услуги. И я не говорил, что не оформляют выпуск продукции. Здесь речь об особенностях учета, на сколько они корректны об этом речь не идет. Идет речь о ситуации и о том как ее решают, методология не моя, только обработка.

    Reply
  15. TODD22

    (14)Это же не ваше собственное вспомогательное производство.

    Reply

Leave a Comment

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