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




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

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 не будет опубликован. Обязательные поля помечены *