Форматирование (выравнивание) кода 1С 8. Навигация по тексту модуля.




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

41 Comments

  1. Spartan

    Знак «равно» в первой строке блока размещает на один символ дальше, чем в остальных. А так — плюс, мне пригодится!

    Все, догнал… Если перед первой строкой есть табуляция, то нужно выделять прям с самого начала строки вместе с ней — тогда нормально.

    Reply
  2. IDija

    «Плюс» конечно.Вот еще бы циклы и условия выравнивать… 😉

    Reply
  3. antonrost
    IDija пишет:

    «Плюс» конечно.Вот еще бы циклы и условия выравнивать…

    Вроде их 1С сама выравнивает…

    Reply
  4. break

    Здорово. Еще бы и «структуру» вырвнивала бы:

    ПараметрыЗаполнения = Новый Структура;

    ПараметрыЗаполнения.Вставить(«Дата»,_______Дата);

    ПараметрыЗаполнения.Вставить(«Деталь»,_____Деталь);

    ПараметрыЗаполнения.Вставить(«Количество»,_Количество);

    ПараметрыЗаполнения.Вставить(«Автор»,______глТекущийПользователь);

    В работающем коде конечно место _ стоят пробелы.

    Reply
  5. Amali
    IDija пишет:

    «Плюс» конечно.Вот еще бы циклы и условия выравнивать

    А чем не нравиться Alt+Shift+F ?

    Reply
  6. Sergey K

    +

    Добавить форматирование в запросы

    поле________КАК

    ваолоыпрлва_КАК

    алвыодао____КАК

    лываж_______КАК

    Reply
  7. YAN

    При нажатии какой-то «левой» комбинации вышло сообщение об ошибке и программа успешно закрылась!

    Reply
  8. antonrost

    Появился новый функционал. Качаем, критикуем. 😐

    Reply
  9. antonrost
    YAN пишет:

    При нажатии какой-то «левой» комбинации вышло сообщение об ошибке и программа успешно закрылась!

    Это — оооочень бета версия. То, что закрылась именно успешно, уже прогресс !!! 🙂

    Это уже обновленная закрылась ?

    Reply
  10. Spartan

    (9) Из 4-х попыток выравнивания кода запроса — 4 раза вылетела по ошибке, трижды сообщила, что «Не удалось создать компонент ActiveX», один — «Программа выполнила недопустиую операцию…»

    Reply
  11. antonrost
    Spartan пишет:

    (9) Из 4-х попыток выравнивания кода запроса — 4 раза вылетела по ошибке, трижды сообщила, что «Не удалось создать компонент ActiveX», один — «Программа выполнила недопустиую операцию…»

    Не удалось создать компонент ActiveX — в описании сказано: «Зарегистрировать svcsvc.dll»

    Reply
  12. Spartan

    (11) Значит плохо читал — извиняй… 😀 Я все больше как-то по первой версии ориентировался…

    Reply
  13. Rustig

    Идея здоровская! Плюс!

    Часть функционала можно реализовать на платформе 1С: [делюсь опытом :)]

    http://infostart.ru/public/79256/.

    Reply
  14. Spartan

    (0) Ты знаешь, зарегил я библиотеку, тока видно это действительно пока очень уж бета… При форматировании блока с равенствами из 4 попыток, отформатировала только один раз нормально и то со сдвигом первой строки на лишний пробел. В других случаях, прога делала вообще непонятно что: то удаляла блок вообще, то вытягивала его в одну строку с удалением знаков равенства. Если не трудно, положи первую версию вторым файлом — она как-то постабильнее будет.

    Reply
  15. the1

    Вроде работает =) Спасибо, +! Выравнивание различных структур языка не помешало бы.

    Reply
  16. alex_4x

    Ждем более стабильную версию.

    А идея очень нужная, полезная и т-д….

    Вот бы еще автор подключил бы туда работу с регулярными выражениями — поиск, замену…

    И пополняемый список правил, на основе этих же самых регулярных выражений,

    тогда сама разработка утилиты была бы отдельно, а правила — отдельно,

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

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

    И с регулярными выражениями, можно еще много всяких фичь добавлять.

    Reply
  17. antonrost
    alex_4x пишет:

    Ждем более стабильную версию.

    А идея очень нужная, полезная и т-д….

    Вот бы еще автор подключил бы туда работу с регулярными выражениями — поиск, замену…

    И пополняемый список правил, на основе этих же самых регулярных выражений,

    тогда сама разработка утилиты была бы отдельно, а правила — отдельно,

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

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

    И с регулярными выражениями, можно еще много всяких фичь добавлять.

    Показать

    Приведи парочку примеров — попробую прикрутить.

    Reply
  18. antonrost
    Spartan пишет:

    (0) Ты знаешь, зарегил я библиотеку, тока видно это действительно пока очень уж бета… При форматировании блока с равенствами из 4 попыток, отформатировала только один раз нормально и то со сдвигом первой строки на лишний пробел. В других случаях, прога делала вообще непонятно что: то удаляла блок вообще, то вытягивала его в одну строку с удалением знаков равенства. Если не трудно, положи первую версию вторым файлом — она как-то постабильнее будет.

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

    Reply
  19. Spartan

    (18) Вряд ли, у меня с машиной все в порядке… Ну давай попробуем.

    Reply
  20. alex_4x
    antonrost пишет:

    Приведи парочку примеров — попробую прикрутить.

    REGEXP Википедия 😉

    Regexp в 1С

    Здесь же, на Инфостарте про regexp

    Ты саму тулзу, на C# пишешь ?

    Тогда просто подключи библиотеку и будет тебе счастье. Пример в интернете полно.

    using System.Text.RegularExpressions;

    Простенький пример на C# с сайта c-sharpcorner

    Reply
  21. antonrost
    alex_4x пишет:

    REGEXP Википедия smile;-)

    Regexp в 1С

    Здесь же, на Инфостарте про regexp

    Ты саму тулзу, на C# пишешь ? Тогда просто подключи библиотеку и будет тебе счастье. Пример в интернете полно. using System.Text.RegularExpressions;

    Простенький пример на C# с сайта c-sharpcorner

    alex_4x пишет:

    Я имел ввиду примеры применения для 1С. Не КАК делать, а ЧТО делать.

    Reply
  22. alex_4x

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

    Конечная цель у него отличная от твоей, но принцип выделения лексем — одинаков.

    например ты собираешь все лексемы содержащие Переменная = Значение;

    Выравнивать по Началу первой лексемы, знака «=», Значение.

    Для Т по З Цикл

    Блаблабла

    КонецЦикла

    Тоже лексема — выравнивать

    ну и так далее.

    Reply
  23. alex_4x
  24. antonrost
    alex_4x пишет:

    Вот здесь Автор использует регулярные выражения для выделения лексем языка. Конечная цель у него отличная от твоей, но принцип выделения лексем — одинаков.

    например ты собираешь все лексемы содержащие Переменная = Значение; Выравнивать по Началу первой лексемы, знака «=», Значение.

    Для Т по З Цикл Блаблабла КонецЦикла Тоже лексема — выравнивать

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

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

    Reply
  25. artbear

    Да, странное форматирование 🙁

    Взял одну процедуру, весь ее текст прижал к левому краю, далее Альт+Ф12 и Форматировать блок.

    Результат повеселил 🙁 —

    1. у комментария // появился/вставился лишний пробел / / 🙁

    2. текст внутри строк выровнялся по знакам равно, т.е все что справа от знака равно, на одной колонке, но левая-то осталась как есть, прижатой влево 🙁

    ИМХО в описании нужно специальным образом указать, что не происходит выравнивания операторов, аналогичного типовому форматированию, т.е. обработку нужно использовать только в дополнении к основному форматирования или для небольших блоков кода.

    У нас есть аналогичный проект для разработчиков для AutoHotkey — список процедур/функций через svcsvc, авторские комменты, форматирование, удобное переназначение хоткеев под привычный набор хоткеев и т.п.

    Основная проблема — неудобство получения выделенного текста, получаем только через передачу спец.символов в окно 1С для работы через буфер обмена.

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

    На данный момент реализовано:

    — Вызов списка процедур с фильтрацией наименований методов при наборе текста

    — форматирование модуля при помощи code_beautifier.pl

    — Автоматическая печать символа «|» после перевода строки, при необходимости — Enter.

    — Автоматическая печать символов комментария «//» после перевода строки по Shift+Enter, если текущая.строка также является комментарием.

    — удаление строки Ctrl+y

    — Закрытие окна сообщение Ctrl+z (не всем нравится)

    — символ ‘<‘ по Ctrl-,

    — символ ‘>’ по Ctrl-.

    — символ ‘|’ по Ctrl-\r

    — переходы по процедурам в стиле OpenConf?

    переход в процедуру (как в OpenConf? — ctrl+enter)

    возврат на предыдущую позицию (как в OpenConf? — alt+{left})

    Вопрос — как смог получить только выделенный текст в окне 1С?

    Используешь посылку символов для работы через буфер обмена или другим способом?

    Поделишься? очень нужно!

    Reply
  26. antonrost
    artbear пишет:

    Вопрос — как смог получить только выделенный текст в окне 1С?

    Увы, банальный SendKey «Ctrl-Insert», но попыток найти другой способ еще не оставил.

    Reply
  27. MSensey

    Плюс за попытку сделать что-то полезное.

    Попробовал … есть проблемы … буду ждать стабильной версии.

    Reply
  28. orefkov

    Небольшая демка на тему.

    Скачать, запустить, посмотреть фильм.

    Reply
  29. antonrost
    orefkov пишет:

    Небольшая демка на тему.

    .

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

    Reply
  30. orefkov
    antonrost пишет:

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

    Каминг сун, как говорится. И года не пройдет.

    Reply
  31. inf0start

    А нельзя ли реализовать дополнительное форматирование, где вместо пробелов используется табуляция, и только концовка перед знаком равно (если нужно) выравнивается пробелами?

    Reply
  32. artbear

    (30) Саш, я как всегда готов быть твоим тестером 🙂

    Reply
  33. orefkov

    Вот еще побаловался чуток.

    Умный Enter.

    Reply
  34. artbear

    (34) А с нами поделиться 🙂 ?

    Reply
  35. antonrost

    (33) Дразнишься? Уже слюнки текут…

    Reply
  36. orefkov
    artbear пишет:

    (34) А с нами поделиться ?

    Так ведь это все пока на коленке собрано, с торчащими во все стороны кусками проводов, и падает при любом чихе.

    И работает пока только на 8.2.11.236. Вобщем до деления еще не так близко.

    Reply
  37. artbear

    (36) Может, помощь какая нужна? или тестирование более активное? чтобы чихи быстрее ловить? 🙂

    Reply
  38. orefkov
    artbear пишет:

    (36) Может, помощь какая нужна? или тестирование более активное? чтобы чихи быстрее ловить?

    Пока нет. Но тебя я записал в книжечку.

    Reply
  39. orefkov

    Ну вот и появилась для Снегопата

    равно-выравнивалка

    Reply
  40. Dmitrii D

    с коментами обработка делает что-то чудесное !

    Reply
  41. FilatovRA

    Падает в 8.3

    Reply

Leave a Comment

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