Создание прихода на отрицательные остатки по товарам для Бухгалтерии 3.0




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

11 Comments

  1. megaalex

    Спасибо! Отлично! Еще бы добавить возможность установить галку «обрабатывать» на все 1 500 позиций в один клик, было бы еще лучше 🙂

    Reply
  2. megaalex

    а еще бы здорово иметь возможность отключить контроль по ГТД

    Reply
  3. olech-ka

    не формирует отрицательные остатки, т.е. нажимаю прочитать, а таблица остается пустой, хотя минусы есть

    Reply
  4. vilaud

    Спасибо, все работает!

    Reply
  5. vilaud

    Добрый день, сделайте, пожалуйста, в табличной части в колонке «обрабатывать» функцию «выделить все позиции».

    Reply
  6. klaus38

    Отличный инструмент. Работает стабильно. Весьма странно, что автор поленился прикрутить флажки выделения. Кому надо сделайте следующее:

    &НаКлиенте
    Процедура КомандаУстановитьФлажки(Команда)
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    СтрокаТЧ.Обрабатывать = Истина;
    КонецЦикла;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура КомандаСнятьФлажки(Команда)
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    СтрокаТЧ.Обрабатывать = Ложь;
    КонецЦикла;
    КонецПроцедуры
    

    Показать

    Reply
  7. user598211_romavtule

    Что делать, если купил обработку и через месяц обработка не функционирует по любой причине? Например,

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

    Reply
  8. klaus38

    (7)Так на ресурсе и устроено. техподдержка доступна только для коммерческих публикаций. А здесь возможно автор просто выложил идею, а дальше ему некогда, и это нормально.У меня свежий релиз БП как файловый так и серверный вариант базы. Все работает.

    Reply
  9. user598211_romavtule

    (8) Алексей, спасибо за реакцию. Звучит неплохо. Как техподдержка инфостарта будет поправлять ту или иную обработку, если автор этой обработки молчит?

    Reply
  10. klaus38

    (9)Инфостарт сам поправлять не станет. Инфостарт своего рода агрегатор 1с — ников. Код в обработке открыт. Доработать может любой программист. Или вы можете посмотреть коммерческие разработки с платной поддержкой. Тут есть подобные. А что у вас за ошибка? В чем проблема? Может я уже сталкивался и смогу помочь?

    Reply
  11. user598211_romavtule

    Я-продавец. У меня есть заявки. Программист, с которым я работаю в тандеме, не всегда может выполнить задачу. Не знаю почему, наверное потому что обработка-обработке рознь. Грубо говоря, заявки есть-исполнителя нет. На мой вопрос «Я куплю обработку на инфостарте, а ты сможешь её дорабатывать по необходимости?», программист отвечает «Надо сначала посмотреть». Я его понимаю и всё такое, но заявка-то сама себя не сделает. В итоге 1) я покупаю обработку за свои деньги, например за 3000р 2) плачу свои деньги за потраченное время программиста на анализ этой обработки, 2000р 3) получаю от программиста отрицательный ответ. Ну или положительный, как повезёт. Вот я и решил, а почему бы напрямую не платить автору обработки и за саму обработку, и за её дальнейшее ежемесячное обслуживание. Зачем изобретать колесо так сказать, если вот он автор с колесом в руках. На данную обработку у меня есть заявка, только не для бух 3.0, а для БСО. И чёрт его знает, брать заявку или нет.

    Reply

Leave a Comment

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