Конструктор выражений для СКД 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='\

42 Comments

  1. Damian

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

    Reply
  2. boln

    (1) Damian, согласен, надо скринов подбросить.

    Reply
  3. Поручик

    Очень интересно, пока не юзал, но одобряю

    Reply
  4. Boroda

    Да, собственно, скрины особо и не нужны — деморолик-то есть. Если только в качестве его альтернативы (чтобы очки не сдирались за скачку файла). А для привлечения клиентуры… кому понятно и нужно, тот и так заценит и возьмёт, думаю.

    Reply
  5. boln

    (4) Boroda, да, давненько, выходит, я здесь не бывал.

    «Очки» какие-то появились и премодерация. Какая жизнь, оказывается, интересная вокруг 🙂

    Reply
  6. alexk-is

    Почему конструкции не раскрашенные? Конструктор ведь.

    Раскрашенные гораздо нагляднее выглядят.

    Может быть это поможет http://infostart.ru/public/19856/

    Reply
  7. boln

    Во чего еще придумал — надо прикрутить Конструктор форматной строки. На неделе сделаю.

    Reply
  8. boln

    (6) alexk-is, согласен, но с html или форматированным документом связываться неохота. К тому же, в СКД ведь все по-любому нераскрашенное.

    Reply
  9. alexk-is

    (8) ПолеТекстовогоДокумента — Свойства — Характеристики — Расширение — Язык запросов

    и ни каких html или форматированных документов

    Reply
  10. Поручик

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

    Reply
  11. alexk-is

    (10) Вот засада. Не обратил внимания, что это управляемые формы.

    Reply
  12. Поручик

    (11) Вот, изучай.

    Редактор кода 1с для тонкого клиента, управляемые формы http://infostart.ru/public/78340/

    Reply
  13. orsprog

    Однозначно, плюс, но… скринов бы побольше…Раскрашенные конструкции гораздо нагляднее выглядят…можно и раскрасить…

    Reply
  14. _also

    Хотя бы загрузку схемы их xml можно было в предприятии сделать. А то каждый раз менять в конфигураторе…

    Reply
  15. boln
    _also пишет:

    Хотя бы загрузку схемы их xml можно было в предприятии сделать. А то каждый раз менять в конфигураторе…

    Пробовал. В этом случае гриды доступных полей не полнофункциональны.

    Reply
  16. sergnik

    посмотрим, давно хотел изучить эту тему, никак руки не доходили

    Reply
  17. WiseSnake

    (0)

    К сожалению, в Редакторе СКД средства конструирования подобных сложных выражений на сегодняшний день отсутствуют, и их приходится полностью выписывать вручную.

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

    P.S. Обработку посмотрю на досуге. Может правда удобнее будет.

    Reply
  18. boln
    WiseSnake пишет:

    А выписывать вручную ничего не надо. Можно конструкции мышкой перетаскивать, остальное копипастить(если это выражение из дерева таблиц то двойным кликом).

    Не догнал. Вот, пишем выражение для вычисляемого поля. Откуда конструкции мышкой перетаскивать? И где здесь дерево таблиц?

    Reply
  19. che666

    автору + за необходимый инструментарий

    Reply
  20. MoneG2

    Полезно уже от того, что не надо справку листать и копипастить.

    Может, еще добавить описания встроенных функций из СП?

    Пригодится, например, если забыл разницу между «Вычислить()» и «ВычислитьВыражение()».

    Reply
  21. boln

    (20) MoneG2, интересная идея. Надо подумать.

    Reply
  22. dkprim

    хорошая публикация. хотелось бы увидеть подсветку синтаксиса запроса.. автору спасибо 🙂

    Reply
  23. boln
    MoneG2 пишет:

    Может, еще добавить описания встроенных функций из СП?

    Пригодится, например, если забыл разницу между «Вычислить()» и «ВычислитьВыражение()».

    К сожалению, не выйдет. 1С ответила, что любое цитирование справки или документации в собственных разработках есть нарушение ЛС.

    А своими словами писать влом.

    Reply
  24. Spacer

    По своему назначению этот конструктор похож на конструктор произвольных выражений полей

    в конструкторе запросов.

    В связи с этим мне кажется логичным и удобным чтобы интерфейс конструктора выражений для СКД

    был похож на интерфейс конструктора произвольных полей.

    Т.е. вверху слева — доступные поля, вверху справа — синтаксические конструкции языка выражений,

    внизу — само сформированное выражение.

    Выбор синтаксических конструкций удобно было бы сделать не только в алфавитном порядке как сейчас,

    но и из дерева категорий, как сделано в конструкторе произвольных выражений.

    Reply
  25. boln

    (24) Spacer, ИМХО, будет лучше, если 1С свой Конструктор произвольных выражений сделает как у меня 🙂

    Ведь мы читаем слева направо, поэтому перемещение мыши слева направо выглядит более естественно, чем сверху вниз.

    К тому же, я в (фирме) 1С уже 8 лет как не работаю. Имеем, тзть, полное основание не копировать рабски бывшего работодателя 🙂

    Reply
  26. WiseSnake

    (18) Да не внимательно просто читал )). Спасибо за разработку.

    Reply
  27. Inetguru

    (23) а сделать что-то вроде конструктора,через который можно было бы создавать справку для выбранной функции СКД самостоятельно и записывать во внешний файл, а при открытии считывать файл со справкой. Народ сам себе скопирует то, что 1С не хочет видеть в разработках. Всем будет хорошо, а такие файлы народ будет раздавать друг другу в закрытом виде, может через файлообменники.

    (25) все-таки дерево удобно тем, что видно логически что нужно, если еще не решил заранее или забыл название функции.

    Присоединяюсь к пожеланию внедрения подсветки синтаксических конструкций как в запросах.Так хоть визуально видно что именно в выражении не закончено.

    Может еще добавить возможность пользователю сохранять свои сложные выражения (опять же во внешний файл) и показывать закладку с алгоритмами расчета скд…было бы круто!

    Reply
  28. boln

    (27) Inetguru, да, насчет «конструктора справки» идея понравилась :). Надо подумать.

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

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

    Сохранять в файл — думал с самого начала, потом решил, что это никому не нужно будет. А вот все же, выходит, нужно! 🙂

    Reply
  29. alexkl

    Привычная форма облегчает привыкать к новому.

    Reply
  30. Nika-cat

    Прикольно облегчет мне жизнь а то голова кругом после 7.7

    Reply
  31. AlexO

    (23)

    а почему бы и нет? ))

    пересказать топорную справку своими словами… мне думается — это подвиг и всяческий почет, а не копипаст…

    Вот именно потому, что приходится сначала делать что-то здесь, потом пастить в СКД, и нужна подсказка — а что за выражения, а зачем, в какой последовательности (уж как 1с любит все делать в «своих» последовательностях!)

    А то получается — если запамятовал (а при составлении «длинных» выражений, на которые и ориентирована разработка, так и случается), лезешь в справки-книжки, и уже и Коснтурктор выражений не нужен — и так все уже составил…

    Или в чем преимущество конструктора, как не в убыстрении разработки СКД??

    Reply
  32. dtitov

    Очень интересно, надо попробовать. Спасибо за разработку!

    Reply
  33. Lizi60

    Однозначно плюс!

    Reply
  34. Zas1402

    Спасибо за разработку! Хорошая публикация.

    Reply
  35. FE_D_OR83

    полезная весщ,надо скачать.

    Reply
  36. tormozit

    Реализовал родственный инструмент в подсистеме «Инструменты разработчика» http://infostart.ru/public/15126/

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

    Reply
  37. serge_focus

    А может кто подскажет как в СКД запихнуть подобные параметры

    ПорядокСубконто = Новый Массив();

    ПорядокСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);

    ПорядокСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);

    ПорядокСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеПозиции);

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

    И

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

    Никак не нарою 🙁

    Reply
  38. boln

    (37) serge_focus, на закладке Параметры возле параметра ПорядокСубконто надо установить флажок «Доступен список значений», тогда в колонке Значение по кнопке открывается список значений — в него можно занести предопределенные значения видовх характеристик.

    Reply
  39. pjv

    Если честно, не особенно облегчает жизнь

    Reply
  40. dedicated

    Не работает. Все делаю по инструкции, но при открытии в режиме 1С:Предприяте ни чего не открывается и не выдаются ни какие сообщения. Подскажите что не так делаю? Версия 8.2 ЗУП.

    Reply
  41. boln

    (40) Вы, видимо, открываете ЗУП в обычном режиме. Обработка работает только в управляемом режиме. В обычном режиме форма управляемого режима внешней обработки не открывается.

    Reply
  42. нОлька

    Очень полезная статья. Спасибо автору. !!!!

    Reply

Leave a Comment

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