Как выиграть сражение с документом УПП "Расчет себестоимости"




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

32 Comments

  1. Risoks

    Не работает при РАУЗ! Надо было это написать! 🙁

    Reply
  2. infostartuser1c

    Согласна с Risoks, хотелось бы такой же, но для РАУЗА.

    Reply
  3. МимохожийОднако

    Интересно, есть ли подобная разработка для Комплексной автоматизации?

    Reply
  4. axxell

    К сожалению у меня нет возможности проверить. Но допускаю, что отчет будет работать и в КА, т.к. КА это обрезанная УПП.

    Reply
  5. zzz_natali

    (4) Что толку(если заработает в КА) — 90% пользователей работают в РАУЗ

    Reply
  6. gull22

    Хотелось бы увидеть скриншот готового отчета с ошибками

    Reply
  7. axxell

    (6) gull22,

    Если в базе нет ошибок — отчет будет пустой.

    Если будут ошибки — тогда и будут выведены строки в соответствии с настроенными группировками. Основная цель отчета — понять до проведения «Расчет себестоимости» выявить будут проблемы или нет.

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

    Reply
  8. axxell

    (5) zzz_natali,

    Отчет работает в Партионном учёте — такова была его цель. В моей компании запустить РАУЗ не представляется возможным: учёт должен вестись и по МСФО (для МСФО такого метода как РАУЗ быть не может) и искажения в стоимости при движении между складами меня также не устраивают.

    Reply
  9. tango

    (8)

    для МСФО такого метода как РАУЗ быть не может

    можно еще несколько слов об этом?

    Reply
  10. kapustinag

    Мысль хорошая, но…

    Запустил на нашей УПП 1.3.29.2, в которой только что расчет себестоимости показал кучу ошибок, в том числе и заявленных в публикации. Отчет формировался 4 минуты, что является очень хорошим показателем, т.к. у нас проведение документа «Расчет себестоимости» сейчас идет порядка 2.5 часов. Но результат — пустая таблица, только шапка.

    Сомневаюсь, что были серьезные изменения в запросе между 1.3.29.2 и 1.3.31.1. Проверю.

    Reply
  11. axxell

    (10) kapustinag,

    Я тоже перепроверил на тестовой базе, где 1 месяц сведен, другой не сведен. В первом случае отчет был пустой, во втором — с записями. Всё как и задумывалось. Но обратите внимание, отчет ловит только 2 ошибки из 7. В моем случае чаще всего сталкивался с 3-мя ошибками.

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

    Reply
  12. axxell

    (9) tango,

    Тут всё просто. На эту проблему моё внимание впервые обратил Насипов Фарит в своей статье. Идея такова: т.к. РАУЗ рассчитывает себестоимость иным способом, чем определено в МСФО, то методологически использование РАУЗ для подготовки отчета по МСФО невозможно. Это же подтвердили мне аудиторы Ernst and Young — у нас ежегодно проводится проверки и в состав этой проверки входит проверка методов выбытия запасов. Суть проверки заключается в анализе всех движений по одному или нескольким артикулов на соблюдение правилам учётной политики. Т.к. рассчитанная себестоимость в партионном учете по ФИФО будет отличаться от РАУЗ ФИФО — в результате аудиторы зафиксируют нарушение метода выбытия запасов.

    Reply
  13. kapustinag

    (12)

    Ну тогда получается, что такой же вердикт могут вынести аудиторы и без МСФО. Себестоимость ФИФО при партионном учете вполне может отличаться от рассчитанной в РАУЗ. То есть каждая компания, перешедшая на РАУЗ, рискует «попасть» на такой вердикт при аудиторской или налоговой проверке? Что на этот счет говорят методологи? Или, может быть, уже были прецеденты подобных разбирательств с проверяющими органами?

    Reply
  14. kapustinag

    (11)

    Да, забыл написать… Обещанную статью буду ждать с нетерпением. Тоже боремся с себестоимостью, в том числе с помощью собственных наработок (Автор — не я, так что выложить не могу). Интересно будет прочитать о чужом практическом опыте.

    Reply
  15. svetatolk

    (7) воспользовалась Вашей обработкой «Анализ ошибок себестоимости». Возлагала очень большие надежды, но он сформировался пустой. Хотя при этом у меня не закрывается счет 20 на несколько тысяч. Причем, только по одной затрате. Я определила, что это остатки по регистру Незавершенное производство. Никакие отчеты не помогли понять причину не списания этих остатков.Методом волшебного тыка стала увеличивать количество действий «Расчет затрат встречного выпуска»,и остаток в РН «Незавершенное производство» начал таять. Есть ли у Вас опыт и какие-либо инструменты для «отлова» проблем со встречным выпуском?Например, до расчета себестоимости определить количество итераций, требуемых для расчета затрат по встречному выпуску или отчет, который позволил бы выявить причину, почему незакрытый остаток остается только по какой то одной затрате.

    Reply
  16. axxell

    (15) svetatolk,

    Добрый день Светлана. Отчет из статьи позволяет ловить только 2 типичные ошибки из расчета себестоимости. Если отчет формируется и нет никаких данных, то значит эти ошибки отсутствуют. Я на днях напишу уже более полную статью по поиску ошибок при расчете себестоимости.

    Теперь по поводу встречного выпуска. Такая ситуация возникать может когда угодно. В моей базе нужно 3 документа для закрытия себестоимости, связанные со встречным выпуском. В курсе «УПП от А до Я» Алексей Бурьяненко (преподаватель курсов 1С) говорил о том, что может понадобиться 8 раз проводить Расчет себестоимости с этапом закрытия встречного выпуска. Также он упомянул о случае, когда для закрытия понадобилось 17 документов с встречным выпуском. В моей базе, я разделил на несколько документов Расчет себестоимости: с этапами до встречного выпуска, отдельно несколько документов со встречным выпуском и потом остальные этапы с закрытием себестоимости.

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

    Reply
  17. svetatolk

    спасибо за ответ!я согласна, что со встречным выпуском при партионке надо что то дорабатывать. я параллельно работаю и с РАУЗ в Комплексной автоматизации, дак там проблем со «встречкой» вообще не возникает. правда, есть проблемы другого характера)), но это уже другая история, как говорит Каневский.

    Reply
  18. AlexO

    (4)

    т.к. КА это обрезанная УПП.

    КА — это не обрезанная УПП, а нечто, созданное на основе обрезка от УПП.

    В КА нет партионного учета, который вы здесь и проверяете. Расчет себестоимости только для РАУЗ.

    А «партионный» учет — только количественный для склада.

    Reply
  19. AlexO

    (12)

    Т.к. рассчитанная себестоимость в партионном учете по ФИФО будет отличаться от РАУЗ ФИФО

    вообще-то это и без Фарита понятно — что РАУЗ это не партионный учет, и МСФО, в котором все прозрачно и обоснованно — ну никак не сочетается с 1совым «РАУЗ».

    И что еще со своим так называемым «РАУЗ» (который на самом деле — понимание РАУЗ через 1С) все напрыгаются.

    Reply
  20. AlexO

    (7)

    Ваш отчет, видимо, делает, как я понял только одно — примитивно сверяет, чтобы совпадали аналитики в приход-расход (причем, видимо, для сравнения документов и поиска «непохожих» используется сугубо частный способ сравнения, который используется на вашем предприятии).

    Reply
  21. AlexO

    (1) Risoks,

    РАУЗ и партионка — несовместимые методы учета и расчета.

    Надо было это написать!

    оно и написано:

    Отчет «Анализ ошибок себестоимости» (для Партионного учёта)
    Reply
  22. AlexO

    (5) zzz_natali,

    90% пользователей работают в РАУЗ

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

    Reply
  23. AlexO

    (2) infostartuser1c,

    тоже учите, что и где и с чем работаете.

    Reply
  24. axxell

    (20) AlexO,

    Он действительно делает примитивную проверку по сверке аналитик. Но это не частный случай, а общий для всех предприятий. Суть такова — я взял запрос из документа расчет себестоимости и встроил в этот отчет. В результате, отчет можно запускать до расчета себестоимости и сразу узнать проведется ли расчет с ошибками или без ошибок. Отчет помогает сэкономить время.

    Reply
  25. AlexO

    (24)

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

    Reply
  26. AlexO

    (24)

    ну хоть так сделал 🙂

    Только напишите четко и конкретно, что считаете, и какие ограничения «проверки» — а не в стиле «Да я эту себестоимость как хошь верчу» ))

    Reply
  27. AlexO

    Плюс — за адекватное понимание ситуации и оценки предмета.

    Reply
  28. AKR_Vl

    При давальческой схеме (мы давальцы) отчет не работает.

    Reply
  29. Konstantin-2006

    Делаем пробный расчет себестоимости (партионный учет). Проверил работу на версии УПП для Украины 1.3.31.2. Отчет работает, но при формировании выдает ошибку, если не указан период, но это не проблема.

    Reply
  30. 1C74

    Отчет работает (УПП 1.3.71.2, партионный учет).

    Reply
  31. Mastekor

    Не работает

    1С УПП 1.3.97.5 (партионный учет)

    Просто пустой отчет…

    Reply
  32. axxell

    (31) Уже давно не занимаюсь УПП. Извините, но не смогу помочь. В версии, с которой я работал, отчет запускался.

    Reply

Leave a Comment

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