Как раскрасить контрагентов в отчетах за 15 минут




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

26 Comments

  1. kompas-dm

    Аккуратно и доходчиво для многих разработчиков. Однозначно +

    Reply
  2. Ёпрст

    Такая раскраска отчетов подходит только для укр конф.

    В российских всё обезличено в отчете.

    Reply
  3. venger

    (2) В смысле обезличено?

    Reply
  4. kompas-dm

    (2) Приехали…, причем здесь конкретная конфа м раскраска ❓

    Reply
  5. brr

    Для выбора цвета не обязательно использовать внешнюю компоненту. Перейти к форме Контрагента по двойному клику по ячейке теперь не удастся. Единственно где оправдано применение формекса в этом примере — список элементов справочника.

    Reply
  6. Ёпрст

    (3) тем, что нет в ней Запрос.Контрагент в выражении, тем , что не можешь ты просто так написать в расшифровку ФункцияРасшифровки(ТЗ, траляля).

    Все группировки выводятся динамически.

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

    (4) Прежде чем писать, думай хоть иногда.

    Тем, что приведена методика для конкретной конфы.

    Reply
  7. Ёпрст

    +6 но техническая реализация в даном примере — это вообще семечки, по сравнению с главной проблемой — «ручной» раскраской клиентосов.

    Представляю себе картину — сидит девочка и каждый день «руктями красит» элементы справочника — васю..

    Reply
  8. venger

    (5) > Перейти к форме Контрагента по двойному клику по ячейке теперь не удастся.

    Кто тебе такую глупость сказал? Посмотри что функция глЗаписатьСтрокуТзРаскраскиТаблиц возвращает.

    (6) > И тебе придётся, как минимум, красить нужную ячейку после вывода секции

    Ты, по моему, не внимательно читаешь, после вывода секции и раскрашивается, по сути. А определение типа идет автоматом, попытка-исключение в функции глЗаписатьСтрокуТзРаскраскиТаблиц для этого и существует.

    (7) > по сравнению с главной проблемой — «ручной» раскраской клиентосов

    И нафига в описании идеи описывать добавление действия установки цвета в групповую обработку контрагентов? Я ж писал, что в центре внимание идея «малой кровью» раскрасить таблицы отчетов, а не долгая нудная статья, как я еще то дописал и это. А давай еще будем говорить, что хотелось бы фильтры в отчетах по цветам тоже сделать, кто ж мешает, я описал идею раскраски табличных форм, причем, если внимательно вникнешь, учитывающую все Ваши «поверхностные замечания», а развивать удобство использования цвета в базе уже можно сколько угодно, никто ж не мешает.

    Опять же, можно раскрашивать не цвет текста, а фон, а можно и то и другое, естественно тогда функционал можно развить дальше, можно ввести еще не ракраску всей строки, а ввести в глЗаписатьСтрокуТзРаскраскиТаблиц еще параметр номер столбца и формировать адрес области — одну ячейку, у меня в реальной базе так, чтобы раскрашивалась только ячейка, а не вся строка.

    В общем, вникайте внимательно, прежде чем … «говорить»;-)

    Reply
  9. brr

    (8) Сорри ошибся.

    Reply
  10. venger

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

    В общем, не комильфо.

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

    Стареете, господа;-)

    Reply
  11. Ёпрст

    (8) Ты типовые конфы видел вообще в глаза когда нить ?

    Россейские ?

    Там не получится запихать в ячейку свою расшифровку.

    Reply
  12. venger

    (11) Я могу развернуть сейчас, но давай проще, что в расшифровке идет там? Сразу сейчас и выясним, если в российских не пройдет, то я без проблем напишу, что это только для украинских.

    Reply
  13. Ёпрст

    (9) Ну -ну.. у нас в базе > 5000 предлагаешь руками менять это поле ?

    + что считать долгом , если у клиентоса есть отсрочка платежа ?

    Это ка минимум, определение текущего долга в данный момент времени, как максимум — определение только просроченного долга, ибо именно его клиентос должен оплатить в данный момент.

    Да и техническая реализация через Расшифровку, да еще и в ТЗ скидывать — это вообще прошлый век.

    Когда достаточно было написать так, и привет :

    Таб.ВывестиСекцию(….)
    Если <условие> Тогда
    Таб.Область(Таб.ВысотаТаблицы(),1,Таб.ВысотаТаблицы(),1).Цвет(<нужный>);
    КонецЕсли
    Reply
  14. venger

    (13) > Ну -ну.. у нас в базе > 5000 предлагаешь руками менять это поле ?

    Я предлагаю определять цвет контрагента (хранить ли в поле или каким-либо другим способом) так, как необходимо и удобно в каждом конкретном случае, иначе у тебя получается, что и раскраска списков FormEx’сом бесполезна;-) Я предлагаю способ раскраски отчетов, а не способ хранения цвета;-)

    (13) > Да и техническая реализация через Расшифровку, да еще и в ТЗ скидывать — это вообще прошлый век.

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

    Да еще выискивать кто и где там контрагент, чтобы тоже условие прописать и т.д. и т.п., проделывать кучу действий в каждом отчете, если я сразу перешел на таблицу отчета и проставил в паре ячеек (а обычно вообще в одной) расшифровку и вперед? Т.е. с каждым отчетом проделываются однотипные простые и понятные действия и вникать в код отчета мне не нужно, что проще и удобней мне как разработчику в данном случае, так что прошлый век — это преждевременно;-)

    Reply
  15. Ёпрст
    venger пишет:

    иначе у тебя получается, что и раскраска списков FormEx’сом бесполезн

    Еще бы!

    Такое разделение клиентосов (по долгам) в таком виде — это полный пэ..

    Нужно автоматизировать, а не лишнюю работу кому-то скидывать.

    Вот у тебя, кто будет раскрашивать клиентосов ?

    :)))

    Reply
  16. venger

    (15) У меня все проще, раскрашивать планируют только небольшое кол-во, относительно общей массы, и по особому указанию сверху;-) А раскрашивать будут менеджера отвечающие за свои группы контрагентов. Т.е. тут скорее «выделение» некоторых контрагентов из общей массы будет, чем тотальная раскраска всех.

    Reply
  17. ips

    Господа! Если есть желание — помогите решить подобную задачу. Мне необходимо при подборе товара выделить цветом ячейку с остатками, чтобы, например, видеть нулевой остаток красным цветом и т.д. Буду очень признателен за помощь. В программировании я пока не спец, но кое-что под себя уже «заточил» в формах и отчётах.

    Reply
  18. gilant

    Всё замечательно!

    А как прописать в форме диалогов документов, раскрашивание строк с цветноштанным контрагентом?

    Reply
  19. gilant

    Не дождался ответа,сам разобрался.

    Reply
  20. venger

    (19) Прально сделал;-)

    З.Ы. Только вернулся с Карпат, вот и молчал по этому…

    Reply
  21. ivanbonus

    Радость от установки была не долгой, всё хорошо работало устраивало и так далее, но после включения в рабочую базу терминал 25 пользователей стала вылетать такая надпись a required resource was unavailable и делался корявый интерфейс окон 1с пока не закроешь её и не зайдешь заново, может автор в курсе сей проблемы.

    Reply
  22. venger

    (21) А внешние компоненты свежие? Возможно там лежат старые? И при каких действиях/событиях это происходит?

    Reply
  23. lafaaadka

    А такое есть для 8ки? УТ мне надо расскрасить отчет по поставщикам.

    Reply
  24. Veduin

    Ну всеравно давольно таки интересный метод используется!

    Reply
  25. formula76

    Спасибо! Очень доходчиво!

    Reply
  26. marshal

    Респект автору!

    Reply

Leave a Comment

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