Реализация подбора на основе управляемых форм 1С 8.2




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

13 Comments

  1. Ish_2

    По-моему , отличный «первый блин» !

    Reply
  2. alexk-is

    (0) Программный код в публикации можно раскрасить получше

    Reply
  3. detec

    Неплохо. А если усложнить задачу?

    Допустим, я хочу вводить кол-во продаваемого товара прямо в форме подбора, да так чтобы при окончании ввода проверялось, есть ли данное кол-во на остатке не в форме, а на складе (в конторе несколько менеджеров независимо выбивают документы для разных клиентов)?

    А ещё хорошо бы показать цены согласно договора клиента, а не просто ТЗ с количеством.

    В реальной задаче у нас по окончании ввода товар резервировался на складе, шла запись в регистр накопления. Тоже, правда, выскакивает назойливое окошко про ввод количества.

    Автор возьмётся за разработку такой (хотя бы примерно такой) демобазы?

    Боюсь, что в управляемом приложении интенсивная работа нескольких операторов возможна лишь в пределах локальной сети ((

    Reply
  4. User67

    (2) Спасибо, постараюсь учесть.

    Reply
  5. User67

    (3) Все реально, цены подцепляются запросом. Причем можно сделать так, чтобы при выборе менеджером какого то товара, он сразу бы резервировался (не в момент проведения документа) и только после этого добавлялся в выбранное. На счет разработки — почему бы нет. Укажите как лучше организовать взаимодействие и может поможем друг другу.

    Reply
  6. detec

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

    Наиболее сложный момент, по-нормальному не поддерживаемый платформой — это ввод значений в списке. Работал я как пользователь на дельфийном клиенте, с каким-то компонентом. Там поиск и фильтрация осуществлялись не только по строковому представлению поля, но и по числовым выражениям для полей соответствующего типа. Плюс ввод в определённых ячейках делал апдейты по базе. Мне это очень запомнилось, и я таки реализовал подобное в динамически заполняемом колонками табличном поле. Интересно было бы посмотреть, сможет ли кто-то сделать красивое решение на управляемых формах, чтобы с этим можно было бы работать нормально по wi-fi, для начала.

    Reply
  7. User67

    (6) Если не сложно более подробно распишите требуемый функционал (мини ТЗ 🙂 ). Можно на почту User67 dog myrambler.ru. Попробую реализовать

    Reply
  8. seermak

    вот как у меня организовано рабочее место продавца — 1 форму подбора удобнее организовать в справочнике Товаров а не в документе. 2 При перемещении товара в таблицу отбора — проверяется на остаток товара — более не внесешь.3 Возможность подбора товара по штрихкоду или по полнотекстовому поиску 4.Переносить в таблицу отбора можно и перетаскиванием товара и щелчком мыши.

    Reply
  9. PavelGP

    Для seermak! Очень интересный подход к подбору, подобное хочу организовать у себя может поделитесь наработкой.

    Reply
  10. alex_4x

    Seermak — Здоровский интерфейс. Очень удобно я думаю.

    Reply
  11. D

    Огромное спасибо. Очень помогло, бился 5-ть часов с этим подбором. А тут все как на ладони.

    Reply
  12. 404vrn

    Было бы неплохо, если бы еще и характеристики товара с остатками по складам показывались из подбора. А так все норм работает, спасибо за пример!

    Reply
  13. TrueGadich

    Присоединяюсь к 404vrn с отображением остатков по складам.

    Reply

Leave a Comment

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