Допиливаем форму выбора серий номенклатуры для отображения остатков




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

18 Comments

  1. mtv:)

    Статья, безусловно, полезная.

    Но очень неудобно то, что код вставлен картинками, а не текстом. Невозможно перенести код простым копированием. Приходится набивать вручную… 🙁 . Это портит общее впечатление от публикации.

    Хотя все равно плюс.

    Reply
  2. practik1c

    Собственно сделал картинками потому что форматирование кода жутко неудобное да и раскраска не та 🙂

    Но плюсы тоже есть, когда не копипастишь, а набираешь сам — усваяемость сильно лучше! 😉

    Reply
  3. starkv

    Может я что-то и не то сделал, но кажется есть ошибочка, не происходит выбор серии

    из-за (Стандартная обработка = ложь)

    Я сделал так:

    ВыбраннаяСерия = ОткрытьФормуМодально(«Справочник.СерииНоменклатуры.ФормаВыбора»,СтруктураПараметров);

    Если ТипЗнч(ВыбраннаяСерия) = Тип(«СправочникСсылка.Серииноменклатуры»)Тогда

    ТекущиеДанные.СерияНоменклатуры = ВыбраннаяСерия;

    КонецЕсли;

    Reply
  4. Sintson

    мАлАдец, тильки как с извечным вопросом обновления совладать, но это, как говориться ничего личного, больше к 1С вопрос, а так, тема здравая, я так же делал.

    Reply
  5. Dwiss

    Помоему здесь ошибочка

    ДатаОстатков = <<?>>мТекущяДата(); (Проверка: Толстый клиент (обычное приложение))

    ТекущаяДата() работать не будет нужно использовать

    ТекущаяУниверсальнаяДата()

    Синтаксических ошибок не обнаружено!

    Reply
  6. Hans

    Желательно бы то же самое только для табличной части документа под управляемые формы.

    Reply
  7. nav1971

    а куда делась статья? виднго только описание!

    Reply
  8. smilejka

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

    Статья интересная +

    Reply
  9. babylon_5

    (7) Открой не в IE, а в другом браузере.

    Reply
  10. Sergeant82

    Огромное спасибо за публикацию! Очень выручила. Но у меня была не ТЧ, а просто Поле выбора на форме, и заработало только после добавления «, Элемент» в строке:

    ОткрытьФормуМодально(«Справочник.СерииНоменклатуры.ФормаВыбора»,СтруктураПараметров, Элемент)

    Reply
  11. roma03v1

    Спасибо большое очень помогло, так как пока плохо программирую, очень сильно сэкономил мне время.

    Reply
  12. Astrakhan_man

    Можно вопрос, как Вы передаете дополнительные параметры (склад) в форму выбора? но я на обычных формах.

    Reply
  13. Astrakhan_man

    я создаю реквизит формы «СтруктураПараметров» с типов Произвольный (не понял как создать с типом структура), передаю в него данные

    (ВыбраннаяСерия = ОткрытьФормуМодально(«Справочник.СерииНоменклатуры.ФормаВыбора»,СтруктураПараметров);)

    , но в процедуре в «СправочникСписокПриПолученииДанных» пишет «Поле объекта не обнаружено (Склад)» где у меня ошибка.

    Reply
  14. Astrakhan_man

    переделал на управляемые формы, и при открытие пишет такую ошибку «по причине:

    Ошибка получения данных

    по причине:

    Ошибка создания набора данных «НаборДанныхДинамическогоСписка»

    по причине:

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

    по причине:

    {(16, 5)}: Не задано значение параметра «Дата»

    <<?>>&Дата,

    »

    в параметрах формы(у списка) я её задал. из формы передаю.

    Reply
  15. katavyjob

    Жаль нет итоговых картинок работы данного механизма в самой программе((

    Reply
  16. lambert@inbox.ru

    Спасибо за статью!

    Reply
  17. user973244

    Да очень огромное спасибо, немного здвинула меня с места ваше решение

    Reply
  18. maxf

    Понаделав кучу всякой ерунды полезных вещей, разработчики так и не удосужились сделать так, чтобы можно было понять в подчиненной форме, откуда она открыта без влезания в форму-владелец. В данном случае форма выбора серий открывается из нескольких десятков видов документов и влезать в каждый из них — это очень плохое решение, когда база еще худо-бедно на поддержке.

    Reply

Leave a Comment

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