Пример просмотра списка пользователей и их интерфейсов в сеансе 1С:Предприятие 7.7




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

22 Comments

  1. Abadonna

    >Для выполнения необходимы компоненты:

    >FormEx.dll версии 2.0.5.0#33 от АЛьФа

    >RWidjets.dll версии 1.3.3 от robert

    >UsersDef.dll от atos12

    Хорошо хоть, что Linux установленный не требует

    Reply
  2. RinGo

    > Хорошо хоть, что Linux установленный не требует

    Сам не сторонник использования несколькиз внешних компонент, но что поделаешь, если ни фирма 1С, ни многоуважаемые авторы вышеперечисленных компонент не дают возможности 3 в 1..

    Reply
  3. Lustin_is

    позволю себе заметить:

    1. DLL лучше ложить в КаталогПрограммы() — меньше проблем потом будет с использованием подобного функционала

    2. to RinGO — при объединении 3 в 1 могут возникнуть проблемы совместимости использования

    3. Обнаружено падение 1С на шестом нажатии Enter на таблице пользователей.

    4. При загрузке компоненты FormEx не проверяется а может она уже у меня в глобальнике загружена — таким образом при повторной загрузке мы видим очень веселые картинки — а точнее родное меню 1С сокращается примерно до 30 пикселов вне зависимости от длинны текста — так что если закоментировать повторную загрузку ФормЭкс — с родным меню 1С феномены прекращаются

    5. В ТЗдерево — неправильно отображаются пункты меню пользователя

    6. В качестве предложения: использовать 1С++: вместо ТЗДерево -> TreeCtrl, а также Общие.Форма.Привязка

    Reply
  4. vasilykushnir

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

    По-моему в последней версии Альф поставил проверку на повторную загрузку.

    Reply
  5. Lustin_is

    >По-моему в последней версии Альф поставил проверку на повторную загрузку.

    Может быть, но помогло именно коментирование загрузитьВнешнююКомпоненту()…

    Reply
  6. RinGo

    > …таким образом при повторной загрузке мы видим очень веселые картинки

    Мужики, а у вас какая версия FormEx?

    > to Lustin > Обнаружено падение 1С на шестом нажатии Enter на таблице пользователей

    Перетоптал N-е количество раз — не падает…

    >По-моему в последней версии Альф поставил проверку на повторную загрузку. — Компонента FormEx уже загружена! — АЛьФ таким образом проверяет…

    Reply
  7. Lustin_is

    вот полная конфигурация тестового стенда (точнее загруженные внешние компоненты)

    система WinXP SP2 Athlon 64+ 3800 (512+512) ASUS nf570

    1C 7.7.025 SQL — не патченная!!!

    Все внешние компоненты расположены в КаталогеПрограммы — доступ локальный (НЕ! терминальный), я собственно являюсь Администратором

    1C++

    ProductVersion : 2, 5, 0, 0

    SpecialBuild : Nightly build 2007-02-13

    UsersDef.dll

    Last Modif. Date : 17/11/2005 22:23:18

    RWidjets.dll

    FileDescription : RWidjets

    FileVersion : 1.3.3.0

    FormEx.dll

    ProductName : FormEx™

    ProductVersion : 2, 0, 5, 0

    SpecialBuild : #33

    vkLoader.dll

    FileDescription : Загрузчик внешних компонент 1С-Предприятия 7.7

    FileVersion : 1, 0, 0, 2

    ProductVersion : 1, 0, 0, 2

    Reply
  8. Lustin_is
    Код
    ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"vkloader.dll");
    Попытка
        Загрузчик = СоздатьОбъект("ЗагрузчикВК");
       
        ВывестиОшибкуЗагрузкиКомпоненты(
                  Загрузчик.ЗагрузитьВК(КаталогПрограммы()+"1cpp.dll",
                            "Addin.1C++=fde5ae76-00b3-4bdb-921b-d5937997b1b7"));
        ВывестиОшибкуЗагрузкиКомпоненты(
                  Загрузчик.ЗагрузитьВК(КаталогПрограммы()+"turbomd.dll",
                            "Addin.TurboMD=dc04a720-7f85-11d8-9fcd-c4cb45b9fe08"));
        ВывестиОшибкуЗагрузкиКомпоненты(
                  Загрузчик.ЗагрузитьВК(КаталогПрограммы()+"UsersDef.dll",
                            "Addin.UsersDef=549ebc24-dfe0-4230-a5ff-fd447dd695c2"));
        ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"formex.dll");
        ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"RWidjets.dll");
    Исключение
        //Все хреново
    КонецПопытки;
    

    Показать полностью

    До этой обработки подобная конструкция работает уже давно.

    Reply
  9. Lustin_is

    Удалось отловить ошибку на шестом нажатии

    «ERRRORRR funcRedrawMenu»

    Reply
  10. Lustin_is

    У пользователей — самых главных Администраторов — все равно показывает меню Файл и Операции закрытыми

    На интерфейс Продавец — где вообще три кнопки активно, выводит активными меню отчетов которых вообще не должно быть

    Пустые пункты меню — это как?

    И раз уж на то пошло — на какой конфигурации тестировалась обработка?

    Reply
  11. RinGo

    to Lustin

    У нас 1С 7.70.021 SQL (тоже не патченная). Конфигурация своя — не типовая(все писали с чистого листа — на компоненте «Бухучет»).

    Вчера выложил beta-версию разработки — «MD-независисмый список пользователей», откуда «вырезал» обсуждаемую обработку. Попробуй выполнить из нее обработку адм_выгрузкаИнтерфейсов.ert и результат — папку «Интерфейсы» — кинь мне на мыло, попробую разобраться…

    >»ERRRORRR funcRedrawMenu»

    …Если используете 1С++, то сначала загружайте 1cpp.dll, потом RWidjets.dll

    1С++ блокирует обработку некоторых событий. Скорей всего дело в этом.(это комментарий разработчика RWidjets — robert)…

    А из опыта: чем больше используешь ВК, тем выше вероятность конфликтов

    Reply
  12. Lustin_is

    >>1С++ блокирует обработку некоторых событий. Скорей всего дело в этом

    я ниже опубликовал код загрузки своих компонент. 🙂

    раньше просто с ними проблем не было…

    >>и результат — папку «Интерфейсы» — кинь мне на мыло, попробую разобраться…

    сделаю

    Reply
  13. RinGo

    to Lustin

    И еще: не помню где, но в памяти уменя отложилось, что АЛьФ объявил, что боле не будет поддерживать функционал FormEx в1С++…

    Reply
  14. Lustin_is

    Разобрался из-за чего происходит ошибка:

    Структура интерфейсов у меня такая:

    Администратор

    |_Менеджер отдела продаж

    |_Администратор сервисного отдела_

    |_Менеджер сервисного отдела

    Так вот на интерфейсе Менеджер сервисного отдела обработка входит в бесконечный цикл

    Неужели ни у кого нет вложенных интерфейсов с уровенм вложенности больше ОДНОГО

    Reply
  15. RinGo

    Понял… Посмотрю…

    Reply
  16. Lustin_is

    >>И еще: не помню где, но в памяти у меня отложилось, что АЛьФ объявил, что боле не >>будет поддерживать функционал FormEx в1С++…

    Ну если быть совсем точным то у меня отложилось что произошло разделение 1С++ 2.5 и FormEx 2.0.5 — но на самом деле подобное проще узнать на http://www.1cpp.ru

    Точный адрес ветки в форуме http://www.1cpp.ru/forum/YaBB.pl?num=1150441349/0

    А там прямо и написано — если что-то не работает милости просим с багрепортами…

    Reply
  17. RinGo

    to Lustin

    >>Так вот на интерфейсе Менеджер сервисного отдела обработка входит в бесконечный цикл

    У меня при вложенности более одного уровня выдает:

    адд_МП.ЗагрузитьИнтерфейс(текИнтерфейс);

    {C:1CVADMINLIGHTМОДУЛИАДМ_СПИСОКПОЛЬЗОВАТЕЛЕЙКОНФИГУРАЦИИ.ERT(169)}: Не удалось прочитать файл: \Server11CV77datПаспортизация1C_PRZ1Cv7.MD

    Я так понимаю: robert при разработке RWidjets не предусмотрел такой вариант…

    Reply
  18. SorEZH

    прикольно

    Reply
  19. andrey995

    Администрация, введите плиз код с картинкой для отправки сообщений или запрет на ссылки для анонимов, задолбали спамеры

    Reply
  20. НачинающийЮзер

    У меня не верно отображаются подчиненные интерфейсы — отображается не наследник, а интерфейс самого верхнего уровня.

    Reply
  21. svetanik

    Аналогично:(

    Reply
  22. coolo

    Hеобходимы компоненты:

    FormEx.dll версии 2.0.5.0#33 от АЛьФа

    RWidjets.dll версии 1.3.3 от robert

    UsersDef.dll от atos12

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

    Помоему проще в конфигуратор зайти…)))

    Reply

Leave a Comment

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