Обработка поиска дублей кода. Исходного кода модулей 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *