Программное генерирование кнопочек для удобного управления уровнями группировки в отчетах (версия 2a).




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

75 Comments

  1. mtv:)

    В табличных документах 1С 8 имеется отличная возможность использования группировок, но управление уровнями группировок через контекстное меню не очень удобное.

    В своих отчетах для управления уровнями группировок я использую маленькие кнопочки на поле табличного документа — это намного удобнее и быстрее, чем через контекстное меню.

    Перейти к публикации

    Reply ↓
  2. Saint

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

    Reply ↓
  3. mtv:)

    Saint,

    Да, можно и так…

    Но (IMHO) отчет с включенными заголовками смотрится как-то «лохмато», непрофессионально. Заголовки захламляют отчет, представляя собой совершенно лишнюю информацию. А также занимают место, уменьшая полезную площадь для отчета, которой порой так не хватает…

    Вобщем я пользуюсь сгенерированными кнопочками. Может кому-то это тоже понравится. Как говорится — «На вкус и цвет…». 😀

    Reply ↓
  4. Pashkaa

    Привяжи начальные координаты к верхнему углу ПоляТабличногоДокумента, будет универсальние. В отчете могут быть отборы как в типовых отчетах. И надо уж тогда менять координаты кнопок при влючении и выключении отборов в отчетах.

    Reply ↓
  5. Pashkaa

    НачалоВерх = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх + 3; // Тут установить начальные координаты для кнопок

    НачалоЛево = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Лево + 3; // Тут установить начальные координаты для кнопок

    ….

    НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч — 1));

    …….

    Испоравь так. Так кнопки сгенерерованные перекроют даже кнопки при включенном заголовке )))

    Reply ↓
  6. mtv:)

    Pashkaa,

    Спасибо за дельное дополнение, так действительно будет лучше и универсальнее.

    Уже поправил.

    Reply ↓
  7. VladZetRu

    В случае если табличное поле находится на панели, ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх даст результат расстояния поля от верха панели, а не формы. Для корректного формирования кнопок в этом случае их нужно формировать на панели.

    Reply ↓
  8. mtv:)

    VladZetRu,

    Да, конечно,если ПолеТабличногоДокумента находится на Панели, то в этом случае кнопочки нужно формировать на Панели, а не на Форме.

    И код тогда надо будет изменить так:

    НоваяКнопка = ЭлементыФормы.Добавить(Тип(«Кнопка»), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель1);

    Reply ↓
  9. artbear

    (5) Возможно, что для универсальности строку с именем элемента управления «ТабличноеПоле» (т.е. «ТабДок») лучше передавать как параметр в обе процедуры, чтобы не пришлось менять код в случае с другими именами.

    Или вариант 2 — сделать спец.шаблон 1С, в котором имя будет запрашиваться и подставляться в код.

    Reply ↓
  10. mtv:)

    (8)Да, на счет передачи, как параметра, ты прав, так будет лучше.

    А про «спец.шаблон 1С» — чёт не понял… (((

    Reply ↓
  11. artbear

    (9) Ну этот код явно просится быть добавленным в файл шаблонов 1С, при вставке шаблона в код можно юзать подстановку параметров.

    Reply ↓
  12. PRoman

    Клевая штучка, но не более, нужно быть очень метким чтобы «ткнуть» на эту кнопочку.

    Очень удобный вариант сделан в «1с Деньги».

    Reply ↓
  13. mtv:)

    (10) Теперь понятно, о чем речь. Тоже неплохая идея. Спасибо, artbear.

    Reply ↓
  14. mtv:)

    (11) На счет: «… нужно быть очень метким …» — эти кнопочки даже чуть-чуть больше, чем те системные кнопки, которые появляются при отображении заголовков Таблицы.

    Интересно, а какой вариант в «1С Деньги»? Я не видел…

    Reply ↓
  15. Rustig

    здо’рово! спасибо!

    Reply ↓
  16. DrAku1a

    Респект! Надо будет к универсальному отчету прикрутить…

    Reply ↓
  17. e.kogan
    Процедура СгенерироватьКнопкиУправленияГруппировкой()
    
    НачалоВерх = ЭлементыФормы.Результат.Верх + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
    НачалоЛево = ЭлементыФормы.Результат.Лево + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
    
    ШагКнопок      = 13;
    ПрефиксИмениКн = «КнГр_»;
    
    // Удалить старые кнопки
    Сч = 0;
    Пока Сч < ЭлементыФормы.Количество() Цикл
    ТекЭлемент = ЭлементыФормы.Получить(Сч);
    Если Найти(ТекЭлемент.Имя, ПрефиксИмениКн) > 0 Тогда
    ЭлементыФормы.Удалить(ТекЭлемент);
    Иначе
    Сч = Сч + 1;
    КонецЕсли;
    КонецЦикла;
    
    // Добавть новые кнопки по количеству группировок
    КоличествоГруппировок = ЭлементыФормы.Результат.КоличествоУровнейГруппировокСтрок();
    Для Сч = 1 По КоличествоГруппировок Цикл
    НоваяКнопка = ЭлементыФормы.Добавить(Тип(«Кнопка»), ПрефиксИмениКн + Сч);
    НоваяКнопка.Верх      = НачалоВерх;
    НоваяКнопка.Лево      = НачалоЛево + (ШагКнопок * (Сч — 1));
    НоваяКнопка.Высота    = 11;
    НоваяКнопка.Ширина    = 11;
    НоваяКнопка.Шрифт     = Новый Шрифт(«Шрифт диалогов и меню», 6);
    НоваяКнопка.Заголовок = «» + Сч;
    НоваяКнопка.УстановитьДействие(«Нажатие», Новый Действие(«СвернутьДоУровня»));
    НоваяКнопка.Подсказка=»Свернуть до уровня»;
    КонецЦикла;
    
    КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()
    
    // Вызывается при нажатии кнопочек «1», «2» и т.д. (для сворачивания группировок)
    Процедура СвернутьДоУровня(Элемент)
    
    Уровень = Число(Элемент.Заголовок); // здесь записан нужный уровень
    Если Элемент.Подсказка=»Свернуть до уровня» Тогда
    ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(Уровень — 1);
    Элемент.Подсказка=»Развернуть до уровня»;
    Иначе
    ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(Уровень + 1);
    Элемент.Подсказка=»Свернуть до уровня»;
    КонецЕсли;
    //чтобы нижележащие кнопки группировки вели себя соответственно
    КоличествоГруппировок = ЭлементыФормы.Результат.КоличествоУровнейГруппировокСтрок();
    ПрефиксИмениКн = «КнГр_»;
    Для й=Уровень+1 по КоличествоГруппировок Цикл
    ЭлементыФормы[ПрефиксИмениКн+й].Подсказка=Элемент.Подсказка;
    КонецЦикла;
    
    КонецПроцедуры //СвернутьДоУровня()
    
    Процедура РезультатПриИзмененииСодержимогоОбласти(Элемент, Область) //по-моему, самое оно именно в это событие впихнуть отрисовку
    СгенерироватьКнопкиУправленияГруппировкой();
    КонецПроцедуры
    

    Показать

    и разворачивает тоже.

    Reply ↓
  18. mtv:)

    (16) e.kogan,

    Твой вариант Процедуры СвернутьДоУровня(Элемент) предпологает другой алгоритм работы кнопок, отличающийся от системного. Наверное кому-то понравится и твой вариант, что-то в нем есть.

    Но твой вариант требует проработки. Попробуй сразу после формирования отчета: нажать 1 (сверется до уровня 1), потом нажать 2 (развернется уровень 1 и уровень 2), потом снова нажать 1 (ничего не происходит… а срабатывает только по повторному нажатию).

    Reply ↓
  19. YVolohov

    Можно передавать ЭлементыФормы и ПолеТабличногоДокумента как параметры процедуры. Тогда не будет привязки к конкретной форме и табличному полю, а сама процедура станет универсальной и ее можно будет вынести в один из общих модулей.

    Reply ↓
  20. e.kogan

    (17) Да я сама что-то, видимо, под конец рабочего дня перекрутила мысль 🙂 Ну нафиг, оставлю у себя как было.

    Reply ↓
  21. mtv:)

    (18) Да, можно и так — прописать параметры и вынести в общий модуль. Получится действитель универсально.

    В публикации описана сама идея генерации кнопочек, а как ее применить — каждый для себя решит сам, в меру своих знаний и потребностей. 😀

    Reply ↓
  22. mtv:)

    (19) Утро вечера мудренее… 😀

    Reply ↓
  23. artbear

    (18) Я об этом уже говорил в (8)

    Есть один минус — у действия «СвернутьДоУровня» может быть только один параметр (Элемент), сюда параметры не передашь, значит, нужно либо где-то отдельно хранить данные либо пользоваться шаблоном, который автоматом развернется в нужный/правильный код.

    Reply ↓
  24. alexk-is

    Врезал в типовой универсальный отчет. Теперь работает во всех отчетах, сделанных на его основе включая внешние. Спасибо за идею.

    Reply ↓
  25. alexk-is

    +23 Изменения для модуля УниверсальногоОтчета с учетом комментария (27)

    // ИС КАВ ( 20.04.2011

    Перем Фор

    Reply ↓
  26. mtv:)

    (24) Спасибо alexk-is. Твоё сообщение тянет на отдельную публикацию. 😀

    Отличное применение идеи.

    Только в коде (в двух местах), наверное, лучше заменить: текст «КнопкаГруппировки_» на переменную ПрефиксКнопки.

    Добавил в публикацию ссылку на твоё сообщение.

    Reply ↓
  27. mafia

    А как быть если группировки расположены не по вертикали а по горизонтали? Или и то и другое вместе?

    Reply ↓
  28. mosAdm

    (24) Малость пришлось дописать, т.к. при нажатии кнопки «Быстрые отборы» «КнопкиГруппировки_» оставались на месте

    Процедура УправлениеПанельюБыстрыеОтборы(Объект, Форма) Экспорт
    
    …
    
    Если Форма.ЭлементыФормы.Найти(«ПолеТабличногоДокументаРезультат») <> Неопределено Тогда
    СгенерироватьКнопкиУправленияГруппировкой(Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат)
    КонецЕсли;
    
    
    КонецПроцедуры // УправлениеПанельюБыстрыеОтборы()
    

    Показать

    Ну и в процедуре «СгенерироватьКнопкиУправленияГруппировкой» добавил удаление кнопок

    
    Для Индекс = 1 По КоличествоГруппировок Цикл
    ИмяКнопки = «КнопкаГруппировки_» + Формат(Индекс, «ЧЦ=3; ЧН=; ЧВН=») + «_» + ИмяТабличногоДокумента;
    //……………………..
    ЭлементКнопка = ЭлементыФормы.Найти(ИмяКнопки);
    Если ЭлементКнопка <> Неопределено Тогда
    ЭлементыФормы.Удалить(ЭлементКнопка);
    КонецЕсли;
    //……………………..
    
    Если ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда 

    Показать

    Reply ↓
  29. mtv:)

    (26)

    mafia пишет:

    А как быть если группировки расположены не по вертикали а по горизонтали? Или и то и другое вместе?

    Ответом на этот вопрос служит публикация http://infostart.ru/public/84642/ от alexk-is, которая содержит дальнейшее развитие идеи.

    Reply ↓
  30. v.a.ryag

    очень удобно)

    Reply ↓
  31. UncleVader

    А как быть с управляемыми формами?

    Reply ↓
  32. vovche

    я не по делу, спасибо за обработку и возможность ее откомментировать

    Reply ↓
  33. nissal

    Не получилось наскоком прикрутить к управляемой форме 🙂

    Нет свойств Верх-Низ… Надо что-то думать. Идея — суперская!!

    Reply ↓
  34. mtv:)

    (32)Спасибо за комментарий, очень приятно!

    Я не использую в своей работе управляемые формы, поэтому не могу ни чем помочь, к сожалению… 🙁

    Но если у тебя получится прикрутить эту фичу в управляемых формах, будет очень здорово. Не забудь только сообщить об этом в этой теме. Я думаю, что это бы потянуло на отдельную публикацию.

    Успехов в исследованиях.

    Reply ↓
  35. nissal

    (33) mtv:)

    Спасибо за напутсвтвия, пошел пробовать.

    Reply ↓
  36. nissal
    Reply ↓
  37. nissal

    Для избавления от рамок рисунков изменил функцию СвернутьДоУровня() молуля формы так:

    [CODE 1с]// Вызывется при нажатии кнопочек «1», «2» и т.д. (для сворачивания группировок)

    &НаКлиенте

    Процедура СвернутьДоУровня(Уровень)

    Результат.ПоказатьУровеньГруппировокСтрок(Уровень — 1);

    Массив = Новый Массив();

    Массив.Добавить(Результат.Область(1,1,1,1));

    Элементы.Результат.УстановитьВыделенныеОбласти(Массив);

    КонецПроцедуры[/1C-CODE]

    Теперь все довольно мило.

    Однако, в веб-клиенте FF8, IE8 не работает. Кнопки рисуются не тогда и не там, где определено и не реагируют на нажатия. Так что пока только для тонкого клиента (8.2.13.219).

    Reply ↓
  38. mtv:)

    (36)Приветствую ваше любопытство и упорство. Вот и первые результаты появились.

    До этого получал только вопросы типа: «А как быть с управляемыми формами?»…

    И вот нашелся человек, который решил исследовать эту проблему.

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

    Успехов вам.

    Reply ↓
  39. UncleVader

    (36) Отлично, спасибо за труд — все получилось как надо! Вынес функции формирования кнопок и реакцию на их нажатие во внешний клиентский модуль и в любом отчете теперь все что нужно добавить 2 строчки!

    Reply ↓
  40. rumik007

    А если добавить в формировании кнопок: НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша[«_»+сч],Истина,Ложь,Ложь), тогда мона будет с помощью комбинаций alt+[номер кнопки] сворачивать/разворачивать клавой.

    Reply ↓
  41. UncleVader

    (39) Похоже у объекта НоваяКнопка нет свойства СочетаниеКлавиш, вы сами пробовали, работает?

    Reply ↓
  42. rumik007
    UncleVader пишет:

    (39) Похоже у объекта НоваяКнопка нет свойства СочетаниеКлавиш , вы сами пробовали, работает?

    ДА, пробовал, все работает на ура.

    Reply ↓
  43. UncleVader

    (41) А, я кажется понял — я вынес процедуру создания кнопок во внешний модуль, а СочетаниеКлавиш относится к контексту формы

    Reply ↓
  44. mtv:)

    (39) rumik007, спасибо за дельное дополнение.

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

    Еще раз, спасибо.

    Reply ↓
  45. EvgeniuXP

    Добавил в модуль формы (1С 8.2.14.540) код программы, то что на главной указано при проверке модуля на ошибки выдает сообщение:

    «{Отчет.Отчет2.Форма.ФормаОтчета.Форма(38,57)}: Тип не определен (Действие)

    НоваяКнопка.УстановитьДействие(«Нажатие», Новый <<?>>Действие(«СвернутьДоУровня»)); (Проверка: Сервер)»

    Да и я как понимаю, код не для управляемых форм, т.к. просто вызвать функцию Добавить() для 8.2 не пройдет.

    Reply ↓
  46. EvgeniuXP

    (44) на клиенте тоже самое, поэтому просто попробовал на сервере выполнить данную процедуру, но всё-равно не прошло.

    Reply ↓
  47. mtv:)

    (44)(45) EvgeniuXP, да, код, который в публикации, работает только в обычных (неуправляемых формах).

    Для управляемых форм смотри выше сообщения от nissal, он экспериментировал с управляемыми формами, и у него есть определенные результаты.

    Я не работаю с управляемыми формами, т.к. нет пока необходимости, поэтому помочь ни чем, к сожалению, не смогу.

    Reply ↓
  48. EvgeniuXP

    (46) Спасибо, нашел, прочитал комментарии. Но минусы есть в решениях, в веб-клиенте кнопочки не видны — это одна беда, а вторая — то, что эти кнопки не всегда нормально отображаются в зависимости от уровней в отчете… нет такого события обновить форму после нажатия кнопки «Сформировать», а при чтении — не всегда срабатывает 🙁

    Решение там одно, делать кнопки 1,2,3 и т.д. — т.к. они видны в веб-клиенте и написать свою кнопку «Сформировать» вместо штатной.

    Спасибо! За идею! 🙂

    Reply ↓
  49. xaker1C

    Спасибо

    Reply ↓
  50. demiurg.08

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

    Reply ↓
  51. MrVesna

    По мне так самый лучший вариант сворачивания открытых группировок сделан в Windows в редакторе реестра. Так в очень больших группировках снизу бывает долго подниматься на самый верх,а так кликнул по вертикальной полосе и группировка свернулась. На мой взгляд так гораздо удобнее.

    Reply ↓
  52. nissal

    (51) MrVesna, Ctrl+»стрелка лево» гораздо эффективнее.

    Reply ↓
  53. andy_zhav

    В СКД сделал немного по-другому:

    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    ПроцессорВывода.НачатьВывод();
    
    Пока Истина Цикл
    
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
    Прервать;
    Иначе
    Для Каждого Параметр Из ЭлементРезультата.ЗначенияПараметров Цикл
    Если ТипЗнч(Параметр.Значение)=Тип(«ИдентификаторРасшифровкиКомпоновкиДанных»)Тогда
    Продолжить;
    КонецЕсли;
    КонецЦикла;
    
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
    КонецЕсли;
    КонецЦикла;
    
    ПроцессорВывода.ЗакончитьВывод();
    
    Оповестить(«ОтчетСформирован»);
    КонецПроцедуры
    
    

    Показать

    и в форме отчета

    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = «ОтчетСформирован» Тогда
    СгенерироватьКнопкиУправленияГруппировкой();
    КонецЕсли;
    КонецПроцедуры
    

    По-идее должно без проблем работать в тонком клиенте.

    Reply ↓
  54. mtv:)

    (53) andy_zhav,

    если твой код будет работать в тонком клиенте, то это замечательно. К сожалению проверить не могу, не на чем.

    Отпишись здесь, пожалуйста, если действительно нормально заработает в тонком клиенте.

    Reply ↓
  55. andy_zhav

    (54)Отбой тонкого клиента. Только толстый. На сервере нет команды «Оповестить»

    Хотя, по моему мнению, все равно красивее смотрится через обработку оповещения…

    Reply ↓
  56. alekseies

    Нужные кнопочки, можно использовать в отчетах — удобно и просто….

    Reply ↓
  57. mybracho

    Подскажите, а в какой предопределенной процедуре вызывать процедуру генерации, если отчет строишь на СКД ?

    Reply ↓
  58. mtv:)

    (57) mybracho, в твоем случае проще всего сделать так:

    Вешаешь на кнопку «Сформировать» следующую процедуру

    Процедура кнСформировать_Нажатие(Кнопка)
    
    ЭлементыФормы.Результат.Очистить();
    ОтчетОбъект.СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);
    
    // Если необходимо указать Уровень, до которого необходимо раскрыть группировки строк,
    // то можно добавить
    ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1);
    
    // Вызов процедуры генерации кнопок управления группировкой
    СгенерироватьКнопкиУправленияГруппировкой();
    
    КонецПроцедуры //кнСформировать_Нажатие()
    
    // где ЭлементыФормы.Результат, это Поле табличного документа, в которое выводится отчет СКД.

    Показать

    И твоя задача решена… 🙂

    Reply ↓
  59. mybracho

    (58)

    Круто. Спасибо

    Повыносил эти процедуры в общий модуль. Повставлял их вызов в свои отчеты. Получилось компактно. Счастлив

    Reply ↓
  60. galinka1c8

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

    Reply ↓
  61. Azatikn

    Ай, молодцы, всё ведь возможно

    понравилось

    Reply ↓
  62. AlexO

    И почему народу так трудно выбрать уровень из контекстного меню? Причем доступно в любом месте показа уровней, и не надо крутить туда-сюда отчет.

    Reply ↓
  63. psa247

    Спасибо, пригодилось !!!

    Reply ↓
  64. zba

    Вот это как раз и надо. Спасибо!

    Reply ↓
  65. KroVladS

    Замечательный механизм, как я раньше о нём не узнал.

    А главное это позитив от довольных пользователей которым добавили удобняшку 🙂

    Reply ↓
  66. MsDjuice

    Можно как-то использовать данную разработку, чтобы развертывать/свертывать группировки по условию? Например, поле группировки равно 0 и т.д.

    Reply ↓
  67. mary61

    Спасибо! Как просто и удобно.

    Reply ↓
  68. anfisa86

    Супер! Очень удобно! Спасибо!

    Reply ↓
  69. EugenLiquor

    Интересно попробовать, возьму на вооружение для своих целей!

    Reply ↓
  70. sekatskaya-e

    Процедуру СвернутьДоУровня(Элемент) можно только в модуле формы отчета размещать — получается что каждый отчет нужно корректировать?

    Reply ↓
  71. mtv:)

    Коллега unichkin опубликовал решение этой задачи для управляемых форм:

    Кнопки управления группировками табличного документа для управляемых форм

    Reply ↓
  72. dklp

    есть идеи, как сделать так, чтобы при вызове команды ОтчетТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(0) сворачивалась таблица, но при этом не сворачивались Параметры и строки Отбора?

    Reply ↓
  73. xomaq

    Огромное спасибо автору! Все работает идеально!

    P.S. ..и чего я сам до этого не додумался…

    Reply ↓
  74. witdog

    Спасибо! Очень полезный механизм

    Reply ↓
  75. ice-net
    Reply ↓

Leave a Comment

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