Закупочная, розничная цена, остаток, поставщик и дата последнего поступления в списке номенклатуры




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

19 Comments

  1. user710787_natmankina

    Доброго времени суток! У нас Розница, редакция 2.2 (2.2.7.40). Подскажите, пжлста, как подключить ваше расширение?

    Reply
  2. programer1c

    (4) Администрирование -> Печатные формы отчеты и обработки -> Расширения -> Добавить.

    Добавляете расширение и перезагружаете 1с. (Нужно указать путь к нему)

    Reply
  3. user710787_natmankina

    спасибо, все получилось!

    Reply
  4. Ermen

    Здравствуйте, на Рознице 2.2.6.33 будет работать? Очень нужна обработка.

    Reply
  5. programer1c

    (7) Не проверял. Возможно не будет.

    Reply
  6. izografika

    Добрый день, Приобрел расширение. Подключил по инструкции к ответу для Натальи Манькиной. Перезапустил 1С. При попытке открыть Номенклатуру выскакивает окошко с ошибкой: Поле объекта не обнаружено (ор_ТорговаяМарка). Подскажите как решить проблему. Конфигурация: Розница 2.2.8.29, платформа 8.3.12.1469. Заранее спасибо за ответ.

    Reply
  7. programer1c

    (9) Я проверю расширение на 8.3.12 и вашей версии розницы, ответ отошлю в личные сообщения

    Reply
  8. izografika

    Спасибо за реакцию. Надеюсь решение проблемы найдется. Заранее спасибо за ответ.

    (10)

    Reply
  9. glazn

    Добрый день, выскакивает такая ошибка

    Reply
  10. user1057691

    На версии 2.2.9.20 все работало, после обновления до версии 2.2.10.19 , выдает ошибку см.ниже и приложение..

    СписокНоменклатуры (1.0): Критичная: Значение контролируемого свойства Тип у объекта Справочник.Номенклатура.Реквизит.КоличествоПериодовДействия не совпадает со значением в расширяемой конфигурации

    Как исправить?

    Reply
  11. user1057691

    (13)Исправил сам ошибку. В конфигураторе в Значение контролируемого свойства Тип у объекта Справочник.Номенклатура.Реквизит.КоличествоПериодовДействия, в поле «число» нужно поставить галочку «неотрицательное» и сохранить в конфигурации. Все заработало…

    Reply
  12. programer1c

    (14)Возьму на заметку. Спасибо

    Reply
  13. programer1c

    Для получения обновления пишите в личку.

    Reply
  14. user1153010

    Добрый день! Подскажите пожалуйста как я поняла Ваша обработка добавляет остатки и цены в список номенклатуры, возможно у Вас имеется доработки с тем же функционалом только для формы выбора номенклатуры? Спасибо.

    Reply
  15. kazzuss

    Версия 2.2.11.24. Работает только с включенной ролью Администрирование. Иначе:

    {СписокНоменклатуры Справочник.Номенклатура.Форма.ФормаСписка.Форма(223)}: Ошибка при вызове метода контекста (Загрузить)

    ЗначениеНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек, ОписаниеНастроек, ИмяПользователя);

    по причине:

    Нарушение прав доступа!

    Reply
  16. programer1c

    (17) «Формы выбора» откуда? Из какой формы осуществляется подбор (выбор)?

    Reply
  17. programer1c

    (18) Понял.

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

    Reply
  18. kazzuss

    (20) В правах пользователя пробовал включать все пункты, кроме администрирование — не помогло.

    Буду признателен, если сделаете доработку.

    Reply
  19. makcbol1

    такая ошибка

    {СписокНоменклатуры Справочник.Номенклатура.Форма.ФормаСписка.Форма(236)}: Ошибка при вызове метода контекста (УстановитьЗначениеПараметра)

    Список.Параметры.УстановитьЗначениеПараметра(«ВидЦеныЗакуп», ВидЦеныЗакуп);

    по причине:

    Параметр с указанным именем не найден

    Reply

Leave a Comment

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