При программном создании отчета СКД форма отчета выводится последовательно столько раз, сколь раз нажимается кнопка "Сформировать" в пользовательском режиме.
Хотя метод ТабДок.Очистить() в процедуре указан.
Это выглядит так:
При этом в коде настройки компоновки определены следующим образом:
НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
Код отрабатывает, отчет формируется, отладчик ошибку не ловит. Как добиться однократного вывода отчета при нажатии кнопки "Сформировать"?
Коварность этой задачи кроется в том, что не сразу поймешь, что не так, ошибка не выводится. А повторный вывод данных связать с настройками КомпоновщикНастроек... Это только везение.
Есть хорошая статья о том, как устроен КомпоновщикНастроек - //infostart.ru/1c/articles/1185890/.
Решение №1 .
Использовать вместо выше указанного кода следующий:
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
//3. Добавляем группировки данных
// Добавим в отчет таблицу
Таблица = Новый Структура;
Таблица = НастройкиКомпоновки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
Таблица.Использование = Истина;
// Добавим в таблицу строку
Строка1 = Таблица.Строки.Добавить();
Строка1.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
Строка1.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
Строка1.Использование = Истина;
ПолеГруппировки2 = Строка1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки2.Использование = Истина;
ПолеГруппировки2.Поле = Новый ПолеКомпоновкиДанных("Автомобиль");
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Количество");
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Сумма");
//6. Добавляем Сортировку
ЭлементПорядкаКомпоновкиДанных = НастройкиКомпоновки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядкаКомпоновкиДанных.Использование = Истина;
ЭлементПорядкаКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементПорядкаКомпоновкиДанных.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
Тут мы обращаемся к конкретному методу, который к возвращаемой копии применяет пользовательские настройки.
Решение №2
Настройки включают разделы для работы с отборами, параметрами, порядком, структурой, условным оформлением.
НастройкиКомпоновки имеют свойство Структура. А в структуре есть элемент Количество.
Можно обойти циклом всю процедуру в отношении всех данных структуры (группировка, таблица).
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
Если НастройкиКомпоновки.Структура.Количество() = 0 Тогда
....
КонецЕсли;
НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
Если НастройкиКомпоновки.Структура.Количество() = 0 Тогда
//3. Добавляем группировки данных
// Добавим в отчет таблицу
Таблица = Новый Структура;
Таблица = НастройкиКомпоновки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
Таблица.Использование = Истина;
// Добавим в таблицу строку
Строка1 = Таблица.Строки.Добавить();
Строка1.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
Строка1.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
Строка1.Использование = Истина;
ПолеГруппировки2 = Строка1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки2.Использование = Истина;
ПолеГруппировки2.Поле = Новый ПолеКомпоновкиДанных("Автомобиль");
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Количество");
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Сумма");
//6. Добавляем Сортировку
ЭлементПорядкаКомпоновкиДанных = НастройкиКомпоновки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядкаКомпоновкиДанных.Использование = Истина;
ЭлементПорядкаКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементПорядкаКомпоновкиДанных.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
//7. Работа с "Другими настройками"
МакетОформления = НастройкиКомпоновки.ПараметрыВывода.Элементы.Найти("МакетОформления");
МакетОформления.Значение = "Зеленый";
МакетОформления.Использование = Истина;
Заголовок = НастройкиКомпоновки.ПараметрыВывода.Элементы.Найти("Заголовок");
Заголовок.Значение = "Список автомобилей";
Заголовок.Использование = Истина;
КонецЕсли;
Выше приведенный разбор позволяет разработчику экономить свои силы на этапе программной реализации СКД.