Универсальный отчет "[П]: Контрагенты & Контакты" [УТ, УПП, КА]




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

39 Comments

  1. ZLENKO

    Данная методика получения контактной информации используется:

    [Z]: Анализ Продаж.PRO [1С:8.2] [УниверсальныйОтчет]

    http://infostart.ru/public/176720/

    Reply
  2. Поручик

    код открыт? если да, завтра скачаю и плюсану.

    Reply
  3. ZLENKO

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

    Reply
  4. ATE

    При формировании пишет {ВнешнийОтчет.ОтчетПоКлиентамКИ(452)}: Слишком много фактических параметров

    УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокум

    Reply
  5. ZLENKO

    (4) Укажите какая у Вас конфигурация и номер ее релиза.

    Reply
  6. RPV

    Для БП 1.6 такую можно сделать?

    Reply
  7. ZLENKO

    (6) Не знаю — не интересовался.

    Reply
  8. ATE

    УПП 8.1.12 редакция 1.2

    Reply
  9. ZLENKO

    (8) УПП 1.2 — укажите точнее релиз. Возможно несколько изменился вызов метода по сравнению со старыми версиями.

    Reply
  10. Поручик

    (9)

    >>> Таким способом можно доработать и другие отчеты в которых участвуют контрагенты. Это не просто — это очень просто

    Спасибо, надоумили. Сходу несколько отчётов пофиксил.

    Выводы: век живи, век учись.

    Reply
  11. ATE

    УПП релиз 1.2.9

    Reply
  12. ZLENKO

    (11) На УПП 1.2.16 работает. Более младшего релиза у меня нет «под рукой».

    Reply
  13. ZLENKO

    (11) Попробуйте изменить вот так:

    Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт

    // Перед формирование отчета можно установить необходимые параметры универсального отчета.

    Параметры = УниверсальныйОтчет.ПостроительОтчета.Параметры;

    Параметры.Вставить( «ТоварКупленный», Перечисления.СтатусыПартийТоваров.Купленный);

    УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент);

    КонецПроцедуры // СформироватьОтчет()

    Reply
  14. ZLENKO

    (13) Внес изменения в файл отчета для работы на «старых» версиях УПП 1.2.

    Reply
  15. csmail

    Все равно молодец!!!

    Reply
  16. voler

    в конфе 10,31,1,17 не такой возможности куда капать?

    Reply
  17. voler

    Может что нужно дополнительно настроить?

    Reply
  18. voler


    Reply
  19. voler

    http://s06.radikal.ru/i179/0908/bb/b7b931d00c33.gif

    http://s56.radikal.ru/i154/0908/ef/1bf2dedfd270.gif

    Два верхних поста можно удалить, прошу прощение.

    Reply
  20. alexpa2005

    В большинстве фирм клиентская база является коммерческой тайной, поэтому вывод на печать контактных данных в типовых конфигурациях отсутствует. Ведь пользоваться отчетом будут менеджеры (руководству контактная информация, как правило, не нужна, максимум город или район), которые имеют свойство плавно перетекать из одной фирмы в другую, сходную по профилю. А с таким отчетом появляется возможность перейти вместе с клиентской базой. Конечно, всегда есть возможность переписать данные клиентов в тетрадку, ведь справочник клиентов открыт, но если клиентов несколько сотен, то задача по переписыванию становится не тривиальной. Так что с управленческой точки зрения подобные отчеты являются вредымим, или, если хотите, политически ощибочными.

    А с технической точки зрения молодец.

    Reply
  21. Поручик

    (20)

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

    А ничего, что в типовой УТ, УПП есть отчёт о контактной информации, где вся клиенсткая база как на ладони.

    Reply
  22. ZLENKO

    (19) Возьмите отчет «УниверсальныйОтчет» из последних релизов конфигурации.

    Reply
  23. ZLENKO

    (20) 1. Политической ошибкой является то, что клиент работает (в «широком» смысле) с конкретным менеджером, а не с компанией в целом.

    2. Просто так клиенты не «уходят».

    3. Менеджеры и так наизусть знают своих лучших клиентов, а «плохих» нет смысла «уводить».

    Reply
  24. voler

    (22)А у вас есть возможность его сюда выложить?

    Reply
  25. ZLENKO

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

    Reply
  26. italmix

    Отличный отчет, главное нужный! Однозначно плюсую!

    Reply
  27. nikk

    Спасибо большое! Мне очень помогло.

    Кстати, на Российской Комплексной 8.2 ваш отчет тоже работает.

    Reply
  28. dav405

    Моджно еще так :

    Процедура ВставитьТегВТекстЗапроса(пТекстЗапроса,пОригинал,пДобавка)

    пТекстЗапроса=СтрЗаменить(пТекстзапроса,пОригинал,пОригинал+»

    |»+пДобавка+»

    |»);

    Конецпроцедуры

    Потом, в Отчет.УстановитьНачальныеНастройки

    //Д

    лТекст=УниверсальныйОтчет.ПостроительОтчета.Текст;

    ВставитьТегВТекстЗапроса(лТекст,»//ПОЛЯ_СВОЙСТВА»,»//ПОЛЯ_КОНТАКТНАЯИНФОРМАЦИЯ»);

    ВставитьТегВТекстЗапроса(лТекст,»//ПСЕВДОНИМЫ_СВОЙСТВА»,»//ПСЕВДОНИМЫ_КОНТАКТНАЯИНФОРМАЦИЯ»);

    ВставитьТегВТекстЗапроса(лТекст,»//СОЕДИНЕНИЯ»,»//КОНТАКТНАЯИНФОРМАЦИЯ_СОЕДИНЕНИЯ»);

    ВставитьТегВТекстЗапроса(лТекст,»//УСЛОВИЯ_СВОЙСТВА»,»//УСЛОВИЯ_КОНТАКТНАЯИНФОРМАЦИЯ»);

    ВставитьТегВТекстЗапроса(лТекст,»//ИТОГИ_СВОЙСТВА»,»//ИТОГИ_КОНТАКТНАЯИНФОРМАЦИЯ»);

    УниверсальныйОтчет.ДобавитьКонтактнуюИнформацияДляПоля(«Контрагент», «Контрагент», «КиКонтрагент», Перечисления.ВидыОбъектовКонтактнойИнформации.Контрагенты, «Справочник.Контрагенты»);

    //УниверсальныйОтчет.ДобавитьКонтактнуюИнформацияДляПоля(«ЗапросПоВзаиморасчетам.Контрагент.ОсновноеКонтактноеЛицо», «ОсновноеКонтактноеЛицо», «ОсновноеКонтактноеЛицо», Перечисления.ВидыОбъектовКонтактнойИнформации.КонтактныеЛицаКонтрагентов, «Справочник.КонтактныеЛица»);

    УниверсальныйОтчет.ДобавитьВТекстЗапросаКонтактнуюИнформацию(лТекст);

    УниверсальныйОтчет.ПостроительОтчета.Текст=лТекст;

    Reply
  29. ivan07

    Спасибо. Пригодилось

    Reply
  30. baralgin1003

    пригодилось, но в чуть другом виде))если автор не против, взял код и вставил в обработочку посерьезнее. а так все отлично! автору плюс и спасибо!

    Reply
  31. wwpp

    Очень полезная обработка. Спасибо!!! удивился, что нет стандартных отчетов

    Reply
  32. ZLENKO

    В версии для 8.2 решена проблема с группировкой по контактной информации (поле неограниченной длины).

    Reply
  33. ZLENKO

    Исходный код открыт! Пользуйтесь и получайте удовольствие 🙂

    Reply
  34. ZLENKO

    (39) Видимо это комментарий к этому отчету http://infostart.ru/public/117647/ ?

    Reply
  35. Proger2008

    Скачал, деньги снялись, отчет не открывается в УТ 11.1.9.56 — на «сформировать» выводится «не установлена схема компоновки данных», что делать ?

    Reply
  36. AlbertZ

    Отчет не работает на Ут 11.1.4.14, пустой, ошибка — «не установлена схема компоновки данных»

    Reply
  37. ZLENKO

    (42) AlbertZ, «Отчет не работает на Ут 11.1.4.14»

    Отчет не работает на Ут 11.1, только на УТ 10.3, УПП 1.3, КА

    Reply
  38. Starting

    Добрый день!

    Подскажите, этот отчёт будет работать в Комплексной Автоматизации 1.1.32.?

    Reply
  39. skyvixen

    Коллеги, как сделать, чтобы контактная инфа не выводилась в строке группы клиентов (на скриншоте это строки «Покупатели» и «Поставщики» — в них выводятся номера телефонов)? Предполагаю, что можно решить условным оформлением в расширенной настройке. Кто может подсказать?

    Reply

Leave a Comment

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