<?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='\
Если операция производится над сформированным табличным документом, то причём здесь СКД?
Это решение призвано привести в порядок вертикальные группировки в СКД. Если этот вариант можно использовать еще где нибудь я не против.
Спасибо за решение, сделал и для горизонтальных и вертикальных ячеек.
Классно работает и для вертикальных и для горизонтальных ячеек. А у кого получилось одновременное объединение горизонтальных и верткальных? Например объединенная ячейка должна быть высотой 2 строки и шириной 3 колонки ?
В платформе 8.2 уже все объединяет, если грамотно настроить
(5) adminfo2002, серьезно?
Пример в студию.
Вопрос автору: объединятся ли смежные ячейки ресурсов с одинаковым значением?
(8) adminfo2002, ждю…
(7) serg_gres, не понял, зачем объединять ячейки ресурсов? Если речь идет об общей родительской группировке этих ресурсов, то да объединятся.
(5) adminfo2002, действительно, было бы очень интересно посмотреть на новое решение …
Единственное найденное решение, на мой взгляд. И в 8.2 ничего подобного, как ни настраивай…
(8) adminfo2002, и я жду… )) передо мной сейчас такая же задача. Но как не пыталась, простой настройкой не обошлась
мне наоборот надо чтобы родительская группировка не объединялась.. версия платформы 8.2.14.540. есть какая то настройка?
А можно поподробнее описать, в каком виде вы хотите видеть родительские группировки?
как в публикации на картинке где без объединения(покупатели или поставщики). чтобы над каждой колонкой было название верхней группировки. то есть начальный вариант в этой публикации
Смотрите скриншот «Настройки СКД»
(8) adminfo2002,
Полгода прошло… у вас там временная аномалия? 🙂
(16) sdv88,
«А вот тут немного снять.. здесь подчистить… тут отрезать…и вот изящная ложка готова!»
«Не, мне баклушу как сделать?!…»
Кто ж поймет этих 1сников…
(1) Saint,
Вы знаете способ обработать СКД напрямую?
(19) AlexO, C добрым утром! Вопрос по комментарию трёхгодичной давности? Тем не менее попытаюсь ещё раз сформулировать: какое отношение описанный алгоритм имеет к СКД? Здесь обрабатывается уже сформированный табличный документ. А как он был сформирован для описанного алгоритма дело десятое. Точно также можно обрабатывать табличный документ, сформированный вручную.
Если данное решение можно применить где-то еще я буду только рад. Но в первую очередь это будет полезно пользователям СКД.
(20) Saint,
Как раз наипервейшее. Потому как СКД настолько закрытый и запутанный механизм, что любое осмысленное вмешательство в него, дающее уверенный результат — уже огромный плюс.
Спасибо! Полезная вещь, очень помогла.
работает только при выводе одного показателя в отчете.
Если делаешь вывод более одного показателя, то объединение не срабатывает:(
Спасибо за замечание, добавлен доработанный пример для 8.2.
Подскажите, если у меня нет кнопки сформировать, и форма рисуется стандартно, как мне использовать данную процедуру?
Спасибо!
Возьму на вооружение.
(26) lamdth,
На форме создайте кнопку, прицепите к ней свой обработчик, текст можно подсмотреть где угодно. Например выдрать из моего отчета этой темы. Пример есть в книге «Руководство разработчика» гл 10.4.
Нечто подобное методами СКД. Не так красиво, правдаhttp://www.forum.mista.ru/topic.php?id=637203
А как сделали рисунок «Имеем отчет вида»???
(30) rborovikov,
На скриншоте «Настройки СКД» показан пример настроек или можно скачать приложенный отчет и там посмотреть.
Спасибо, помогло.
Я при использовании немного дополнил функцию ОбъединятьЯчейки():
Показать
Добавил массив, в котором указал конкретные строки, которые должны быть в ячейках для объединения. Потому что исходный вариант иногда объединял не то, что нужно.
скачал для 8.2, процедуры в модуле форме вообще не прорабатываются, т.е. удалил вообще форму — результат тот же
p.s. допёр — сделано в обычных формах, хотя написано 8.2 думал на управляемых
(8) adminfo2002, Конечно пiZдеть проще)
Спасибо за алгоритм. Есть небольшое дополнение. Чтобы сделать именно шапку на колонками, а не просто объединить одинаковые ячейки и не оставлять итоги по группировке слева от колонок, то можно использовать группировку полей. Вот как у меня на рисунке. Тогда при использовании доп. кода по объединению ячеек можно получить красивую таблицу с шапками колонок.
Наткнулся случайно.
я чего-то не понял (может быть реализация связана с «-5» лет назад? или связано с особыми требованиями к формату отчета)
потому как ну нет проблемы вроде с отображением группировок
настройка «расположение группировок — вместе» дает красивый результат (ну на платформе 8.3. точно, при том что по умолчанию подразумевает «вместе» и ничего настраивать не нужно)
Спасибо автору!
(37) graZy,
Сейчас проверил на платформе 8.3.4.465 (другой под рукой не было), проблема осталась.
з.ы.
Проверил на 8.3.5.1383 — результат тот же. (Для проверки можно использовать отчет из загрузок например «Объединяемые заголовки для 8.2» и закомментировать вызов «ОбработатьЗаголовки(…)»
(39)
(39)
8.3.5.1119
(экперементировал на своем отчете)
рис 1 «расположение полей группировок вместе»
рис 2 «расположение полей группировок отдельно»
(40) graZy,
На втором вашем рисунке как раз нужно добиться общей шапки для «кварталов» и «полугодий»
так а чем отчет на первом рисунке не устраивает??? (зачем городить рисунок 2 с объединением) — как писал ранее, если это только не требования к форме отчета (тогда понятно зачем) — в остальных случаях рис1 по мне так идеально подходит (и все стандартными средствами СКД)
(43) demien@tut.by, (43) demien@tut.by,
Добрый день.
Что бы настройки брались пользовательские надо
вместо этого:
Настройки = КомпоновщикНастроек.Настройки;
Надо написать это:
Настройки= КомпоновщикНастроек.ПолучитьНастройки();
Взял отсюда:
http://1cskd.ru/2012/03/programmnoe-vypolnenie-skd-i-polzovatelskienastrojki/
Актуально, но нормально не работает (( мне например итог по группировке не нужен вообще (на скриншоте из примера первая колонка Покупатели), так еще и 3 группировки в колонках! как этому хозяйству ума дать ? может 1С что нибудь стандартное придумало все же ?
Требовалось объединить более одного уровня группировки. Наваял вот. Пользуйтесь, кому надо. Спасибо авторам.
Показать
Выбираем только шапку и объединяем все, что можем.
Блин. Обрадовался было, что есть способ сделать это средствами СКД, а тут опять свинство под названием «поячейно курочим готовый моксель». Тьфу. Аж минуснуть захотелось.
Так что ли?
Спасибо за полезную тему, очень помогло объединить заголовки месяцев над неделями.
(8) ждемс…