Интерфейсная панель




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

87 Comments

  1. tormozit

    Отличная работа!

    Reply
  2. Yasen

    Спасибо.

    Думаю еще прилепить поиск среди наименований настроек универсальных отчетов.

    Стоит, как думаешь?

    Reply
  3. tormozit

    Советую завести номер версии, если планируется развитие.

    Reply
  4. tormozit

    И конечно же нужно добавить иллюстраниций.

    Reply
  5. coder1cv8

    +1 Отлично.

    Reply
  6. whoscare

    Очень полезная штучка. +1

    Reply
  7. German

    Да так ничего приятненько… но нужно конечно развитие

    Реквизиты и поиск ссылок… и ТД

    по поиску задаю АК

    точ то выводит АКтОказанияУслуг верно

    а то что еще выводит контАКтнаяинформация- не очень ока мне была нужна ..

    может быть искпользовать регулярные выражения *АК*_?

    Reply
  8. German

    Еще можно список внешних обработок добавить .. как ссылку на файл так и существующие в «Дополнительные внешние обработки»

    Reply
  9. tormozit

    А где избранное? Что то не могу найти…

    Reply
  10. tormozit

    (7) Да, регулярные выражения будут очень полезны.

    Reply
  11. + 5 Абсолютный Зачёт

    Reply
  12. Yasen

    (3) Да

    (4) Добавил парочку

    (7), (10) регекспы — однозначно! Будут.

    (8) вариант. спасибо за совет. только как файл искать в нынешнем интерфейсе? добавить диалог выбора?

    (9) про избранное — неправильно выразился. Есть история часто используемых команд. А оно надо — «Избранное»?

    всем ометившимся — спасибо!

    Reply
  13. tormozit

    Еще нужна опция авторазворачивания дерева после фильтрации.

    Reply
  14. Yasen

    (13) Да

    Reply
  15. tormozit

    Также неплохо было бы сделать удаление строк последних и частых по нажатию DELETE

    Reply
  16. ChiSNik

    Очень неплохо +5

    Reply
  17. Yasen

    (9) — Избранное теперь есть

    (13) — есть

    (15) — есть. Backspace

    Reply
  18. tormozit

    В избранное нужно иметь возможность добавлять путем перетаскивания.

    Reply
  19. tormozit

    Добавление в избранное хорошо бы было доступно еще и из контекстного меню.

    Картинки у планов обмена не такие же как в конфигураторе. Возьми все таки из моей версии. Там все ровно =)

    Reply
  20. gavrant

    Толь, наконец я добрался до сюда.

    У меня два небольших предложения:

    — При закрытии/открытии обработки не сохранять и не восстанавливать развернутость ветвей дерева. В своей версии я сделал «Последние используемые» и «Часто используемые» всегда развернутыми при открытии («Избранного» у меня нет), а «Справочники», «Документы» и т.д. — всегда свернутыми. Мне просто надоело сворачивать все эти ветви, когда они уже не нужны.

    — Выложи версию и для 8.1, чтобы народ не мучился конвертировать.

    Reply
  21. tormozit

    (20) А вот и соавтор. Отличная работа.

    Еще пожелания.

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

    Reply
  22. tormozit

    Для ссылочных объектов, если у них имеется отдельная форма выбора, то в контекстном меню хотелось бы видеть 2 строки «Основная форма списка» и «Основная форма выбора», а по дабл клику как и раньше будет открываться основная форма списка. Такое поведение будет удобно для отладки форм выбора, чтобы не лазить в какую нибудь форму, где есть поле ввода с нужным типом.

    Reply
  23. tormozit

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

    Reply
  24. tormozit

    Картинки у планом обмена «левые» =) Когда же поправишь?

    Reply
  25. tormozit

    В контекстное меню для ссылочных объектов также можно добавить «Форма ввода нового», которая будет открывать форму элемента. Полезно также при отладке форм, да и обычным пользователям может быть полезно.

    Reply
  26. tormozit

    Ну и общие формы наверное все же стоит добавить, т.к. обработка ориентирована как я понимаю на разработчика(?)

    Reply
  27. Yasen

    (18) есть

    (19) добавление из контекстного меню есть

    (20) есть

    (21) порядок строк в избранном определяется количеством нажатий Ctrl-D 🙂 Добавил возможность сортировки по алфавиту. Установлена по умолчанию, настраивается просто

    (22) через контекстное меню теперь доступны все формы объекта

    (23) есть

    (25) работает через выбор формы элемента или формы документа

    (26) есть

    Reply
  28. tormozit

    (27) Отлично! Так держать.

    Reply
  29. tormozit

    версия 8.1

    1) Пиктограммы потеряли прозрачность

    2) Внешние обработки, общие формы, интерфейсы получили пиктограммы констант

    Reply
  30. tormozit

    По-моему было бы удобнее, если бы список доступных форм встраивался в контекстное меню при активации строки. Это ускорит доступ к формам. Сверху наверное лучше пусть идут статические пункты меню, а снизу через разделитель динамические.

    Reply
  31. Yasen

    (29) пиктограммы пофиксил (кроме прозрачности)))

    (30) снова переписал код обработки команд, теперь формы — в составе динамического контекстного меню

    Reply
  32. tormozit

    Прозрачность надо исправить! Она все портит =)

    Reply
  33. tormozit

    платформа 8.1.10.50 при открытии версии 1.6 обработки (последняя ссылка) получаю ошибку

    {Форма.Форма(1138)}: Ошибка при вызове метода контекста (ПодключитьОбработчикОжидания): Недопустимое значение параметра (параметр номер ‘3’) (Обработчик ожидания с нулевой задержкой может устанавливаться только для однократного выполнения)

    ПодключитьОбработчикОжидания(«СгенерироватьКомандыКонтекстногоМеню»,0.1);

    по причине:

    Недопустимое значение параметра (параметр номер ‘3’) (Обработчик ожидания с нулевой задержкой может устанавливаться только для однократного выполнения)

    Reply
  34. Yasen

    Выложена очередная версия 1.7 (см upd к описанию)

    (29) прозрачность была. Обнаружен баг платформы — прозрачность иконки не влияет на курсор табличного поля

    (33) да, оказывается поддерживать две платформы непросто ))). Пофиксено

    Reply
  35. tormozit

    Скоро пофиксишь баг с динамическим контекстным меню?

    Reply
  36. Yasen

    (35) Баг пофиксен давно (просто убрал генерацию через обработчик ожидания).

    Сегодня планирую дорихтовать выбор формы по умолчанию (по двойному щелчку) и выложу.

    Reply
  37. Yasen

    В свежей версии: поиск и открытие обработок по справочнику «ВнешниеОбработки».

    Для версии 8.1 — полнотекстовый поиск по данным ИБ.

    Reply
  38. Yasen

    Версия 2.0.1.

    Пофиксено:

    * макеты обработок были от версии 8.0

    * не работало перетаскивание в пустую папку Избранное

    * Иконки внешних обработок и полнотекстового поиска

    Добавлено: поиск в метаданных консолей подсистемы «Инструменты разработчика»

    * ирКонсольЗапросов

    * ирКонсольПостроителяОтчетов

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

    Reply
  39. Yasen

    2.0.2

    * Восстановлена обратная совместимость кода с платформой 8.0.

    * В избранное и историю теперь попадают не только объекты метаданных, а любые элементы (кроме результатов полнотекстового поиска)

    Reply
  40. kostas

    Версия 2.0.2 открытии Обработка.ирИнтерфейснаяПанель ошибка:

    [b]{Обработка.ирИнтерфейснаяПанель.Форма.Форма(762)}: Ошибка при вызове метода контекста (Выполнить): {(7, 2)}: Поле не найдено «ВидОбработки.Порядок»[b]

    См текст запроса

    Reply
  41. Yasen

    Версия 2.0.3

    (40) Баг(фича?) пофиксен. На самом деле, механизм внешних обработок изначально затачивался под типовые. Но если будут пожелания, добавлю возможность настройки этого механизма в пользовательском режиме, без залезания напильником в код.

    (41) Устранен баг, обнаруженный на типовой демо УПП: в сохраненных настройках была ссылка на несуществующий отчет, чего я от 1Сников никак не ожидал :-). Теперь работает.

    Reply
  42. ValeriVP

    Пожелание — Последние использованые сортировать по дате использования а не по алфавиту

    Reply
  43. Душелов

    А еще можно добавить настраиваемое меню (список метаданных) с собственным именем, ну и заполнение по интерфейсу 🙂

    Reply
  44. Yasen

    (42) ИМХО, такой случай — редкость, но пофиксил

    (43) сортировка настраивается очень просто. Сделал в коде пример, см. тело модуля формы

    (44) Настраиваемое меню сделал. Осталось за малым — заполнение по интерфейсу. Ждем, когда v8unpack вырастет. Ну или уж в 8.2 появится 🙂

    Reply
  45. Yasen

    Версия 2.1

    Автозапуск, настраиваемые меню

    Названия своих меню пишите одним словом, сейчас по ним идентифицируются строки настроек.

    Reply
  46. Yasen

    Версия 2.2

    Исправлены ошибки версии 2.1

    Оптимизирован код.

    Устранено ограничение версии 2.1 («Названия своих меню пишите одним словом, сейчас по ним идентифицируются строки настроек. «). У статического меню теперь есть как идентификатор, так и представление.

    Reply
  47. Душелов

    Открыл список документов (заказы к примеру).

    Перетащил в автозапуск.

    Открывается при запуске форма нового документа.

    При нажатии мышкой в автозапуске — открывается все ок — список документов.

    Reply
  48. Yasen

    (48) Спасибо, исправил

    Reply
  49. Yasen

    Версия 2.3

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

    + Объекты результатов полнотекстового поиска теперь обрабатываются статическими ветвями. То есть, можно добавить в Избранное (или а Автозапуск) определенный документ, элемент (группу) справочника, в общем, любой объект ссылочного типа.

    + Для объекта полнотекстового поиска доступно открытие любой формы, а не только формы по умолчанию

    Версия 2.2

    * Исправлены ошибки, найденные в версии 2.1

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

    Reply
  50. Yasen

    Добавил файл ирИнтерфейснаяПанель.epf (для тех, кто использует ее совместно с подсистемой «Инструменты разработчика» http://infostart.ru/profile/1184/projects/1274/)

    Reply
  51. MSensey

    Хорошая штукенция, уже использую

    Reply
  52. MSensey

    Предлагаю ветки «Избранное», «Автозапуск» вынести в отдельное дерево и добавить возможность скрывать/показывать

    Reply
  53. MSensey

    Еще предлагаю добавить кнопки для сворачивания/разворачивания дерева

    Reply
  54. Mitri4

    Класная весч!!! +++++

    Reply
  55. LavS

    Так держать… Больше версий хороших и разных:) Отличная обработка использую для ручного функционального тестирования конфигурации(создание и запись объектов, проведение документов и т.п.)

    Reply
  56. LavS

    Странно, но почему-то отбор по подсистемам работает только в файле Интерфейсная панель 8.1 (там, где версия 1.5), а в версиях 2.1 и 2.3 он не работает:( либо я ещё не разобрался как оно должно работать:) Но пока буду пользоваться версией 1.5 — она меня полностью устраивает:)

    Reply
  57. Lemoi

    Обработка понравилась. Спасибо!

    в версии 2.3:

    1) фильтр по подсистемам не работает

    2) для регистров накопления при открытии универсального отчета (не смотря на то, что он есть) открывается форма списка регистра

    3) в модуле формы в блоке «Copyright» в третьем абзаце повторение

    Reply
  58. Lemoi

    Былобы удобно если бы состояния (свернуто/развернуто) 4-х первых секций менялось только по желанию пользователя и сохранялось между сеансами.

    Reply
  59. 8c1.ru

    Отличная вещь!

    Хотел предложить вариант поиска по обработкам на диске, а оказывается оно уже есть!!! 😀

    Reply
  60. 8c1.ru

    При открытии или при вводе строки для поиска иногда вылезает ошибка:

    {Обработка.ирИнтерфейснаяПанель.Форма.Форма(717)}: Значение не является значением объектного типа (Имя)

    СтрокаОтчетаДляНастройки.Имя = ИмяОтчета;

    Reply
  61. Yasen

    (61) Эта ошибка вызвана изменением механизма хранения настроек. Появляется в случае нахождения сохраненных настроек отчетов в базе.

    Reply
  62. acsent

    Пожелание: сохранять настройки после ввода, а не при закрытии. Ибо при перезапуске 1С из конфигуратора настройки не сохраняются

    Reply
  63. acsent

    Когда будет под управляемые формы?

    Reply
  64. Rusmus

    накосячил: добавил в автозапуск обработки её саму =).

    Проблему, конечно, решил, временно отключив автозапуск в коде. Но есть пожелание, открывать обработку только один раз, а возможность открывать копии сделать в самой обработке.

    Reply
  65. Yasen

    (65) Учту.

    (64) Скажите, а кто на самом деле уже перешел в режим 8.2?

    Reply
  66. acsent

    (66) Мы например собираемся переходить. А так будет повод вплотную заняться изучением 8.2

    Не сейчас так чуть позжее пригодится

    Reply
  67. DonSerg

    Разместите пожалуста версию для 8.1, может старую даже

    Reply
  68. CaSH_2004

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

    Нажал кнопку «Проверить версию…», получил:

    {Форма.Форма.Форма(380)}: Ошибка при вызове метода контекста (ПодключитьОбработчикОжидания)

    ПодключитьОбработчикОжидания(«ПроверитьВерсию», 0.1, Истина);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’) (Процедура, указанная в качестве обработчика события, имеет неверное количество параметров)

    Это так и должно быть?

    Reply
  69. CaSH_2004

    АУ-У-У-У!!!! разработка закрыта?

    Reply
  70. Rustig

    нет перечислений…

    но я для себя их добавил…

    за обработку плюс. 🙂

    Reply
  71. Yasen

    (71) Rustig,

    Разработка ведется, обновления давно не выкладывал

    Пишите пожелания, учту

    Reply
  72. ivpctotru

    Отличная штука! Спасибо.

    Reply
  73. Yasen

    (74) ivpctotru,

    Пожалуйста!

    Reply
  74. BalVlad

    Отличная разработка! Спасибо и +

    Reply
  75. Yasen

    (76) BalVlad, пожалуйста )

    Если есть пожелания, пишите — вполне может и учту.

    Reply
  76. klel

    Внушительная штука впечатлений много создателю 5+ так держать =)

    Reply
  77. tormozit

    Описание умного поиска некорректное. Поэтому я только после анализа кода понял как работает.

    Правильное описание —

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

    Например: «Реал 1777», «Номенклатура Диван», «характ кожаный».

    Reply
  78. tormozit

    Фоновый поиск неразумно делать для метаданных. Он разумен для поисков с использованием запросов к серверу. Правда в метаданных есть тоже опциональные запросы к БД если умный поиск включен. Поэтому предлагаю при отключенном умном поиске использовать поиск по метаданным сразу.

    Reply
  79. tormozit

    В контекстном меню для ссылок БД редактор объекта БД рекомендую поставить на первое место, чтобы по умолчанию открывался он

    Reply
  80. tormozit

    Выпущена ИР 2.44 с новой версией интерфейсной панели с доработками.

    Reply
  81. servs

    При открытии пишет ошибки:

    {Форма.Форма(81,20)}: Переменная не определена (УправлениеПользователями)

    Объект.ДатаНач = <<?>>УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной(«глТекущийПользователь»), «ОсновнаяДатаНачалаОтчетов»);

    {Форма.Форма(90,7)}: Переменная не определена (УниверсальныеМеханизмы)

    Если <<?>>УниверсальныеМеханизмы.ПолучитьНастройку(СтруктураНастройки) Тогда

    {Форма.Форма(773,6)}: Переменная не определена (ОбщегоНазначения)

    <<?>>ОбщегоНазначения.Сообщение(ОписаниеОшибки(), Перечисления.ВидыСообщений.Ошибка);

    {Форма.Форма(829,5)}: Переменная не определена (ОбщегоНазначения)

    <<?>>ОбщегоНазначения.Сообщение(«Выбранный файл не является внешней обработкой.

    {Форма.Форма(79,25)}: Процедура или функция с указанным именем не определена (глЗначениеПеременной)

    Если ЗначениеЗаполнено(<<?>>глЗначениеПеременной(«глТекущийПользователь»)) И Не ЗначениеЗаполнено(Объект.ДатаНач) Тогда

    {Форма.Форма(81,73)}: Процедура или функция с указанным именем не определена (глЗначениеПеременной)

    Объект.ДатаНач = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(<<?>>глЗначениеПеременной(«глТекущийПользователь»), «ОсновнаяДатаНачалаОтчетов»);

    {Форма.Форма(86,46)}: Процедура или функция с указанным именем не определена (глЗначениеПеременной)

    СтруктураНастройки.Вставить(«Пользователь», <<?>>глЗначениеПеременной(«глТекущийПользователь»));

    Reply
  82. servs

    +84 версия 2.8 для 8.1

    Reply
  83. servs

    В версии 2.8 нет или не отображаются картинки в дереве, для 8.1.

    Reply
  84. CaSH_2004

    Хорошая штука, жаль фильтр по подсистемам не доведен до ума

    Reply
  85. Yasen

    (87) CaSH_2004, есть работающее обновление. Актуальная версия ИП — 3.1, если пользуетесь — я обновлю публикацию на инфостарте

    Reply
  86. CaSH_2004

    (88)Конечно выкладывайте, я то себе доработал, но может у вас что-то получше, да и люди пусть пользуются

    Reply
  87. mkyv405
    (87) CaSH_2004, есть работающее обновление. Актуальная версия ИП — 3.1, если пользуетесь — я обновлю публикацию на инфостарте

    Добрый день, так и не обновили 🙁

    Reply

Leave a Comment

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