Замена КБК (КПС) во всех операциях по всем документам с фильтром по счету без перепроведения документов (актуально для материальных запасов) в конфигурации 1С: БГУ




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

30 Comments

  1. sam555m

    Для БГУ ред.2.0 подойдет?

    Reply
  2. sanyavv

    добавил обработку для бгу 2 (появится после модерации), пробовал только на демо — работает

    Reply
  3. sanyavv

    (1) sam555m, добавил обработку для бгу 2

    Reply
  4. ccserg

    Спасибо , пригодилась !

    Reply
  5. ccserg

    С датой окончания непонятка, можно бы её не задавать , тогда ругается , а еще формы выбора даты нет

    Reply
  6. sanyavv

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

    Reply
  7. ccserg

    (6)

    ну как бы , работа с датами , коряво как-то , просто некрасиво

    Reply
  8. Agema

    Дата нач. и кон. — это к КПС относится ? или к отбору документов за период?

    Вообще, отличная обработка.

    Можете добавить отбор по ИФО и КФО, т.к. КПС по ним могут отличатся, что чаще всего и встречается?

    Reply
  9. sanyavv

    даты относятся к выборке документов, отборы -согласен, подумаю, возможно, добавлю

    Reply
  10. Atol

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

    Reply
  11. sanyavv

    (11) Atol, можете уточнить корреспонденцию в этом документе? Если там есть счет 201.11, то замена реквизитов КПС произойдет во всем документе — это особенность обработки — в ней не контролируется какой именно реквизит связан с этим счетом — ее универсальность — поиск регистраторов по КПС и счету, замена в регистре бухгалтерии и обход по метаданным с целью поиска и замены реквизитов с типом КПС. Для замены КПС в документах определенного вида в определенных реквизитах воспользуйтесь обработкой «Поиск и замена значений» или «Групповой обработкой документов и справочников». В Вашем случае нет проблем с изменением сумм при препроведении документов — можете поменять реквизиты и перепровести документы.

    Reply
  12. Atol

    (12) В том то и дело, что нужно заменить без перепроведения, т.к. включили субконто код цели, забивать все коды пока нет времени в базе ведется несколько десятков учреждений. Нужно заменить для распечатки ЖО №2 КПС по 201.11 счету на КИФ (используется только с этим счетом), соответственно, все кор. счета в проводке не должны затрагиваться.

    Reply
  13. sanyavv

    (13) Atol, хорошо, постараюсь Вам помочь в ближайшее время (на выходных постараюсь доработать)

    Reply
  14. Atol

    (14) Спасибо!

    Reply
  15. Atol

    (15) Atol, (14) я так понимаю, не получается мне помочь?

    Reply
  16. sanyavv

    (16) Atol, все сделаю, подождите еще немного — не переделал еще

    Reply
  17. Agema

    Здравствуйте. Не получается доработать?

    А есть ли подобная для БГУ 2.0 ?

    Reply
  18. sanyavv

    ЗаменаКБКДвижения_БГУ2 в этой же теме для бгу 2.

    не дорабатывал — времени нет

    Reply
  19. Agema

    (19)Спасибо! Действительно, а слона то …

    Reply
  20. disha

    Не отрабатывает все документы. «Внутреннее перемещение материалов», «Покупка материалов».

    Reply
  21. sanyavv

    (21)

    уточните ситуацию — бгу 1.0 или 2.0, также учтите, что замена производится в реквизитах документа и операции в с типом КБК

    Reply
  22. disha

    Прошу прощения, не внимательно проверил. Все отлично меняет без перепроведения.

    Reply
  23. katenok86

    Здравствуйте. Уточните, а в БГУ 2.0 при обработке движений ручная корректировка проводок устанавливается?

    Reply
  24. Agema

    (24)

    при обработке движений ручная корректировка проводок устанавливается?

    устанавливается или обрабатывается? что Вам точно необходимо?

    Reply
  25. katenok86

    (25) Установка признака ручная корректировка на обработанных документах

    Reply
  26. Agema

    (26) нет не устанавливается и для чего так надо?

    Reply
  27. Dim4ik

    Есть возможность добавить в обработки Учреждение? Иначе, если в базе ведется несколько учреждений, меняет КБК по счету всех учреждений.

    Reply
  28. Надежда_

    а можно мне за отдельную плату выслать?

    Reply
  29. sanyavv

    (29) можно,напишите мне на sanya-v@mail.ru

    Reply
  30. avm_trinity

    ДД. интересует обработка. цена вопроса?

    Reply

Leave a Comment

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