Вертикальное меню




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

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

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

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

28 Comments

  1. support

    Красиво!

    Reply ↓
  2. Yasen

    Да, дизайнер хороший у вас)

    Reply ↓
  3. barsuk

    Че-то подглючивает меню при отображении:(

    Reply ↓
  4. 33lab

    (1) Спасибо.

    (2) Это не дизайн это стиль 😉 а вот дизайнера к сожалению нету 🙁

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

    Reply ↓
  5. barsuk

    (4) а где можно взять вашу аську?)

    Reply ↓
  6. 33lab

    (5) в профайле все есть (1.6.5.7.6.8.9.3.8)

    Reply ↓
  7. Ish_2

    Для 8.2 , я так понимаю, предложенная обработка не нужна ?

    Reply ↓
  8. Красавчики! Сбылась мечта идиота! )))

    Reply ↓
  9. warrior1985

    Прикольно. +

    Reply ↓
  10. 33lab

    (7) Если 8.2 используется исключительно как «толстый клиент» то думаю обработка не помешает.

    (8) 😉

    (9) Получил первое сообщение (на почту), хоть сам и не люблю рекламу, но без нее никуда да и закоментарить ее всегда можно.

    Reply ↓
  11. luns

    альтернативная разработка: http://infostart.ru/public/21387/

    Reply ↓
  12. BRT

    Пожелание.

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

    Думаю если эт оОбработка или отчет то тоже возможно

    Reply ↓
  13. 33lab

    (12) Доработал автоматическое заполнение представления по метаданным.

    Обновил разработку.

    Reply ↓
  14. А вот еще пожелания:

    1. в дополнение к (12), что если и в иконку будет добавляться типовая картинка документа, отчета или обработки в соответствии с метаданными.

    2. но гораздо важнее подцепить сюда еще и возможность подключения внешних отчетов и обработок. вот это было бы просто экстаз! ))

    Reply ↓
  15. 33lab

    (14) Реализовал пожелания. Обновил разработку.

    P.S. Скриншоты поменяю позднее (в «Общей настройке» добавился каталог файлов, по аналогии с каталогом картинок)

    Reply ↓
  16. Batchir

    Ещё пожелания:

    Реализовать возможность пользователю самому настраивать меню.

    Список доступных метаданных в этом случае фильтаровать по праву доступности

    Reply ↓
  17. rasswet

    картинки не видны:(

    Reply ↓
  18. 33lab

    (17) Проблема была в нашем местном провайдере, который предоставляет услуги хостинга (картинки грузятся по ссылке с нашего сайта)

    Reply ↓
  19. 33lab

    (16) Добавил функцию «ЕстьПравоДоступа», можете корректировать ее по своему усмотрению (по умолчанию проверяется право доступа на просмотр). Обновил разработку.

    Reply ↓
  20. bearcat

    да, это не для пользователей

    скачала, вертикальное меню не получилось, зато теперь радостно появилась вертикальная реклама 33lab.ru, которую убрать не удается

    Reply ↓
  21. 33lab

    (20) Это рекламный вирус 🙂

    Ну а если серьезно, закрыть рекламу можно просто нажав на крестик (в правом вернем углу формы). Для настройки меню необходимо нажать на форме правой кнопкой мышки, появится меню выбора из 2 пунктов (настройка и закрыть), нажимаем «настройка» и далее по интуиции.

    Reply ↓
  22. bearcat

    (21) закрыла программу, снова открыла уже не было боковой панельки 😀

    ВОПРОС

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

    например , я перенесла в извбранное и строки выстроились так:

    Авансовые отчты

    акт сверки

    возврат товаров от покупателя

    корректировка долга

    поступление товаров и услуг

    внешние обработки

    вычеты по НДФЛ

    доходы буд периодов

    но!!!

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

    расчеты по страховым взносам

    кассовые документы

    складские документы

    документы учета кадров

    они были в «избранном» считанные минуты и исчезли

    как нужно закреплять в «избранном» выбранные строки?

    и как удалить из избранного , что решила удалить?

    и как поменять их местами?

    пока что не нашла ответов на вопросы, экспериментирую

    2. можно сделать две, три, четыре папки ИЗБРАННОЕ?

    3. стала «набирать» в папку «избранное» и увидела, что строки , которые я переношу в папку избранное странным образом исчезают.

    Reply ↓
  23. bearcat

    я смотрю, что ваши скриншоты совсем не такие, как тот вид , что у меня в 1С

    у меня итнтерфейсная панель,

    это, видать, не ваша обработка, сорри

    Reply ↓
  24. 33lab

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

    Ответы:

    1.Менять местами можно все что угодно, смотрим на рисунок «Настройка», удаление,добавление,редактирование — смотрим все тот же рисунок .

    2.Можно

    3.Само собой ничего исчезнуть не может

    P.S. Обработка достаточно подробна описана, как можно в ней не разобраться даже не представляю.

    Reply ↓
  25. psamt1k

    Адназначна +!

    Реализовал то, о чем я мечтал и помаленьку воплощал в действительность. Но по сравнению с этой обработкой — я просто неуч =)

    Reply ↓
  26. AlexeyMAGician

    Косяк: при редактировании пункта мею, в представлении всегда выставляется первое из метаданных.

    Процедура АтрибутФормы_ПриИзменении(Элемент)
    //… мыши погрызли…
    Если ПустаяСтрока(Вид) Тогда //*** Добавить
    Вид=?(Метаданные[Тип].Количество()=0, «», Метаданные[Тип][0].Имя);
    АтрибутФормы_ПриИзменении(«Вид»);
    КонецЕсли; //*** Добавить
    //… мыши погрызли…
    
    

    Показать

    Reply ↓
  27. 33lab

    (26) Спасибо за выявленную ошибку. Лучше исправить ее следующим кодом:

    Если ПустаяСтрока(Вид) Или НЕ ТипЗнч(Элемент)=Тип(«Строка») Тогда //Вызов в «ПриОткрытии»
    Вид=?(Метаданные[Тип].Количество()=0, «», Метаданные[Тип][0].Имя);
    АтрибутФормы_ПриИзменении(«Вид»);
    КонецЕсли;
    
    

    В вашем примере при смене «ТипаОбъекта» — «ВидОбъекта» меняться не будет (если представление было заполнено).

    Обработку обновил.

    Reply ↓
  28. GERDUSKA

    Спасибо! Очень пригодилось!

    Reply ↓

Leave a Comment

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