Конструктор прямых запросов 1C++ v3.29




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

57 Comments

  1. Lustin_is

    +1

    Напомни пожалуйста… Только для SQL ?

    Reply
  2. berezdetsky

    Да. Только для SQL.

    Reply
  3. CheBurator

    > Поддерживает редактирование уже созданных запросов.

    уточните: поддерживает тольеко редактирование уже созданных или позволяет построить запрос с нуля?

    ..это как раз то, что мне нужно…

    Reply
  4. JohnyDeath

    Очень приятная вещь! +1

    Lustin, я и для ДБФ его использую в качестве «первоначального заполнителя». Правда есть пара нюансов: в ДБФ не поддерживаются виртуальные таблицы и приходится добавлять «as» в строчках вида: «Select $Спр.Адрес Адрес». Но это всё мелочи!

    Reply
  5. JohnyDeath

    + метамарсер он и в ДБФ — метапарсер 😉

    Reply
  6. Lustin_is

    to JohnyDeath…

    изначально если бы не qryMaker я бы как говорит trdm так и был бы лопух-лопухом….

    Да и сейчас проекты запросов DBF на нем пишу…. проблемы только с ВТ…

    Reply
  7. berezdetsky

    to Che Burashka

    Позволяет построить запрос с нуля и поддерживает редактирование созданных этим плагином запросов. Для поддержки повторного редактирования созданные запросы сериализуются в XML и сохраняются в подкаталоге qryMaker каталога базы. В самом запросе должна быть сохранена первая строка.

    Reply
  8. CheBurator

    Я фигею без баяна!

    +1

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

    Reply
  9. Abadonna

    Больше запросов — полезных и нужных! 😉 +1

    Reply
  10. tormozit

    GoldParser заюзай. Сделай грамматику.

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

    Reply
  11. German

    а можно использовать совместно с консолью ? http://www.1cpp.ru/forum/YaBB.pl?num=1193394153

    Reply
  12. JohnyDeath

    (11) Из документации (метод):

    • ПостроитьЗапрос/MakeQuery – предназначен для построения прямого запроса 1С++ в режиме 1С:Предприятие. При работе с ИБ в формате MS SQL Server открывает модально форму конструктора запросов. Возвращает текст запроса или пустую строку (при отказе от построения запроса). При работе с ИБ в формате .DBF метод ничего не делает и возвращает пустую строку. Параметр:

    o XMLData (строка) – предназначен для продолжения редактирования запроса, построенного ранее. Необязательный параметр. Должен содержать построенный ранее запрос, сериализованный в XML методом ПолучитьXMLЗапроса.

    Reply
  13. German

    (12) что то («AddIn.qryConsole») грузится н хочет

    Reply
  14. German

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

    Reply
  15. berezdetsky

    German

    1. Консоль лучше обсуждать на 1cpp.ru, т.к. она ещё не закончена.

    2. В самой консоли конструктор доступен из контекстного меню редактора запроса и из панели инструментов. Метод ПостроитьЗапрос предназначен для встраивания конструктора в свои обработки. Пример использования — в сообщении #2 топика http://www.1cpp.ru/forum/YaBB.pl?num=1193394153

    3. Никакие из уже добавленных возможностей я не убирал.

    4. Я не знаю, что такое сборка 6 и сборка 9. Текущая доступная сборка 1216.

    Reply
  16. German

    1cQA.zip(6) отличается от 1cQA.zip(9)

    Reply
  17. berezdetsky

    А. Эти числа дописывает движок форума при добавлении файла с уже занятым именем. 1CQA там — это пример интеграции. Основное окно консоли открывается методом ОткрытьФорму.

    Reply
  18. vasilykushnir

    Вещь просто забойная. Особенно устраняет «мышинную» возню при составных запросах ( например выборка из регистра и справочника и разные варианты их «склеивания») — время экономит очень значительно. Однозначно большой жирный +1.

    Reply
  19. Brad

    Объясните плиз где 1cQA.zip о котором говориться в (14)

    ни здесь

    http://infostart.ru/projects/1665/

    ни здесь

    http://www.1cpp.ru/forum/YaBB.pl?num=1193394153

    этой обработки нет 🙁

    Reply
  20. JohnyDeath

    (19) Выбирай любой:

    http://www.1cpp.ru/forum/YaBB.pl?num=1157967835/all

    😉

    Reply
  21. berezdetsky

    Brad

    Тот 1CQA, о котором говорится в (14) — это был не очень удачный пример для

    http://infostart.ru/projects/1665/

    Он тебе не нужен. 😉 По ссылке выложен более простой и понятный пример, а функционал консоли встроен в ВК.

    Reply
  22. CheBurator

    А когда будет конструктор для DBF?

    Reply
  23. berezdetsky

    Права на разработку конструктора для DBF, вместе с исходниками, переданы artbear. 🙂

    IMHO, никогда.

    Reply
  24. IamAlexy

    Подскажите в чем может быть дело:

    на скриншоте есть виртуальные таблицы «ВТ Остатки» «ВТ Обороты» а у меня в конфигурации (типовая бухгалтерия) этих таблиц нет.

    Как их подключить?

    Reply
  25. berezdetsky

    Виртуальные таблицы в 1С++ реализованы только для регистров, а в типовой бухгалтерии регистров нет.

    Бухгалтерские виртуальные таблицы реализованы классом AccountsRecordset:

    http://www.infostart.ru/projects/1073/

    но в конструкторе они на данный момент не поддерживаются.

    Reply
  26. White__

    +500 !!!

    Reply
  27. Vad1m

    Автору спасибо гигантских размеров.

    Reply
  28. MaxS

    Вот же незадача.

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

    В 1С 8 для этого делаю просто редактирую текст запроса:

    ВЫБРАТЬ * ИЗ ( <СтарыйЗапрос> ) КАК ВложенныйЗапрос

    открываю этот текст в конструкторе запросов и редактирую дальше.

    А тут как быть? Заново в конструторе набивать?

    Reply
  29. berezdetsky

    (28) Да.

    Reply
  30. vadymdymdym

    Присоединяюсь к Vad1m. Респект автору. Читал описание таблиц, но там ни слова про бухгалтерские таблицы. Да и вообще информации по этому я не очень много нарыл. (Может плохо искал?). Так вот, благодаря этой суперской вещи я не только могу в считанные секунды посторить метазапрос при помощи 1cpp.dll, но и смог выудить информацию о бух. таблицах. Ставлю +

    Reply
  31. al_zzz

    Спасибо Вам, berezdetsky!

    Давно пользуюсь Вашим конструктором. Валенки рулят!

    Reply
  32. oav

    Почему то иногда, после ошибки зависает. Запрос не загружается. Выход, только перезагрузить Конфигуратор!

    Reply
  33. oav

    Ошибка :

    Column ‘Журнал.DATE_TIME_IDDOC’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    потому , что в запросе формируется

    GROUP BY Журнал.DOCNO

    , Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)

    а это не верно , надо

    GROUP BY Журнал.DOCNO

    , Журнал.DATE_TIME_IDDOC

    ……

    Reply
  34. oav

    В общем есть недочеты. Но в основном очень да же хорошо!

    Reply
  35. berezdetsky

    (33) Результат твоего предложения — совершенно другой запрос. Ошибка возникает не по этой причине.

    Исправлено в v3.29.

    Reply
  36. Зеленоград

    Для DBF хочется. Но и за имеющееся — большое спасибо!

    Reply
  37. vvashka

    Классная штука

    Reply
  38. realmrak

    Очень полезная вещь. Один недостаток (или может я просто не въехал) — все условия добавляются в текст запроса через AND, а иногда нужно добавить несколько условий в виде » AND (условие1 OR условие 2 OR условие3)». Так же немного мутно с условием «В» — не разобрался, как в таблице параметров задать список значений.

    Reply
  39. berezdetsky

    (38) OR не реализовано. Добавление реквизита диалога для «В» (пока ?) не реализовано.

    Reply
  40. yuraos

    Спасибо огромное! Классная игрушка.

    До этого видел подобную для режима 1С:Предприятие.

    Встраивал ее в консоль 1CQA.ert и все облизывался — вот бы такую в конфигуратор!

    Наконец мечта гения исполнилась!!!

    Жалко что в конструктор нельзя загрузить текст запроса прям из модуля как в 8-ке…

    … или может можно как нибудь???

    PS:

    Небольшое пожелание:

    какие-нибудь настройки плагина,

    чтобы в списке таблиц базы данных выводились идентификаторы объектов МД,

    а не их синонимы.

    А то я минут пять лазил по списку … искал там справочник ЮрЛица…

    … а некоторые справочники в моей конфе имеют оч-чень содержательный синоним — «не используется» 😉

    Reply
  41. berezdetsky

    (40) см. (7).

    PS: идентификатор выводится при отсутствии синонима.

    Reply
  42. realmrak

    Благодаря этой вещице переделал стандартный отчет Продажи на прямые запросы под SQL. Построение отчета ускорилось в десятки раз, если не в сотни 🙂

    Reply
  43. migel

    Это в 7ке чтоли построитель запросов такой????

    Reply
  44. yuraos
    migel пишет:

    Это в 7ке чтоли построитель запросов такой????

    Ага :)))) только для прямых запросов 1C++.

    Правда малость череж ж… работает:

    1) Вместо идентификаторов таблиц и полей зачем-то выводят их представления(как задано в конфигураторе).

    Это в общем-то не удобно — я по первости минуты две разыскивал справочник ЮрЛица в списке.

    2) при соединении таблицы журнала с другой таблицей по полю типа «Документ» (неопределенного вида)

    неудачным образом генерится условие соединения, вроде ‘…ON ($Спр.<ИмяРекв> = Журнал.IDDOC)…’.

    Рабатающий вариант — ‘…ON (RIGHT($Спр.<ИмяРекв>,9) = Журнал.IDDOC)…’

    но в целом бывает полезен.

    Reply
  45. berezdetsky
    yuraos пишет:

    неудачным образом генерится условие соединения, вроде ‘…ON ($Спр.<ИмяРекв> = Журнал.IDDOC)…’

    Версия у тебя древняя.

    yuraos пишет:

    Рабатающий вариант — ‘…ON (RIGHT($Спр.<ИмяРекв>,9) = Журнал.IDDOC)…’

    Поржал. 🙂 Это очень плохо работающий вариант.

    Reply
  46. yuraos

    (45) че ржать то!

    напиши свой!

    Reply
  47. yuraos

    (46) а это ты на счет ачепятки… ;)))))))

    … пардон, беру слова назад.

    а где можно поновее версию взять?

    там тоже вместо идентификаторов таблиц и полей

    их представления используются???

    Reply
  48. sanal

    Наверное прикольная шняга, но у меня не заработало…. Может это фуфел? или как?

    Что необходимо для запуска????

    До этого видел подобную для режима 1С:Предприятие.

    Встраивал ее в консоль 1CQA.ert и все облизывался — вот бы такую в конфигуратор!

    Наконец мечта гения исполнилась!!!

    Жалко что в конструктор нельзя загрузить текст запроса прям из модуля как в 8-ке

    напиши свой!

    Reply
  49. berezdetsky

    Нужен OpenConf.

    Reply
  50. Aristo_

    Большое спасибо, отличная вещь !

    Reply
  51. AVMCo

    Чудненькая обработка

    Reply
  52. lelusha

    Очень актуально для 1с 7.7 даже сейчас. Побольше бы скриншотов с другими вкладками.

    Reply
  53. CheBurator

    осталось разобраться и классифицировать все эти консоли — их уже несколько, какую юзать — уже непонятно.

    .

    Reply
  54. berezdetsky

    (53) Здесь только конструктор, без консоли. А если что-то непонятно — всегда можешь спросить. 🙂

    Reply
  55. lelusha

    А есть разработка конструктора с консолью?

    Reply
  56. lelusha

    И есть ли возмоэность формировать сальдовые, оборотные отчеты, Бух итоги как то вытащить? по субконто отбирать?

    Reply
  57. berezdetsky

    (55) Консоль и расширения запросов.

    (56) Класс AccountsRecordset. Но эти запросы конструктор не умеет, придётся писать руками.

    Reply

Leave a Comment

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