Обработка поиска дублей кода. Исходного кода модулей 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='\

37 Comments

  1. German

    супер, сейчас пробежимся по УПП 😉

    Reply
  2. artbear

    Самое главное в обработке описано совсем слегка 🙁

    Цитата: «Сигнатура блока — строка, обобщённо описывающая блок кода. Может быть одинаковой для блоков, текст которых отличается.»

    Поясни, плиз, подробнее.

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

    Reply
  3. bk-81
    German пишет:

    супер, сейчас пробежимся по УПП

    Это если только по каждому модулю отдельно.

    Пакетная работа предусмотрена, но до конца не реализована.

    Доработки в этом направлении приветствуются, но и сам со временем допишу.

    Опять-таки в тестовом прогоне на 30 Мб. исходного кода была отмечена ошибка платформы.

    Reply
  4. bk-81

    (2)

    Самое главное в обработке описано совсем слегка

    Цитата: «Сигнатура блока — строка, обобщённо описывающая блок кода. Может быть одинаковой для блоков, текст которых отличается.»

    Алгорим составления сигнатуры находится в обработке и, вроде как, должен быть легко понятен целевой аудитории

    Поясни, плиз, подробнее.

    При составлении сигнатуры предполагается, что значения имеют ключевые слова 1С, операторы, имена функций/методов и типы констант. Для единообразия сигнатуры операторов и констант выглядят одинаково.

    Таким образом сигнатуры {Сообщить(«Привет, Мир!»)} и {Сообщить(«Мама мыла раму»)} будут одинаковыми, и {Сообщить(«Привет, Мир!»)} и {Предупреждение(«Привет, Мир!»)} — разными.

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

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

    Если что-то не работает или остаётся непонятным — я по мере сил готов прояснить.

    Reply
  5. Поручик

    >>>>>Умные слова

    Лучше: Не для средних умов. Или: Не для ламеров. И вынести в заголовок.

    Reply
  6. bk-81

    (5) Я ещё определяюсь в терминологии и осваиваюсь с местным редактором. Этот этот «едитор» и без того половину разметки мне потерял.

    Reply
  7. Поручик

    Местный редактор — это широко известный в узких кругах TinyMCE (пруф), вещь упоротая и нормально не работающая, по-моему, нигде.

    Reply
  8. bk-81

    (7)

    Местный редактор — это широко известный в узких кругах TinyMCE

    Я так и думал, но проверять желания даже не возникало. Мне JCE более симпатичен.

    вещь упоротая и нормально не работающая, по-моему, нигде.

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

    Reply
  9. An-Aleksey

    Запуск внешней компоненты Translator.dll отваливается по ошибке системы.

    Зависит-ли работа от винды? (Пробовал на 7-ой)

    Reply
  10. bk-81

    (9)

    Запуск внешней компоненты Translator.dll отваливается по ошибке системы.

    На какой из операций — ЗагрузитьВнешнююКомпоненту, Новый(«AddIn.Translator») или Лексемизатор.ПостроитьДеревоКода?

    Сообщение об ошибке стандартное или платформа падает в дамп?

    Зависит-ли работа от винды? (Пробовал на 7-ой)

    В основном от прав пользователя зависит. Сам проверял на Ultimate 7 x64

    Reply
  11. An-Aleksey
    На какой из операций — ЗагрузитьВнешнююКомпоненту, Новый(«AddIn.Translator») или Лексемизатор.ПостроитьДеревоКода?

    Сообщение об ошибке стандартное или платформа падает в дамп?

    На операции ЗагрузитьВнешнююКомпоненту.

    Стандартное сообщение винды «Прекращена работы программы «1cv8» (Искать решение в интернете / Закрыть программу).

    Пробовал на нескольких машинах, стоит Windows 7 Максимальная.

    Перед запуском обработку конвертировал в 8.2.

    Запускал под толстым клиентом.

    Reply
  12. tormozit

    Такая же проблема (при нажатии на лупу).

    Windows 7 x32 Ultimate.

    1С 8.2.13.218 (обычное приложение, режим совместимости выключен)

    Problem signature:

    Problem Event Name: APPCRASH

    Application Name: 1CV8.exe

    Application Version: 8.2.13.218

    Application Timestamp: 4d6e57bd

    Fault Module Name: StackHash_c6d1

    Fault Module Version: 0.0.0.0

    Fault Module Timestamp: 00000000

    Exception Code: c0000005

    Exception Offset: 10cdd4cf

    OS Version: 6.1.7601.2.1.0.256.1

    Locale ID: 1049

    Additional Information 1: c6d1

    Additional Information 2: c6d16f48f35e70c84b29619c9ba4cc97

    Additional Information 3: 0484

    Additional Information 4: 0484288381e5c7f6e1c0a5e157634e40

    Reply
  13. bk-81

    (11)(12)Спасибо, что помогли.

    Похоже, до выяснения флаг «1С: Предприятие 8.2» с материала придётся снять.

    Никогда не писал ВК для 8.2 и где-то напортачил. Буду учить мат.часть.

    Тем не менее анализировать код от 8.0, 8.1 и 8.2 обработка должна с одинаковым успехом.

    Reply
  14. bk-81

    Внёс ряд изменений:

    Убрал окно выбора файла. Теперь файл выбирается из верхнего меню.

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

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

    Reply
  15. An-Aleksey
    Похоже, до выяснения флаг «1С: Предприятие 8.2» с материала придётся снять.

    С 8.2 не связанно — установил 8.1, запустил — теперь из программы не вылетает, но шлет в конфигуратор:

    {ВнешняяОбработка.ПостоительДерева(8)}: Ошибка при вызове метода контекста (ЗагрузитьВнешнююКомпоненту): Ошибка при загрузке внешней компоненты

    ЗагрузитьВнешнююКомпоненту(ПутьЛексемизатора + «Lexer.dll»);

    Reply
  16. bk-81

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

    Reply
  17. bulpi

    Идея хорошая. Но не работает. Не загружает компоненту. Система XP SP2, 1с 8.1

    Проверяй работу компоненты на разных системах. Иначе это разработка лично для тебя, а не для публикации.

    Reply
  18. bk-81

    (17)

    Идея хорошая. Но не работает. Не загружает компоненту. Система XP SP2, 1с 8.1

    Как ни странно, в кратком описании — у меня точно такая же система, как и у Вас.

    Проверил. Работает.

    Вас не затруднит проверить под отладчиком путь, по которому пытается загрузиться компонента и наличие такого файла на диске?

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

    Проверяй работу компоненты на разных системах. Иначе это разработка лично для тебя, а не для публикации.

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

    Reply
  19. bk-81

    Выложил с ВК, пересорбранной с другими параметрами компиляции

    Reply
  20. An-Aleksey
    Вас не затруднит проверить под отладчиком путь, по которому пытается загрузиться компонента и наличие такого файла на диске?

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

    Путь к компоненте роли не играет — я копировал компоненту на рабочий стол и запускал по прямому пути, не помогло.

    Права доступа тоже не при чем — у меня админские.

    Может действительно файрвол? — Отключать и проверять уже не осталось желания 😉

    Reply
  21. bulpi

    (18)

    Ладно, наезд отменяю 😀 и прошу прощения за резкость.

    Просто жалко, такая интересная публикация, а посмотреть не получается.

    С путем все нормально. С правами тоже, это домашний компьютер, я на нем Бог.

    И новую сборку проверил.

    Может , релиз 1с 8.1 виноват. У меня старый, 8.1.12.98

    Reply
  22. bk-81

    (20)

    Может действительно файрвол? — Отключать и проверять уже не осталось желания

    Там антивирус на упаковщик мог косо смотреть. Последняя сборка — в числе прочих шаманств — не сжата.

    (21)Ничего. Бывает.

    Просто жалко, такая интересная публикация, а посмотреть не получается.

    С путем все нормально. С правами тоже, это домашний компьютер, я на нем Бог.

    Будем копать. Интересно — у кого-нибудь запустилось?

    Может , релиз 1с 8.1 виноват. У меня старый, 8.1.12.98

    У меня 8.1.14.72, но, боюсь, всё не так просто.

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

    Reply
  23. Арчибальд

    Какой приятный дебют 🙂

    Reply
  24. bk-81

    (23)

    Какой приятный дебют

    Весеннее обострение 🙂

    Ещё приятнее было бы разобраться с проблемой внешней компоненты — как часто и по какой причине возникает.

    Reply
  25. bk-81

    Воспроизвёл и скорее обошёл, чем устранил проблему загрузки внешней компоненты.

    Добавил режим анализа каталога с файлами исходного кода.

    Добавил сравнение средствами 1С первых двух похожих блоков из списка.

    Reply
  26. An-Aleksey

    Открываю файл с модулем — промелькнуло черное окно загрузки exe (уповаю на порядочность и отсутствие вируса) 🙂

    Далее окошечко:

    The application has tncountered a problem. We are sorry for the inconvenience.

    Stnd Error Report | Don`t Send

    🙂 ТА-ДА — ДАМП 1С…

    Reply
  27. cool.vlad4

    Может выложить код? прошу прощения за наглость..но может кто-нибудь поправил…вещь очень нужная и полезная…

    Reply
  28. bk-81

    (26)

    Открываю файл с модулем — промелькнуло черное окно загрузки exe (уповаю на порядочность и отсутствие вируса)

    А можно ещё в коде посмотреть — что за команда системы выполняется.

    Далее окошечко:

    The application has tncountered a problem. We are sorry for the inconvenience.

    Stnd Error Report | Don`t Send

    ТА-ДА — ДАМП 1С…

    Что за файл загружается?

    Что пишется при нажатии в окне с ошибкой ссылки «click here.»?

    Reply
  29. bk-81

    — Исправил проблемы распознавания лексемизатором функции «Новый»

    — Исправил проблему с комментариями внутр многострочных констант.

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

    + Добавил кнопку пов

    Reply
  30. dandrontiy

    А кто автор translator.dll ? эта компонента имеет исходный код ? глянуть можно ?

    Интересует в большей степени сам принцип чтения кода конфигурации из 1С (и есть ли возможность его программно менять ?)

    А разработка мне кажется очень полезная.

    Reply
  31. bk-81

    (30)

    А кто автор translator.dll ?

    Я

    эта компонента имеет исходный код ?

    Да.

    глянуть можно ?

    Нет. Права принадлежат моему работодателю.

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

    Выгрузка файлов конфигурации в каталог. Сама обработка этого не делает, но сложности в этом нет — пакетный режим конфигуратора это позволяет. Или V8UnPack / EI в произвольных сочетаниях.

    (и есть ли возможность его программно менять ?)

    Загрузка изменённых файлов конфигурации из каталога. Или V8UnPack / EI в произвольных сочетаниях.

    Reply
  32. tormozit

    Ну че, так и не работает компонента на 8.2?

    Reply
  33. AlexO

    (31)

    т.е. нужен еще и V8UnPack?

    Под 8.3 ВК не понадобится — там уже планируют выгрузку в XML конфигурации.

    Другой вопрос — насколько кто сумеет корректно реализовать «пробег» по всей конфе а-ля УПП…

    Reply
  34. AlexO
    Повторяющийся код — это плохо.

    Повторяющийся код — это практически неизбежно.

    Повторяющийся код — это стиль 1С.

    Повторяющийся код — это неизбежно, пока 1С будет делать то, что она делает уже почти 20 лет.

    Просьба сменить эпиграф на более актуальный — все-таки ресурс по 1С 🙂

    Reply
  35. bk-81

    (32) tormozit, когда последний раз смотрел — работала. С тех пор разве что решил проблему с ЗагрузитьВнешнююКомпоненту. При случае выложу.

    (33)

    т.е. нужен еще и V8UnPack

    Совсем не обязательно. Обработка в первую очередь рассчитана на работу с каталогом, полученный командой «Выгрузить файлы конфигурации». V8UnPack упоминался в другом контексте.

    Под 8.3 ВК не понадобится — там уже планируют выгрузку в XML конфигурации

    ВК делает совсем другие преобразования. Не думаю, что даже 8.8 будет выгружать синтаксическое дерево алгоритмов. Если я не ошибаюсь, то что действительно не понадобится — так это преобразование сериализованних форм в XML для получения списка реквизитов.

    (34)

    Повторяющийся код — это стиль 1С

    Не читал таких руководств по стилю 🙂

    Повторяющийся код — это неизбежно, пока 1С будет делать то, что она делает уже почти 20 лет

    Наверное я чего-то не знаю… Что же такое делается всё это время?

    Просьба сменить эпиграф на более актуальный — все-таки ресурс по 1С 🙂

    Оставлю, всё же, как есть. Пара лет внедрения в проект элементов АОП ещё больше убедили меня в его правильности.

    Reply
  36. ildarovich

    Интереснейшая тема. Нельзя ли побольше узнать об истории разработки:

    — как возникла идея;

    — откуда терминология, методика («сигнатуры», синтаксическое дерево алгоритма) — из книжки?(какой?);

    — сколько длился проект (дипломный?);

    — чем закончился;

    — используется ли сейчас;

    — это случайно не «ИжТиСи»;

    — почему ВК, на чем сделано, какой объем кода;

    — был ли коммерческий интерес.

    Reply
  37. Angel_19

    Получаю ошибку:

    {ВнешняяОбработка.ПоискПохожегоПрограммногоКода.Форма.ПросмотрДублей.Форма(143)}: Индекс находится за границами массива

    МетодыМодуля = СтруктураОбъекта.Строки[0].Строки.НайтиСтроки(Новый Структура(«Тип», 3));
    Reply

Leave a Comment

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