Класс 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='\

8 Comments

  1. skyman2

    таблицаЗначений.ВыбратьСтроку()

    СписокЗначений.ВыбратьЗначение(0)

    Интерактивный просмотр тз и сз прямо в отладке. только надо переключиться в интерфейс

    Reply
  2. bainov

    (1) Недостаток типового метода в том, что невозможно просмотреть значение поля, если там записана ТЗ или СЗ, в которых в свою очередь также ТЗ или СЗ, и т.д. и т.д., а в случае применения 1С++ еще и ссылки на классы и структуры, которые в своих полях также содержат ссылки на классы, структуры, ТЗ или СЗ.

    Вот для таких случаев и применяем метод просмотра вызовом процедуры глБраузер(ТЗ). Мне очень помогает в работе. Надеюсь, что поможет и другим.

    Отладчик 1С зависает при попытке просмотра значений типа класс 1С++.

    Reply
  3. wing

    Немного покритикую:

    1. Судя по использованию во всех классах метода Вид(), автор не любит (или не умеет?) ничего оптимизировать (на это же наталкивает и использование 3D-объектов там, где нужно всего лишь вывести сообщение — неоправданная нагрузка железа).

    Чтобы не быть голословным, поясню:

    Функция Вид() Экспорт Возврат ТипЗначенияСтр(Сам()); КонецФункции

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

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

    По идее он должен рекурсивно вызывать сам себя для отображения объектов до тех пор, пока не упрется в простой тип, а в случае с несколькими вариантами отображения (например: документ шапка и ТЧ) — эмулировать (например, для дока: показывая реквизиты шапки + добавляя ТЗ с выгруженной ТЧ или списоком отдельно реквизиты шапки и отдельно ТЗ с ТЧ).

    3. Наследовать во всех объектах такого тяжелого предка как класс Объект — тоже не есть рационально…

    4. Непонятно назначение функции ЗаписатьСобытие класса РегистраторСобытий. Чем она лучше вызова ЗаписьЖурналаРегистрации?

    5. Поражает использование ненужного числа строк комментариев вначале каждого модуля, притом, автору ненужных, судя по тому, что он оставляет незаполненными «теги» <Вставить имя модуля> и <Вставить описание модуля>.

    Надеялся из них прочитать назначение классов…

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

    Скачал только из-за упоминания в теме инспектора объектов, т.к. это довольно нужная штуковина, однако реализация разочаровала.

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

    Reply
  4. bainov

    Уважаемый wing!

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

    изначально класс-инспектор был «выкушен» из моего проекта «Рабочее место кассира», поэтому «прицепом» пришлось прикрутить много лишних объектов для успешной компиляции.

    Непонятно назначение функции ЗаписатьСобытие класса РегистраторСобытий. Чем она лучше вызова ЗаписьЖурналаРегистрации?

    Назначение: для отладки.

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

    использовал в частности при отладке динамически создаваемых SQL-запросах.

    Журнал регистрации очень быстро раздувается и становится неповоротливым.

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

    Reply
  5. CaSH_2004

    Замечательно выглядит в режиме Предприятие

    Но что то у меня не хватило мозгов запустить из отладчика, подскажи как? И почему то в режиме Предприятие внешний вид не такой как на скриншотах и нет картинки на кнопке «Закрыть», это нормально? Может не все доустановил?

    Reply
  6. Altair777

    (0) Автор, укажите платформу

    Reply
  7. CaSH_2004

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

    Reply
  8. bainov
    CaSH_2004 пишет:

    Замечательно выглядит в режиме Предприятие

    Но что то у меня не хватило мозгов запустить из отладчика, подскажи как? И почему то в режиме Предприятие внешний вид не такой как на скриншотах и нет картинки на кнопке «Закрыть», это нормально? Может не все доустановил?

    Скриншотики от предыдущей версии, поэтому не совпадают с тем, что в текущем примере использования.

    А что не получается из отладчика запускать?

    В отладчике само собой ничего не просматривается.

    Просмотр объекта делаем в режиме 1С:Предприятие вызовом глобальной функции глБраузер()

    Код функции:

    //функция для просмотра объектов типа ТаблицаЗначений, СписокЗначений, Структура, ИндексированнаяТаблица
    //автоматически открывается просмотр вложенных объектов этих типов.
    Процедура глБраузер(Объект) Экспорт
    Инспектор=СоздатьОбъект(«ИнспекторОбъектов»);
    Инспектор.Открыть(Объект);
    КонецПроцедуры

    Чтобы это все работало надо при начале работы системы загрузить компоненты 1CPP.dll и Formex.dll

    Подробнее об использовании этой замечательной компоненты на сайте 1С++

    В двух словах про установку:

    1. Описание классов находится в каталоге <Каталог базы>/Classes

    Просто копируем каталог Classes в каталог базы 1С7.7

    2. файл DefCls.prm должен быть в каталоге базы

    Если его нет, создаем его и пишем туда строку

    //#include ClassesИнспекторDefCls.prm

    3. Необходимые компоненты для запуска находятся в подкаталоге DLL

    4. Для начальной инициализации скопируйте содержимое процедуры ПриНачалеРаботыСистемы() глобального модуля из примера.

    5. В примере есть две обработки в составе конфигурации — формы просмотра значений типа Cтруктура и ТаблицаЗначений. Их необходимо обязательно вставить в свою конфигурацию.

    Reply

Leave a Comment

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