Универсальная подсистема "Фабрика событий" v 1.0 + "Доп. права доков" v 2.0 + "Сканы доков" v 2.0




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

38 Comments

  1. venger

    На самом деле можно включать/отключать или не устанавливать ту или иную подсистему в конфигурацию, кроме «Фабрики событий», она должна быть всегда, а также дописывать, под использование с «Фабрикой», новые подсистемы и объединять их в разных вариациях и количествах, на сколько фантазии программиста хватит;-)

    Reply
  2. venger

    (0) Сегодня-завтра это все буду ставить к себе в реальную базу, может кто чего найдет из багов, глюков и т.п. — пишите, буду рад:-)

    Reply
  3. Garstag

    Уважам-с…

    🙂

    Reply
  4. JohnyDeath

    Судя по описанию — хорошая вещь. Работа проделана хорошая.

    Подсистему «доп. права документов» можно было бы еще гибче сделать. Посмотри на конфу «СКАТ», там сделано на «регистрах правил»

    P.S. Судя по скринам, ты не пользуешься Colorer for Openconf. Ставь скорее — вещь просто незаменимая!

    Reply
  5. venger

    (4)

    Судя по скринам, ты не пользуешься Colorer for Openconf

    О, спасибо, как-то пропустил эту штуку, а удобно дюже.

    Reply
  6. Иероглиф

    Пока нашел для чего она нужна, вообще мозги начали кипеть — штука полезная для жесткого контроля прав, но просьба, всё таки сначала описывать назначение — желательно небольшим доступным текстом, а потом уже раскрывать как и куда оно подключается и встраивается, честное слово было желание закрыть и не читать дальше и выяснять что это и к чему привязывается, а это 80 % потери потенциальных клиентов.

    Reply
  7. venger

    (6) Описание читайте, там написано:

    Если в двух словах…

    И пошло описание подсистем вкратце, подробнее — приведены ссылки. Тем более, не только за правами контроль, а и возможность прикреплять файлы к любым документам, а это удобно для бухов для первички…. Т.е. оригиналы-сканы доков с печатями и подписями можно хранить, всякие свифты и т.д. в доках можно хранить….

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

    Reply
  8. Иероглиф

    Сударь я всё понимаю конечно — но мне лично приходит расслыка в которой указано «Подсистема рассчитана на установку и работу в любой конфигурации, установка требует минимальных изменений в конфигурации, прописать пару строк в глобальном модуле и объединить с md’шкой (добавляется несколько объектов), подробнее см. описание установки. В дальнейшем, после установки в какую-либо конфигурацию, если обновлять эту конфигурацию типовыми обновлениями, то нужно будет только прописать заново эти пару строк в глобальном модуле, после обновления, и все.

    «Фабрика событий» делалась для объединения и совместной работы в одной конфигурации двух подсистем «Доп. права доков» v 2.0 » — честно слово желания открывать и смотреть а что там такое, небыло никакого. Извините, я должен телепатическими данными обладать что бы разгадать гениальность творения ?:)

    Reply
  9. venger

    (8)

    я должен телепатическими данными обладать

    Было бы неплохо, я про рассылку особо и не подумал, счас поправлю.

    Reply
  10. Иероглиф

    Видимо Вы так и не поняли о чем я говарю, ваше право как преподносить, но товар сначало показывают лицом, мне это напомнило как какой нить знакомый дает свою рекомендацию о новой книге или фильме — сначало идут 5 минут выплескивания эмоций вау хоу это круто это вынос мозга и так далее таких выплесков минут 5 утонуть можно — пока дождешься.. а о чем собствено произведение то, так и хочется скотчем рот залепить и как в том анекдоте — ты не умничай — пальцем покажи ?… 🙂 я же написал вещь полезная, но до сути и предназначения пока дойдешь — пропадает желание смотреть а что это вообще.

    Reply
  11. venger

    (8) Так лучше (на Ваш взгляд)? Если не видите изменений, то нажмите справа в меню ссылку «Очистить кеш публикации (beta)».

    Reply
  12. Иероглиф

    Извините если я несколько сам пережал с эмоциями:) обидеть не хотел — дейсвтительно замечательная и полезная обработка, желаю дальнейших успехов 🙂

    Reply
  13. venger

    (10) Я понял и, кстати, очень открыт в этом плане для советов, ведь это в моих же интересах….

    Reply
  14. venger

    (12) Так давайте, говорите, оно со стороны виднее, как понятней описать. Я не против, мне сложно просто со стороны оценить качество описания….

    Reply
  15. Иероглиф

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

    Reply
  16. CheBurator

    Чувствую, придется внедрить у себя.. посмотрим что там будет…

    Reply
  17. venger

    (16)

    придется внедрить у себя..

    Когда внедрял, обновлял dll’ки, столкнулся:

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

    З.Ы. Документированный баг восстановления настроек из реестра при обновлении старых версий dll’к

    http://www.1cpp.ru/bugs/show_bug.cgi?id=4427

    Reply
  18. Борода

    Если в стандартной процедуре записи элемента справочника указан параметр список периодических ( ПриЗаписи(СписПер) ) то выдаёт ошибку.

    Reply
  19. venger

    (18) Поправил, перезалил, попробуйте скачать заново. Изменился только код обработки класса фабрики событий, так что если она у Вас уже стоит в базе, то обновить можно только ее при установке md’шки поверх старой версии….

    Reply
  20. venger

    (0) Поправил класс «Фабрика событий» — вызов оригинальных событий…

    Reply
  21. fastwriter

    Хотя formex у меня глючил, плюс поставлю за высокий профессиональный уровень данного решения.

    Reply
  22. necros

    Скачал фабрику в демо конфе все работает, а вот когда обьеденил выдает

    __КлассФабрикаСобытий__=СоздатьОбъект(«__КлассФабрикаСобытий__»);

    {Глобальный модуль(4017)}: Неудачная попытка создания объекта (__КлассФабрикаСобытий__)??? Что может быть??

    Reply
  23. venger

    (22) В обработке defcls класс фабрики объявлен?

    Reply
  24. necros

    Да я уже разобрался. У меня в каталоге базы лежал пустой defcls.prm база из за него ругалась. Как убрал все заработало

    Reply
  25. CheBurator

    когда будет подсистема «сканы справочников»?

    Reply
  26. adverka

    спасибо

    Reply
  27. venger

    (25) Ой, Че, извини, что так ее и не сделал, руки не дошли:-) Но в планах есть, хотя и не приоритет… Оч туго со временем в последнее время, просто:-)

    Reply
  28. selesta

    по части сканов доков: при открытии документа в момент программного формирования слоязакладки Сканы проиходит мельканиемигание экрана, то есть визуально чувствуется процесс и создается впечатление глючности. Переделал этот процесс вместо ПослеОткрытия на ПослеСозданияФормы и все стало чудненько, визуальных эффектов нет. Автору на заметку для следующей версии)) Переделал на хранение вложений в MQ SQL базе, сейчас последние тестирования и до апреля запуск в работу, если интересно могу выложить. Автору спасибо за отличную работу!

    Reply
  29. an_2

    (25) CheBurator,

    А надо?

    У меня есть универсальная (сканы всего:) ) сделано но основе этой разработки

    Reply
  30. venger

    (29) Если решишь выложить в свободный доступ — я не против, если что….

    Reply
  31. v_id

    Подключил по инструкцию подсистему доп. права пользователей.

    Появилась такая проблема, при вводе новых документов ранее даты запрета редактирования программа хоть и ругается, что нельзя создавать, но все равно дает записывать документ. Как я понимаю это из-за перехватчика событий ПриЗаписи()? Что-то можно с этим сделать?

    Reply
  32. undo

    Использовал перехватчик предопределённых событий очень давно, тогда или из неверной реализации или по какой другой причине сыпались часто глюки и были пропуски. Сейчас попробую реализовать заново, т.к. есть действующий пример. Спасибо за реализацию.

    Reply
  33. ToJIuK

    Вопрос такой . При интеграции данной подсистемы(Конкретнее меня интересует «Скан документов»),на сколько я понял, вкладка Сканы создается для всех документов. А можно ли Указать список документов для который это нужно . а не для всех .

    Reply
  34. selesta

    можно конечно

    я делал так:

    в файле __КлассПодсистемыСканыДоков__.ert

    Функция Событие_ПослеСозданияФормы() Экспорт
    Перем СпДокументов;
    
    // ограничим по видам документов
    СпДокументов = СоздатьОбъект(«СписокЗначений»);
    СпДокументов.ДобавитьЗначение(«Договор»);
    СпДокументов.ДобавитьЗначение(«Уведомление»);
    СпДокументов.ДобавитьЗначение(«Дело»);
    // ограничим по видам документов
    
    КонтОбъекта = GetThis(Контекст).ПолучитьКонтекстОкружения();
    Если ТипЗначенияСтр(КонтОбъекта) <> «ГрупповойКонтекст» Тогда
    Если ТипЗначенияСтр(КонтФормы) = «ГрупповойКонтекст» Тогда
    КонтОбъекта= КонтФормы;
    Иначе
    Возврат 1;
    КонецЕсли;
    КонецЕсли;
    
    Попытка
    ТекДок = КонтОбъекта.ТекущийДокумент();
    Если ТипЗначения(ТекДок)<>12 Тогда // Тип =12 — Документ
    Возврат 1;
    КонецЕсли;
    // проверка вида документа
    Если СпДокументов.Принадлежит(ТекДок.Вид()) = 0 Тогда
    Возврат 1;
    КонецЕсли;
    // проверка вида документа
    Исключение
    Возврат 1;
    КонецПопытки;
    
    ФормаРасш = СоздатьОбъект(«РасширениеФормы»);
    ФормаРасш.УстановитьФорму(КонтОбъекта.Форма);
    // дальше по тексту……..
    

    Показать

    Reply
  35. nexochyka

    Спасибо

    Reply
  36. antares2010

    Всё сделал как написано, но вкладки Сканы в Документах нет. И возможно ли такую вкладку ещё добавить к справочникам? В частности меня интересует справочник номенклатура.

    Reply
  37. venger

    (36)

    Всё сделал как написано, но вкладки Сканы в Документах нет.

    А в демо-базе, что идет тут, есть вкладка?

    И возможно ли такую вкладку ещё добавить к справочникам?

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

    Reply
  38. antares2010

    Проверил в демо-базе тоже нету

    Reply

Leave a Comment

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