Сторнирование документов в ERP, УТ11, БП3.0




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

    Если это то, о чем я думаю, то вы сделали мой день риалы)))

    Reply
  2. Vladisa

    скачала, протестила, все отлично пока.

    единственное, у ручной операции почему-то не заполняется автоматом организация в шапке.

    Reply
  3. filterhouse

    (2) У меня была одна организация, поэтому внимания не обратил. Исправил, залил свежую с заполнением организации.

    Reply
  4. Vladisa

    а мне пришлете? не скачивать же второй раз)

    Reply
  5. gull22

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

    Reply
  6. filterhouse

    (5) Хорошая идея. Сейчас времени нет, на выходных наверное сделаю.

    Reply
  7. Vladisa

    (6) долетели уж поди?… © Любовь и голуби

    Reply
  8. Vladisa

    еще косяк вылез-не сторнирует суммы НУ, ПР, ВР от слова СОВСЕМ)

    прошу автора еще раз выслать мне обработку с исправлениями, обещал 😉

    Reply
  9. filterhouse

    (8) По какому регистру не сторнирует? Только что проверял, все работает вроде.

    Reply
  10. Vladisa

    (9) получила обработку но она не открывается, говорит версия не подходит…

    у меня ERP 2.4.

    Reply
  11. filterhouse

    (10) Сейчас нет редакции 2.4, как посмотрю и исправлю вышлю на почту.

    Reply
  12. svetak

    (11) Добрый день. 1. Поправили ли для редакции 2.4? 2. Код обработки открыт, можем сами если что поправить?

    Reply
  13. filterhouse

    (12) Да исправления для 2.4 вносил. Код открыт.

    Reply
  14. filterhouse

    (5) Не прошло и года, реализовал =)

    Reply
  15. user956371

    Спасибо! Кажется, это то, чего так недоставало типовой ERP

    Reply
  16. d.snissarenko
    Если Метаданные.Представление() = «1С:ERP Управление предприятием 2″ или  Метаданные.Представление()=»1С:Комплексная автоматизация 2» Тогда
    

    Добрый день, для пущей универсальности добавьте в код поддержку КА 2

    Reply
  17. filterhouse

    (16) Добрый день. Спасибо за совет, добавил поддержку КА2.

    Reply
  18. it-partner

    Добрый день. У нас КА 2.4. Пробуем обработку. Сторнируем документ от марта 2019. Стоит запрет изменения данных до 31.03.2019. Ошибка:Дате 15.03.2019 соответствует запрет изменения данных пользователя.

    Reply
  19. filterhouse

    (18) Добрый день. Если я правильно вас понял, то проблема в том что стоит дата запрета до конца марта, и вы указали в поле даты сторно 15 марта, и типовые механизмы не дают сделать сторно. Обработка никак обойти такую проверку не может, поэтому можно или дату сторно ставить на апрель, или же переносить дату запрета.

    Reply
  20. it-partner

    Дату сторно мы выбираем апрельскую, но ошибку все равно не дает

    Reply
  21. filterhouse

    (20) Возможно по какому то регистру сведений сторно пытается сделать движения в марте. Попробуйте на вкладке снять галки со всех регистров сведений, может поможет. У меня комплексной нет под рукой и проверить пока не могу. Напишите по какому документу делаете сторно, я на недели посмотрю.

    Reply
  22. de-grishin

    Добрый день!

    1С:ERP Управление предприятием 2 (2.4.7.151)

    Делал сторно к документу Отчет комиссионера (агента) о продажах.

    Не делает движения по регистрам накопления, хотя они есть в списке Отбор по регистрам:

    1. Активы и пассивы (ПрочиеАктивыПассивы) — хотя данный регистр доступен для выбора при настройке состава регистров в документе Корректировка регистров

    2. Плановые оплаты клиентов (РасчетыСКлиентамиПланОплат) — не доступен для выбора в Корректировке регистров (видимо косяк типовой конфы)

    3. Расчеты с клиентами по срокам (РасчетыСКлиентамиПоСрокам) — не доступен для выбора в Корректировке регистров (видимо косяк типовой конфы)

    Дополнение к пунктам 2-3:

    зачем на вкладке Отбор по регистрам показываются даже те регистры, которые недоступны в настройке состава регистров в документе Корректировка регистров?

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

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

    Reply
  23. filterhouse

    (22) Добрый день.

    По дополнениям, я действительно не анализировал какие регистры можно корректировать с помощью документа корректировки, не было такой необходимости, возможно переделаю позже.

    По ошибке сейчас нет под рукой ERP и проверить не могу, как проверю, дополнительно напишу.

    Reply
  24. filterhouse

    (22) Проверил на типовой демке релиза 2.4.7.151, регистр Активы и пассивы корректно заполнился.

    Reply
  25. de-grishin

    (24) Извиняюсь, к обработке вопросов нет.

    Вопрос к ERP.

    Причина была в следующем.

    В ERP, по крайней мере в 2.4.7, есть баг: при первом проведении документа (после создания) не создаются записи в регистр Активы и пассивы (как минимум речь про ПТУ).

    Эти записи появляются только при втором проведении (в дальнейшем не исчезают).

    Вашей обработкой воспользовался после первого проведения документа.

    А затем видимо еще перепроводил документ.

    Соответственно получилось, что движения в Активы и пассивы документ создает, а в Корректировку они не попали.

    Спасибо за оперативную реакцию!

    Reply
  26. user880123

    А как решили вопрос со сторнированием регистра по клиентам по срокам?

    ведь без его корректировки — в ведомости по клиенту ничего не изменится.

    Reply
  27. filterhouse

    (26) Я уже года полтора с ERP не работал. Если не сложно опишите подробнее вопрос (а то я не понял что то), хотя бы какая база и какой документ, я посмотрю, и дам ответ.

    Reply
  28. user880123

    (27) раньше документы по расчетам с клиентами/поставщиками формировали регистры накопления «Расчеты с клиентами (поставщиками)» и «Расчеты с клиентами (поставщиками) по документам».

    Этот набор регистров остается, если расчеты ведутся офлайн.

    Мы же в новой базе включили расчеты онлайн.

    И теперь вместо регистра «Расчеты .. по документам» — появился регистр «Расчеты с клиентами (по срокам)».

    И если в регистр «расчеты … по документам» можно было сделать запись документом «корректировка регистров», то регистр по срокам — корректировкой не двигается.

    Reply
  29. user880123

    (27)

    1С:ERP Управление предприятием 2 (2.4.6.207)

    Документ например, Реализация товаров и услуг.

    Расчеты с КА — онлайн.

    Reply
  30. filterhouse

    (28) Постараюсь на недели посмотреть. Но думаю что этот регистр не является регистратором для корректировки, и обработка с этим ничего не сможет сделать. Тут видимо дорабатывать конфигурацию необходимо, что бы можно было сторнировать данный регистр.

    Reply
  31. filterhouse

    (28) Посмотрел регистр «Расчеты с клиентами (по срокам)» — регистратором для этого регистра установлен только документ «РегистраторРасчетов», поэтому когда обработка сторнирует документ к примеру Реализацию, она не трогает записи по этому регистру (запись сделал другой документ). Но и отсторнировать корректировкой документ «РегистраторРасчетов» не выйдет, т.к. корректировка не является регистратором.

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

    Reply
  32. user880123

    (31) спасибо!

    Reply

Leave a Comment

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