Поиск отрицательных остатков при проведении Расчета Себестоимости (РАУЗ)




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

8 Comments

  1. Константин С.
    При проведении документа Расчет Себестоимости по бухгалтерскому учету может выскочит сообщение «Обнаружены отрицательные остатки по регистрам учета затрат» Раздел Учета МПЗ.

    а смысли искать до документа?

    Как раз было конкурентное преимущество Рауз, что можно уходить в минус. Что возможно при изменении даты документы случайно или нет.

    Главное чтобы минусов небыло на конец расчетного периода, т.е. месяца. Вот на это и ругается:

    При проведении документа Расчет Себестоимости по бухгалтерскому учету может выскочит сообщение «Обнаружены отрицательные остатки по регистрам учета затрат» Раздел Учета МПЗ.
    Reply
  2. protexprotex

    Не совсем понял. А чем обычный отчет — ведомость по учету МПЗ не устраивает? — там все это же и выводится.

    Reply
  3. hromovanton

    Может быть ситуация, когда Номенклатура одна, но Аналитика учета затрат — два разных значения, тогда Ведомость по учет МПЗ (если она настроена на вывод номенклатуры ,а не аналитики учета затрат) не покажет минусовой остаток!

    Но естественно, Ведомость учета МПЗ можно настроить и для вывода аналитики учета затрат.

    Эта обработка показывает именно те минусовые остатки, которые находит Расчет Себестоимости когда ругается на наличие отрицательных остатков. Т.е. мы сокращаем время на поиск всех минусовых остатков, получая именно те записи, которые не удовлетворяют Расчет Себестоимости!

    Reply
  4. hromovanton

    (1) Пример: вы реализовали больше чем выпустили или есть на складе! Либо списали в минус! В таком случае можно сразу увидеть список документов которые делают движения в минус!

    Повторюсь, что отчетом Ведомость по учету МПЗ можно просмотреть все ошибки!!! Во многих случаях — он удобнее. Эта обработка призвана облегчить проверку отсутствия минусовых остатков .

    Reply
  5. Константин С.
    Пример: вы реализовали больше чем выпустили или есть на складе

    (4) дело в том что этот контроль актуален 31, что бы минус не перешел на следующий месяц.

    И довольно частая ситуация когда Реализация идет прямо с конвейера. А Отчет по выпущенной продукции или в конце смены (недели/месяца/отчетного периода).

    И по факту у вас все реализации в минус. А по итогу расчетного периода +/- собираются.

    В этом случае нет смысла в документах.

    Шерстить всю базу на минусовые документы нет смысла.

    1. Отчет за месяц «По ключам» на наличие минусов в количетве

    2. Далее отчет с отбором минусового ключа и детализаций по регистратору (если очень хочет увидит от куда ноги ростут).

    Reply
  6. hromovanton

    (5) Да, для этого и нужен отчет Ведомость по учету МПЗ. Тем более ,что в большинстве случаев эту работу выполняет администратор или программист или уже обученный и отлично разбирающийся в учету бухгалтер.

    Но , как вы уже написали, отчет нужно перенастраивать. Т.е. как минимум у вас будет сформировано два варианта отчета для того, что бы найти нужный документ.

    Еще раз повторюсь, эта обработка не сможет заменить отчет Ведомость по учету МПЗ. Он просто покажет вам все минусовые остатки, а дальше вы уже решаете сами, что с этим делать. Но, на моем опыте, эта обработка облегчает в первую очередь работу программиста, т.к. научит нажимать кнопку в обработке и анализировать полученный результат можно рядового бухгалтера. И этот же бухгалтер сможет исправить ряд «поверхносных» ошибок, что уже хорошо!

    Reply
  7. Константин С.
    Он просто покажет вам все минусовые остатки,

    накой!!!! Учи мат.часть)

    Займись своим образование почитай http://v8.1c.ru/metod/books/book.jsp?id=301

    Может и поймешь что такое РАУЗ и как с ним работать.

    Reply
  8. hromovanton

    (7) Я занимаюсь своим образованием. Спасибо за совет. Я вам в доступной форме объяснил. Если вы считаете что я путаю РАУЗ с партионным учетом или не понимаю основ работы, то считаю этот разговор с вами в дальнейшем бессмысленным. Вы должны понимать, для чего Документ Расчет Себестоимости выводит сообщения о том, что обнаружены отрицательные остатки по регистрам учета затрат и что с этим делать или не делать. Сами же написали : 1. Отчет за месяц «По ключам» на наличие минусов в количетве

    И кто вам сказал про «Шерстить всю базу на минусовые документы».

    Я не ищу все документы, которые двигают остаток в минус, это обессмыслено при РАУЗ. А вот вывести список документов по аналитике учета затрат, которая в конце месяца ушла в минус — может быт полезно.

    Естественно минуса могут закрыть в конце месяца. А могут и не закрыть!

    Вы, неверное, не так поняли фразу : «Кнопка «Расширенный поиск» выводит все движения по номенклатуре с отрицательным конечным остатком.» Что под этим имеется ввиду, я написал выше!

    Reply

Leave a Comment

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