Расчет себестоимости и его Откат в ERP: практика применения




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

24 Comments

  1. 1cNike

    Спасибо за статью, узнал кое-что новое для себя.

    Reply
  2. malvasia

    Спасибо за обозрение.

    Сам уже в эту сторону полез. Но, вот, обнаружил эту публикацию, которая убедила меня в этом направлении поработать.

    Действительно, поведение с перепроведением в системе довольно мутное и не однозначное. Уже не знаю, что с этим делать.

    Вопрос по закрытию.

    Можно-ли все регистры перед закрытием месяца просто почистить? Или какие, конкретно, можно очистить в моем случае?

    Ну и потом просто все документы перепровести.

    Руки чешутся. Но пока последствий этого действия еще не представляю. Какие проблемы в связи с этим могут появится.

    Ситуация такая

    Пока еще на этапе ввода всех остатков и ведется ввод первички более месяца. Пока попытки закрытия успеха не имеют.

    Краснота и все такое.

    И еще.

    Операций по производству нет. То есть, блок производства отключен.

    Reply
  3. kristina
    Reply
  4. Suxar
    сделать зачистку записей с Реквизитом «Расчет себестоимости» = Истина по регистрам накопления:

    А не проще ли было список регистров получить так:

     МассивРегистровСебестоимость = Новый Массив;
    
    Для Каждого МетРегистр Из Метаданные.РегистрыНакопления Цикл
    Для каждого МетРеквизит из МетРегистр.Реквизиты Цикл
    Если МетРеквизит.Имя = «РасчетСебестоимости» Тогда
    МассивРегистровСебестоимость.Добавить(МетРегистр.Имя);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    

    Показать

    Reply
  5. AlPi

    От себя могу добавить, что еще есть один вариант проблемы, когда остатки и обороты у регистра себестоимости не идут. Например, у нас на 1 января на 00:01 по продукции остаток был, а проверяешь обороты они пустые. Нигде никакой отчет эту ситуацию не покажет, только через прямой запрос. Понятно, обработка «Предварительный расчет себестоимости» сообщает о отрицательных остатках. Лечится такая ситуация очень просто: Тестирование и исправление базы -> Пересчет итогов.

    Удачи.

    Reply
  6. kristina

    Совершенно с Вами согласна — тоже приходилось сталкиваться с таковой проблемой, только лечением я занималась через режим предприятия : НСИ и администрирование — Поддержка и обслуживание — Управление итогами и агрегатами, при открытии формы Управление итогами и агрегатами в правом нижнем углу «полные возможности» .

    Reply
  7. PerlAmutor

    Поправьте на «ПустаяСсылка» с одним «С».

    Справочник.ВидЗапасов.ПусстаяСсылка КАК ВидЗапасов
    Reply
  8. ifilll

    Спасибо, статья полезная.

    Перепроведение в ERP это писец.

    Reply
  9. andreymazurovdwine

    Добрый день,

    Отличная статья — очень пригодилась! Спасибо автору

    Но.. остался еще вопрос — по очистке Регистров с Реквизитом «Расчет себестоимости» = Истина

    Запрос легко строится и такие Движения находятся, но я сомневаюсь как их «Почистить», чтобы не удалить остальные «нужные» движения.

    В принципе, можно отменить и пере провести документы..

    Плюс в ERP 2.2. более нет такой возможности использовать в Функции ИнициализироватьПараметрыРасчета

    ПараметрыРасчета.Отладка.Вставить(«ОчищатьСтарыеДвижения», Ложь);

    Если кто подскажет фрагмент кода для очисти регистров с «Расчетом себестоимости» = Истина , буду очень признателен.

    Своего опыта по коррекции Движений не хватает.

    Reply
  10. andreymazurovdwine

    Этот фрагмент теперь перенесен в Общий модуль УниверсальныеМеханизмыПартийИСебестомости

    ПараметрыРасчета.Отладка.Вставить(«ОчищатьСтарыеДвижения», Ложь);

    Тем не менее пока не понятно передается ли структура «Отладка», по-моему стандартно — нет. ПараметрыОтладки = Неопределено

    Reply
  11. vvr908

    (10) Параметры отладки, похоже, все-таки передаются, т.к. по факту они отрабатывают.

    Во всяком случае, сохранение таблиц через «КаталогДляСохраненияДанныхСЛУ» работает.

    Жаль только, что в пользовательском режиме воспользоваться этими опциями нельзя, нужно обязательно через конфигуратор включать их.

    Нет ли где-нибудь более подробного обзора этих отладочных опций? Там, конечно, в коде неплохие комментарии, но все-таки хотелось бы подробностей… например, про опцию «ОдинЭтап» — как она работает и где именно указать, какой этап интересует?

    Reply
  12. bdennis

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

    Reply
  13. Tallas

    Инициировать полный пересчет себестоимости можно добавив вручную запись в регистр сведений «Задания к расчету себестоимости». Записи присваиваем следующий порядковый номер, нужный год-месяц и целевую Организацию. «Старые» документы расчета себестоимости и распределения затрат нужно заранее удалить.

    Reply
  14. Ioexpert

    Пишите еще, очень годный контент!

    Reply
  15. Xershi

    С версии ут 11.4.6 или уп 2.4.6 очень хорошо все закрывается если перейти на партионный учёт 2.2.

    И помощник отлично в этом помогает!

    Reply
  16. kristina

    Дорогие коллеги! Спасибо всем за отклики и внимание! Прогресс не останавливается, все куда то движется и развивается, ну и мы как следствие тоже. Статья писалась в свое время и на тот момент на тот уровень erp . Суть статьи была раскрыть то с чем я столкнулась и в надежде, что это кому то пригодиться, кого то натолкнет на некие свои мысли, свои решения и разработки, понимание куда копнуть. Но раз вы сюда проваливаетесь значит что то все таки тяготит, а копать можно в разные стороны начиная с задвоения аналитик учета, у всех свои ситуации … Желаю всем больших успехов и удачи в работе! Спасибо большое за ваши отклики и внимание! И еще раз терпения и успехов!

    Reply
  17. frutty

    Если кто-то до сих пор использует эту статью для очистки данных, которые произвела процедура расчёта себестоимости, то в ERP 2.4.6 (возможно раньше) можно запустить клиент с параметром «/С РежимОтладки» и в настройка расчёта себестоимости появится дополнительный пункт, который позволить очистить старые данные, перед очередным расчётом.

    Reply
  18. Xershi

    (16) добрый вечер. Напишите что статья рассчитана на партионный учет 2.1 а он как известно очень глючный.

    И наверное УП 2.2, если не 2.0.

    Потому что как вы поняли ситуация координально изменилась.

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

    Думаю разработчики УП пришли к тому же мнению и все исправили.

    Reply
  19. jn17

    (17)

    можно запустить клиент с параметром «/С РежимОтладки» и в настройка расчёта себестоимости появится дополнительный пункт, который позволить очистить старые данные, перед очередным расчётом

    А где можно увидеть этот дополнительный пункт, который позволит очистить старые данные?

    Не могу найти…

    Reply
  20. frutty

    (19)

    Reply
  21. jn17

    (20) ну да, а дальше какой из пунктов позволит очистить старые данные перед очередным расчетом себестоимости?

    Reply
  22. frutty

    (21) я не знаю как вам ещё более подробнее описать, если только за вас сделать.

    Reply
  23. jn17

    (22) Зачем же так. Режим отладки запускали некорректно. Все нашлось. Спасибо

    Reply
  24. vse-puchcom

    сталкивался с такой проблемой

    но у нас ситуация такая была

    1) 1с розница 2.2

    2) нужно было настроить отчет валовой прибыли

    3) при перепроведении документов полезли минуса

    4) проблема была в ордерной схеме (она была включена не после начала работы в 1с а где то через 2 месяца вот)

    5) перепроводили документы через групповое проведение документов в меню все функции

    по этому все переделывали вручную то включая то отключая орденую схему

    6 перепроводили дкумуенты:

    перемещения все

    возвраты

    приемка и отгрузка товара( если использовалась ордерная схема)

    вообщем все что связанно с движением товара

    НО ПЕРЕД ПРОВЕДЕНИЕМ ОБЯЗАТЕЛЬНО НАДО СДЕЛАТЬ КОПИЮ БАЗЫ

    Reply

Leave a Comment

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