Динамика изменения цен номенклатуры




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

21 Comments

  1. Horandy

    Как внешний отчет его использовать нельзя. Это ограничение использования управляемых форм в конфигурациях, работающих в режиме «Обычное приложение», к которым относится УТ 10.3.

    Reply
  2. MrFlanker

    Скачал для конфигурации УТ 10.3

    Мне отчет не понравился:

    — работает только в режиме тонкого клиента (УФ)

    — немного глючный тормозной, даты только из фиксированных периодов

    Но несправедливо будет не сказать:

    Отчет позволил получить нужные/компромиссные данные, таваровед доволен (без напильника в виде Excel не обошлось,… но это в принципе дела пары минут)

    Резюме: спасибо автору.

    Reply
  3. Horandy

    Не за что.

    Управление торговлей 10.3:

    Требует вставки в конфигурацию. Это ограничение использования управляемых форм в режиме обычного приложения, в котором работает конфигурация Управление торговлей 10.3.

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

    Если не затруднит, хотелось бы узнать про глюки, надо поправить.

    Reply
  4. MrFlanker

    1) можно не использовать управляемые формы 🙂

    2) глюк один я заметил, если период не выбрать… ошибочка вылазит

    3) Группировка по характеристикам должна быть опцией…. (многим она не нужна… а строк много выводится пустых)

    Ну обычно требуется сравнить цены на две точные даты (что же мне ставить период 1 день) и получать жуткие тормоза и 100500 колонок.

    По идее сделать можно чтоб быстро работало на заданные даты… но согласен что сложнее, нужно голову поломать.

    Reply
  5. Horandy

    Ну значит глюков нет)

    1. На вкус и цвет все фломастеры разные.

    2. Без периодичности отчет теряет смысл, можно в принципе ругнуться, но 1С и сама неплохо ругается.

    3. Это же СКД. Меняйте группировки как Вам нравится, создавайте сколько нужно вариантов отчета.

    4. А кто мешает выбрать произвольный интервал, от Даты1 до Даты2. Даже если выбрать интервал — «День», отчет покажет только те дни, когда изменялись цены. Т.о. Вы получаете поденную динамику между двумя нужными Вам датами. Если нужно процентное соотношение между конкретными датами, можно взять период побольше.

    Reply
  6. Horandy

    Хотя с периодами Вы правы, сделаю, чтобы, если не задан период, бралась начальная и конечная дата.

    Reply
  7. Dialservis

    Добрый день. Не получается подключить обработку. Метод объекта не обнаружен (Сведения ОВнешнейОбработке) Версия УТ 11.1.9.70. Подключаю через Администрирование/Дополнительные отчеты и обработки

    Reply
  8. Dracarys

    Добрый день. Ошибка загрузки документа.

    по причине:

    Ошибка преобразования данных XDTO:

    НачалоСвойства: {http://v8.1c.ru/8.1/data-composition-system/settings}useInGroup Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType

    1С:Предприятие 8.2 (8.2.19.83)

    «Управление торговлей», редакция 10.3 (10.3.8.9)

    Reply
  9. Horandy

    (8) gkstrade, Здравствуйте.

    Ваша конфигурация переписана. К сожалению, не могу Вам ничего посоветовать, так как не вижу, с чем имею дело, но номер конфигурации (6-летней давности), подсказывает мне, что она переписана вхлам.

    Reply
  10. Horandy

    (7) Dialservis, Здравствуйте.

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

    Reply
  11. Horandy

    (7) Dialservis, Выложил версию с Информацией для использования во внешних отчетах.

    Reply
  12. Dialservis

    (11) Horandy, спасибо. Все работает.Мне очень пригодится.

    Reply
  13. empafe

    (9) Horandy, Управление торговлей», редакция 10.3 (10.3.21.1)

    Ошибка загрузки документа.

    по причине:

    Ошибка преобразования данных XDTO:

    НачалоСвойства: {http://v8.1c.ru/8.1/data-composition-system/settings}useInGroup Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType

    Reply
  14. Поручик

    (1) Две формы в одном отчете (основная и дополнительная) позволяют использовать оба варианта при одной схеме СКД. При открытии платформа сама выберет нужную форму.

    Reply
  15. Horandy

    (14) Поручик, согласен.

    Лениво было форму рисовать. Надо, чтобы красиво было, отборы, порядок в разворачиваемую панель вывести.

    Я вообще сейчас по-максимуму отказываюсь от обычных форм. Жаль времени на интерфейс.

    Reply
  16. Horandy

    (13) empafe, Это не значит, что конфигурация типовая. Сравните регистры цен номенклатуры с конфигурацией поставщика.

    Reply
  17. Niberu

    Управление торговлей, редакция 11.1 (11.1.10.145)

    Ошибка создания набора данных «НаборДанных1»

    по причине:

    Ошибка при исполнении запроса набора данных

    по причине:

    {(19, 3)}: Ошибка обработки представления «РегистрСведений.ЦеныНоменклатуры.СрезПоследних:Несоответствие типов (Параметр номер «»1″»)»

    <<?>>РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&П, ) КАК ЦеныНоменклатурыСрезПоследних

    Reply
  18. Kontakt

    Ошибка!

    Ошибка загрузки документа.

    по причине:

    Ошибка преобразования данных XDTO:

    НачалоСвойства: {http://v8.1c.ru/8.1/data-composition-system/settings}useInGroup Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType

    «Управление торговлей», редакция 10.3 (10.3.34.2)

    Reply
  19. BurSer

    Очень полезный отчёт. Но в таком виде не удобно пользоваться : 1. Надо добавить отбор по итогу (т.е. показывать только те позиции у которых изменение цены более заданного). 2. У одного товара приход раз в год, другой приходит каждый день. Не удобно в одном отчёте смотреть все. Сделайте расшифровку по периодам.

    3. Внести ресурсы : максимальное отклонение от среднего и среднее значение за весь период.

    Reply
  20. i.smirnova@aie

    Подскажите, с УТ 11.4 можно использовать?

    Reply
  21. 12345mm

    Доброго дня! Подскажите будет ли работать модуль на версии для Беларуси

    http://prntscr.com/od2nk9 это аналогичная версия УТ 11.4 как для России как я понимаю

    Reply

Leave a Comment

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