Вызов конструктора запроса для кода на встроенном языке 1С, заданного в пользовательском режиме




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

30 Comments

  1. Dzenn

    я ничего не понял из написанного

    Reply
  2. Dzenn

    хотелось бы, чтобы гифки шли помедленнее, либо сопроводить их набором жпегов

    Reply
  3. Vladimir Litvinenko

    (1) Публикация предназначена для тех, кто создаёт или планирует создавать инструменты, позволяющие управлять исполняемым кодом 1С прямо из пользовательского режима. Если вам интересно, то пройдите по приведенным в начале публикации ссылкам. Консоль кода — простейший пример инструмента, где это может пригодиться.

    А писалось всё это дело для «динамических подписок«, которые позволяют не лезть каждый раз в конфигуратор и выгонять пользователей из базы, чтобы добавить/изменить подписку на событие, а задать нужный код из режима 1С:Предприятия.

    Это особенно полезно, когда нужно срочно добавить какой-нибудь контроль/запрет при создании/изменении объектов базы. Конструктор запросов позволяет быстрее вносить изменения в такой код.

    (2) Учту.

    Reply
  4. OneS

    Вот какое дело… Человеку не знающему, в контексте поставленной задачи, конструктор не поможет. А кто знает, тому конструктор как то уже и не очень нужен. Консоль запросов тому подтверждение.

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

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

    Reply
  5. Vladimir Litvinenko

    (4) Первую часть вопроса не очень понял. И консоль запросов и консоль кода все активно используют. Более того, есть разработки, где большая часть нового кода задается сначала в пользовательском режиме. Например Мета-конфигуратор в «СКАТ-Профессионал».

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

    Представьте, что Вам поставили задачу запретить изменение документов, удовлетворяющих сложному условию, которое оптимальнее проверять через запрос. Что вы сделаете? Добавите в конфигураторе подписку на событие «ПередЗаписью» и выгоните всех пользователей из базы? А если через некоторое время это условие поменяется, ведь бизнес у нас переменчив?

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

    Посмотрите вот этот скриншот:

    http://infostart.ru/upload/iblock/b8e/Pic5.PNG

    Reply
  6. wowik

    я так понял это аналог обработок «Выполнить» из ИР.

    Reply
  7. Yashazz

    Баян, да ещё и некрасиво сделанный. Я решил такую задачу давным-давно и её решений видел несметно, ибо элементарщина. Воистину, скоро дождёмся мегапопулярных публикаций на тему «как выбрать элементы из справочника», но зато красивых, с гифками и попунктным разжёвыванием каждой строки.

    Reply
  8. Vladimir Litvinenko

    (6) wowik,

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

    (7) Yashazz,

    Я рад, что где-то в недрах Ваших обработок существует подобный алгоритм. Осталось подождать пока Вселенский Коллективный Разум объединит мозги всех 1С-ников в единое целое. Тогда мы перестанем делиться алгоритмами и будем создавать идеальные разработки. Кстати не нашел подобного в Ваших публикациях. Вот это не в счет. Там просто строка вставляется, а открыть запрос в конструкторе нельзя.

    Reply
  9. Yashazz

    (8) Не, там нету, я в первую очередь о ней вспомнил и проверил, нифига. В других каких-то было, сейчас не вспомню.

    Дело в другом — это ведь фрагмент, кусок, не очень понимаю смысл так его разжёвывать. Впрочем, это лично моё недоумение.

    А что до «некрасиво» — после того, как я видел подобные решения на регулярных выражениях, всё остальное меркнет…

    Reply
  10. Vladimir Litvinenko

    (9) Yashazz,

    Разжевывать нужно чтобы не только «суперпрофессионалы» всё поняли. Жаль, что многие программисты забывают, что они не всегда были гуру, а когда-то тоже учились.

    К тому же политика Инфостарта такова, что для скачивания нужно потратить 1$m и насколько я понял для многих это проблема. Поэтому код по возможности вставляю в статью. Дополнительные комментарии по сравнению с этим — мелочь.

    Что до RegExp, то это внешняя по отношению к 1С библиотека. Конечно это своего рода стандарт, но «стандарт» и 1С — вещи слабо совместимые. RegExp используется в 1С через COM-интерфейс, который например не поддерживается в Linux, для которого с недавнего времени тоже есть толстый клиент. Если писать простое универсальное решение для 1С, то лучше чтобы оно зависело только от 1С.

    Reply
  11. MrFlanker

    Гифики помедленей пожалуйста, ну непонятно что ж такое происходит.

    Reply
  12. tormozit

    Кроссплатформенную замену VBScript.RegExp обещал Орефков, но что то тишина у него уже пол года. Видимо крепко засел над снегопатом для 8.3. Кстати в ИР уже давно есть поддержка его компоненты, но отключено внутри, т.к. она пока в некоторых случаях аварийно завершает приложение. Качественный багрепорт ему я еще весной отправил.

    Reply
  13. Vladimir Litvinenko

    (12) Интересно, иметь такой инструмент было бы хорошо. Будем ждать.

    А реализация планировалась средствами 1С или через какую-то библиотеку?

    Reply
  14. tormozit
  15. Vladimir Litvinenko

    (15) Субъективное суждение. Потому что одни из самых рейтинговых публикаций на ИС — это разного рода обучалки, переработанные пересказы документации и обработки, направленные на самую широкую аудиторию. Значит есть люди, для которых это полезно и нет ничего плохого в том, чтобы с ними этим делиться.

    И мне тоже бывает интересно увидеть новую интерпретацию уже знакомой информации. Не думаю что имеет смысл это обсуждать ибо ведет к холивару.

    Reply
  16. Vladimir Litvinenko

    (15) Это все таки ВК:

    В поставку входит два файла:

    •rex32.dll — для работы в 32-битных клиентах и сервере

    •rex64.dll — для работы в 64-битном сервере

    Основные планы на ближайшее будещее — сделать linux-версию.
    Reply
  17. tormozit

    (17) Нет. Это «полуВК» и «полуРасширениеОбъектнойМодели». Когда попробуешь, поймешь.

    Reply
  18. Sitex

    (10) в целом неплохо. Особенно когда в рутине дел это может позабыться.

    (15) Yashazz, По вашему суждению, можно при регистрации сделать на ИС сдачу теории…т.п. Чтобы лишних как статье так и комментариев не было.

    Reply
  19. Yashazz

    (19) Это не моё суждение, это определение сайта как такового, посмотрите сами. Впрочем, увы, ИС действительно медленно, но верно превращается во второй DevTrain. 🙁

    Reply
  20. Vladimir Litvinenko

    (20)

    ИС действительно медленно, но верно превращается во второй DevTrain

    Ваши претензии безосновательны. Вы не привели ссылку на другую публикацию, где аналогичная работа с конструктором велась бы без подключения внешних dll-библиотек. То, что именно это является целью данной публикации указано в самом её начале. Подробность изложения материала также считаю плохой мишенью для критики.

    Дальнейшее обсуждение «элементарщины», «баянов» и причитания о судьбе Инфостарта предлагаю перенести в ЭТУ или ЭТУ публикации за Вашим авторством. Они подходят для этого гораздо больше. Признак непрофессионализма — это тратить время на поиск соринки в чужом глазу, вместо того, чтобы улучшать качество собственных работ.

    Reply
  21. МимохожийОднако

    Хорошая статья

    Reply
  22. help1Ckr

    Спасибо за статью, особенно за то что выложили здесь подробное описание алгоритма.

    Reply
  23. Yashazz

    (21) Вы, вероятно, не видели вот этого: http://infostart.ru/about/, где в первой же строке сказано «Профессиональное сообщество». Ознакомьтесь, потом будете спорить.Это и вообще всех касается, кто считает ИС «лягушатником для начинающих». И про специалистов, оказывающих профессиональные услуги, тоже, считаю, доступно написано.

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

    Засим участие прекращаю, ибо бессмысленно тратить время не привык.

    Reply
  24. Vladimir Litvinenko

    Да я и так старался избежать перехода на личности. Но сообщения (7), (15) и (20) написанные в резком обвинительном тоне не оставили выбора. Уж извините.

    Reply
  25. Yashazz

    (25) Ладно, проехали. С праздниками всех, кстати. Просто у меня пунктик — очень не люблю баянить сам, иногда и других начинаю пинать, увлёкшись. Прошу пардону.

    Reply
  26. servs

    Обращаю внимание критиков: способность писать код на языке 1С, не прибегая при этом к dll — это критерий, по которому можно отличить новичков (или лентяев 🙂 ) от грамотных программистов 1С.

    Не использование dll в конкретной задаче — это изюминка статьи,

    + алгоритм также полезен не менее.

    Многим профессионалам есть чему поучиться, ящетаю)))

    Спасибо за статью! Ставлю жирный плюс!

    П.С.: Есть статьи на ИС, которые иногда вызывают у меня такую же реакцию как у критиков выше (например, обработка запуска амми из 1С). Эта статья заслуживает на похвалу. Нужно уметь понять ее ценность, что не каждому дано.

    Reply
  27. Alex1Cnic

    А что, интересная статья. Люблю, когда все по-полочкам разложено…

    Reply
  28. Ivon

    Вообще молодец. Плюсанул.

    Reply
  29. CaSH_2004

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

    Reply
  30. Terve!R

    Ну вот, думал скачать и сразу использовать, но как всегда пришлось допилить)

    Автор, открытие конструктора в тонком клиенте возможно, начиная с версии платформы 8.3.5! А здесь проверка на толстый клиент и привет!

    Во-вторых, пришлось переделывать на открытие конструктора через Показать() и оповещение, модальный вызов в тонком клиенте не работает.

    Reply

Leave a Comment

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