Класс "ПоставщикДанных"




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

34 Comments

  1. artbear

    Отличный класс!

    Reply
  2. vandalsvq

    (1) Спасибо. 🙂

    Reply
  3. Ёпрст

    Как то ты его здесь поздно выложил..

    Его популярность и так далеко вперёд ушла..

    Reply
  4. Ёпрст

    Как то ты его поздновато здесь выложил..

    Он уже и так раскручен 🙂

    Reply
  5. Свой

    в ДБФ базе это работает ?

    Reply
  6. Ёпрст

    (5) конечно

    Reply
  7. vandalsvq

    (3)(4)

    Да все руки не доходили. Я даже ПрямойЗапрос тут обновить все никак не мог. К тому же нормального примера не было. В общем так по мелочи все мешало «выйти в люди».

    Reply
  8. CheBurator

    (7) спасибо. давно уже присматриваюсь. ибо как раз такие задачи — забодался строить всякие конструкторы условий/фильтров на основе отображения в ТЗ.

    Reply
  9. _also

    Автору огромный респект, на прошлой работе написал конфу с его ипользованием. Отдельное спасибо за такую документацию 🙂

    Присоединяюсь к (3)

    Reply
  10. _also

    +(9) Да..и за прямой запрос спасибо 🙂

    Reply
  11. Широкий

    Выглядит прикольно

    Reply
  12. serpent

    Подскажите что я сделал не так с тестовым примером???

    Класс: УправлениеФормой.Привязка — ошибка синтаксиса

    Строка №275 Право <<?>>= Лево + Ширина;

    Ожидается скалярное выражение (Право)

    {C:йййSystemDataClassesУправлениеФормойУправлениеФормой.Привязка.ert(275) }

    Класс: УправлениеФормой.Привязка — ошибка синтаксиса

    Строка №277 Расстояние = ЛевоС-Право<<?>>;

    Ожидается скалярное выражение (Право)

    {C:йййSystemDataClassesУправлениеФормойУправлениеФормой.Привязка.ert(277) }

    Класс: УправлениеФормой.Привязка Файл: C:йййSystemDataClassesУправлениеФормойУправлениеФормой.Привязка.ert компиляция не выполнена!

    УправлениеФормой::Конструктор() : Внимание! Инициализация класса: УправлениеФормой.Привязка закончилась неудачно!

    ПривязкаЭлементов = СоздатьОбъект(«УправлениеФормой.Привязка»);

    {C:йййSystemDataClassesУправлениеФормойУправлениеФормой.ert(31) }

    УправлениеФормой = СоздатьОбъект(«УправлениеФормой»);

    {C:йййСПРАВОЧНИК КОНТРАГЕНТЫ.ERT(160)}: УправлениеФормой::Конструктор() : Внимание! Инициализация класса: УправлениеФормой.Привязка закончилась неудачно!

    ПривязкаЭлементов = СоздатьОбъект(«УправлениеФормой.Привязка»);

    {C:йййSystemDataClassesУправлениеФормойУправлениеФормой.ert(31) }

    Reply
  13. Porshivec

    Подскажите пожалуйста! Как в документ Реализация добавить строку процент наценки(1С Торговля и склад ред. 9.2)? Чтобы его не было видно в накладной. Заранее спасибо.

    Reply
  14. CheBurator

    Взял сабж с ИС.

    вроде выполнил все что описано в инструкции по установке.

    При запуске обработки:

    .

    ПоставщикДанных.КоманднаяПанель::УстановитьНаборПиктограмм(Картинка Пиктограммы=, Число Ширина=16, Число Высота=16, Число Количество=26) : Неудачная попытка создания объекта

    КартинкиПанелиУправления = СоздатьОбъект(«MSComctlLib.ImageListCtrl»);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.КоманднаяПанель.ert(330) }

    ПоставщикДанных.ТабличноеПоле::Конструктор() : ПоставщикДанных.КоманднаяПанель::УстановитьНаборПиктограмм(Картинка Пиктограммы=, Число Ширина=16, Число Высота=16, Число Количество=26) : Неудачная попытка создания объекта

    КартинкиПанелиУправления = СоздатьОбъект(«MSComctlLib.ImageListCtrl»);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.КоманднаяПанель.ert(330) }

    КоманднаяПанель.УстановитьНаборПиктограмм(Сервис.КартинкаКоманднойПанели,16,16,26);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.ТабличноеПоле.ert(76) }

    ПоставщикДанных::ПриЗаписи_ТипЗначений(Строка Параметр=Справочник.Контрагенты) : ПоставщикДанных.ТабличноеПоле::Конструктор() : ПоставщикДанных.КоманднаяПанель::УстановитьНаборПиктограмм(Картинка Пиктограммы=, Число Ширина=16, Число Высота=16, Число Количество=26) : Неудачная попытка создания объекта

    КартинкиПанелиУправления = СоздатьОбъект(«MSComctlLib.ImageListCtrl»);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.КоманднаяПанель.ert(330) }

    КоманднаяПанель.УстановитьНаборПиктограмм(Сервис.КартинкаКоманднойПанели,16,16,26);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.ТабличноеПоле.ert(76) }

    ПоставщикДанных = СоздатьОбъект(«ПоставщикДанных.Справочник»);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.ert(87) }

    ПоставщикДанныхМногострочнаяЧасть.ТипЗначений = «Справочник.Контрагенты»;

    {C:ПРИМЕР ДЛЯ КОНФИГУРАЦИИ БУХГАЛТЕРИЯСПРАВОЧНИК КОНТРАГЕНТЫ.ERT(20)}: ПоставщикДанных::ПриЗаписи_ТипЗначений(Строка Параметр=Справочник.Контрагенты) : ПоставщикДанных.ТабличноеПоле::Конструктор() : ПоставщикДанных.КоманднаяПанель::УстановитьНаборПиктограмм(Картинка Пиктограммы=, Число Ширина=16, Число Высота=16, Число Количество=26) : Неудачная попытка создания объекта

    КартинкиПанелиУправления = СоздатьОбъект(«MSComctlLib.ImageListCtrl»);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.КоманднаяПанель.ert(330) }

    КоманднаяПанель.УстановитьНаборПиктограмм(Сервис.КартинкаКоманднойПанели,16,16,26);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.ТабличноеПоле.ert(76) }

    ПоставщикДанных = СоздатьОбъект(«ПоставщикДанных.Справочник»);

    {G:\_DEMODEMO_BUH.DIRSystemDataClassesПоставщикДанныхПоставщикДанных.ert(87) }

    Reply
  15. CheBurator

    как всегда, выложено «неработающее», с неполными инструкциями… 😉

    .

    в помощь при ошибке

    http://www.forum.mista.ru/topic.php?id=298024

    качаем http://www.dll.ru/dll/4410.html — comdlg32.ocx

    http://www.microsoft.com/downloads/details.aspx?FamilyID=25437d98-51d0-41c1-bb14-64662f5f62fe&DisplayLang=en — устанавливаем

    .

    Автору: представляется целесообразным включить в инструкцию

    Reply
  16. vandalsvq

    (14)(15)

    А я забыл написать что «Not all batteries are included»? 😀

    А вообще-то я в документации писал

    «объект «КоманднаяПанель» реализуется при помощи ActiveX – “MSComctlLib.Toolbar.2” (данная библиотека устанавливается с пакетом MS Office после установки сам Microsoft Office можно удалить, библиотека при этом останется)».

    Коммон контролы вроде проблемы не решит, не знаю. Да и чтобы их использовать надо иметь лицензию. Так что я не хочу включать в документацию данные ссылки. Но как информацию обязательно тут пусть остается.

    Только просьба, подчисти текст ошибки и сформулируй ее в «двух словах». Не люблю массивы кода когда на самом деле там ошибка на две строки.

    Reply
  17. quick

    Так вот ты какой, цветочек аленький! 🙂

    Reply
  18. Dolly_EV

    (1) Это уже наверное не просто класс — это целая идеология! 😎

    Reply
  19. orefkov

    У меня такое ощущение, что CheBurator всегда все проверяет на «голой» машине. Наверное у него для вмваре создан образ — поставлена винда по минимуму + 1С. И каждую поделку он сначала в нем прогоняет.

    Reply
  20. vandalsvq

    (19) кстати хороший вариант 😀

    Reply
  21. freek

    Отлично

    Reply
  22. smitti911

    Отличная работа !!!

    Reply
  23. vandalsvq

    Следите за новостями. В ближайшем будущем будет значительное обновление.

    Открою немного занавес: кто видел 8.2 управляемое приложение, ну или СКД, тот знает что там можно накладывать сгруппированные условия. Так вот, аналогичная возможность появится и в данном классе. Таким образом уровень возможностей местами не только приблизился вплотную к 8.х, но где-то даже превзошел ее. 🙂

    Reply
  24. andrey314

    а есть возможность в табличном поле отображать данные внешних источников данных через ODBC?

    Reply
  25. vandalsvq

    (24) andrey314, вот почитай тут. Сам поставщик данных не адаптирован под произвольный запрос, но непосредственно ТП можно использовать. Читать тут — http://www.1cpp.ru/docum/html/TableField.html#odbc-odbcdataprovider. Также можно выполнять запрос, выкидывать в таблицу значений и ее уже через поставщик использовать. Если конечно нужна его «инфраструктура».

    Reply
  26. CheBurator

    (23) а где вариант сабжа со «значительным обновлением»…?

    Reply
  27. vandalsvq
    Reply
  28. wenzor

    А где сейчас можно взять версию 5.0.5? На форуме 1срр.ru файлов нет — удалили что ли все….

    Reply
  29. vandalsvq

    (28) wenzor, все обновления лежат в теме здесь

    Reply
  30. wenzor

    Вот что я вижу: Attachment deleted. Может нужно залогиниться, но мне не приходит письмо с подтверждением (вчера зарегистрировался). Вобщем перерыл весь интернет и нигде нет 🙂

    Кстати сказать, скачал отсюда 4-ю версию, почитал документацию и впечатлился. Вы проделали огромную работу! Я делал нечто подобное. Но чтобы так подробно как Вы….просто нет слов 🙂

    Reply
  31. vandalsvq

    (30) wenzor, файл во вложении, пользуйтесь на здоровье

    Reply
  32. Mikeware

    Пытаюсь запустить на машине с Win7/64.

    Ошибка при создании объекта ОбъектImageListCtrl = СоздатьОбъект(«MSComctlLib.ImageListCtrl»);

    Офис стоит 2010-й,

    дополнительно comdlg32.ocx и MSCOMCTL.OCX поставил и зарегистрировал. Не помогло.

    В реестре MSComctlLib.ImageListCtrl присутствует. Права на чтение вроде есть — ругани в Процмоне не вижу.

    Что я не так делаю, и что сделать?

    Reply
  33. vandalsvq

    (32), Советую обратиться на форум 1c++. У меня уже 7-ки пару лет как вообще не стоит, подзабылись нюансы.

    Заранее прошу прощения, что не могу оказать помощь.

    Reply
  34. Mikeware

    (33) спасибо за ответ. там как-то тоже все мертво…

    клюшки отживают свой век…

    Reply

Leave a Comment

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