Дополнительные «уникальные» итоги. Реализация в СКД.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

14 Comments

  1. Ekovichev

    Здравствуйте. Вы бы выложили пример еще реализации

    Reply
  2. graZy

    (1) Ekovichev,

    ок.

    Сделал простой пример для БП 2.0 (см.файл).

    Отображаем справочник «Номенклатур», считаем Количество и Итог.

    Дополнительно отображаем Итог который отображает количество «Групп» (назван «Да» — но это детали потому как на скорую руку лепил)

    Пояснения к реализации .

    1. В запросе «Набора Данных» должно быть поле для дальнейшей группировки (Номенклатура.ЭтоГруппа)

    2. В настройках макета к строкам добавляем группировку по полю (ЭтоГруппа)

    3. Для ЭтоГруппа настраиваем отбор (ЭтоГруппа = Истина)

    4. Для ЭтоГруппа в настройках (см. другие настройки) отключаем …

    картинки если нужны может позже …

    Reply
  3. husky

    Добрый вечер! Подскажите, а как в такой таблице вывести в самый низ строку «Нарастающий итог», чтобы показывала в первой колонке первую сумму, во второй 1+2, в третьей 1+2+3 и т.д.? Заранее спасибо. Очень нужна подобная реализация, сам пробовал никак не получается (

    Reply
  4. Bienko

    (3) husky, там есть функция ВычислитьВыражение

    Пример:

    Если требуется рассчитать сумму с накоплением, то можно использовать следующее выражение:

    ВычислитьВыражение(“Сумма(СуммаОборот)”, , , “Первая”, “Текущая”)

    Reply
  5. Ekovichev

    (2)

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

    Reply
  6. husky

    (4) Bienko, она хорошо работает на строках (группировках и т.д.), но как сделать чтобы ресурсная колонка былабы с итогом внизу нарастающим?

    Reply
  7. Bienko

    (6) husky, кинь свой отчет на скд и файл в экселе как ты его хочешь видеть, плюс напиши для какой базы.

    Reply
  8. graZy

    (5) Ekovichev, спасибо, просто мне стыдно такой отчет (что прикрепил выше) крепить к публикации ))) он просто мини демонстратор.

    😉 сама идея была накопана для другого отчета, но его сюда не впихнуть )))

    Reply
  9. graZy

    (3) husky, похоже это ты про то (ну очень близко) на что я сам ответ ищу …

    http://forum.infostart.ru/forum86/topic126553/

    как пишут выход запрос (я бы рекомендовал этот подход, ну или программно считать)

    другого решения я пока не видел (((

    кто найдет пишите

    Reply
  10. graZy

    (6) husky,

    несколько колонок, и нужно чтобы под одним итогом получился другой (но с нарастающими) думаю прокатит

    1. нужно рассчитать нарастающие (это через запрос перекрестив таблицу, с собой же)

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

    3. При настройках делаем группировку по «флажку» и ограничеваем вывод только «данных» (выводим включая деталку)

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

    вроде должно получиться (примера нет, но если пришлешь черновик — допилю и выложу)

    Reply
  11. fomix

    (2) Приложенный отчет — пустышка, в которой нет того о чем пишет в комментах автор! Попробовал наваять что-то подобное. Сделано для 1С:Бухгалтерия предприятия, редакция 3.0. Не показывает отдельно ИТОГОВ по выделенной группе. Что не так сделал?!

    Reply
  12. graZy

    (12) fomix,

    про ваш файл

    если вы задаете (как доп группу по которой ограничиваем):

    ВЫБОР

    КОГДА ПоступлениеТоваровУслугТовары.Номенклатура.Родитель = &ГруппаУслуги

    ТОГДА «Услуга»

    ИНАЧЕ «Товар»

    КОНЕЦ КАК ГруппаУслуги

    то …

    в «настройки» (закладка) для «Группа Услуги» должны задать выражение ??? (пункт 3) а у Вас?! — Результат соответсвенно …

    измененный прикладываю

    Reply
  13. fomix

    (13) Каюсь не досмотрел! Спасибо за наводку.

    Не сообразил, что отбор делается в настройках на закладке «Отбор» для строки «ГруппаУслуги».

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

    Reply
  14. graZy

    (14) fomix,

    Цитата 4. Для нее в настройках отключаем «Расположение общих итогов» и «Выводить отбор».

    Наводка «Настройки»/(Ваша группа «Группа Услуги»)/»Другие настройки»

    Reply

Leave a Comment

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