Тёмный

Как в 1С сформировать отчет на СКД программно 

alexcode_1c
Подписаться 2,6 тыс.
Просмотров 6 тыс.
50% 1

Как можно меня отблагодарить: pay.cloudtips.ru/p/0c670bd3
В данном видео рассмотрены основы формирования отчетов на СКД средствами языка 1С.
Таймкоды:
00:22 - Подготовка отчета
01:56 - Пример программного формирования отчета на СКД
07:24 - Программная установка параметров и отборов в отчетах на СКД
12:28 - Как программно изменить структуру группировок отчета?
17:57 - Использование обработчика ПриКомпоновкеРезультата
21:14 - Вывод отчета на СКД в таблицу значений
Добавляйте в закладки мой сайт 1c.alexcode.ru/first-steps/ с полезными материалами по настройке и программированию 1С
Курс «Разработчик 1С с нуля»
1c.alexcode.ru/
Индивидуальное обучение 1С
1c.alexcode.ru/online-consult...
Видео также размещено на моем Дзен-канале «1С с Леоновым»: dzen.ru/video/watch/637cc61a6...

Опубликовано:

 

2 май 2022

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 15   
@alexcode_1c
@alexcode_1c 9 месяцев назад
Листинг модуля формы: &НаСервере Процедура ПрограммноСформироватьОтчетНаСервере(ТабДок) ОбъектОтчетНаСервере = РеквизитФормыВЗначение("Отчет"); // Здесь стоит обратить внимание, что мы можем работать с любым макетом, // не обязательно с основной схемой компоновки данных СхемаСКД = ОбъектОтчетНаСервере.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); КомпоновщикНастроекДанныхОтчета = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроекДанныхОтчета.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД)); //КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию); // Использование текущих настроек компоновщика вместо настроек по умолчанию из схемы КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(ОбъектОтчетНаСервере.КомпоновщикНастроек.Настройки); // Параметры в СКД можно найти по имени параметра. ПараметрыДанных = КомпоновщикНастроекДанныхОтчета.Настройки.ПараметрыДанных.Элементы; ЭлементНачалоПериода = ПараметрыДанных.Найти("НачалоПериода"); ЭлементНачалоПериода.Использование = Истина; ЭлементНачалоПериода.Значение = ДАТА(2017,01,01,00,00,00); // В отличие от параметров, отбор необходимо обходить циклом и проверять каждую строку. // Кроме того, сравниваем не строки, а поля компоновки, используя ПолеКомпоновкиДанных ОтборКомпоновщика = КомпоновщикНастроекДанныхОтчета.Настройки.Отбор; Для Каждого ЭлементОтбора Из ОтборКомпоновщика.Элементы Цикл Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар") Тогда ОтборКомпоновщика.Элементы.Удалить(ЭлементОтбора); КонецЕсли; КонецЦикла; НоменклатураОтбор = ОтборКомпоновщика.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НоменклатураОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; НоменклатураОтбор.Использование = Истина; НоменклатураОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар"); НоменклатураОтбор.ПравоеЗначение = Справочники.Товары.НайтиПоНаименованию("Авторучка"); // Добавим программно группировку по складу Структура = КомпоновщикНастроекДанныхОтчета.Настройки.Структура; ГруппировкаПоСкладу = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ГруппировкаПоСкладу.Имя = "Мяу"; ГруппировкаПоСкладу.Использование = Истина; //группировка по полю "Склад". Если нужны детальные записи, то просто не заполняем ПоляГруппировки ПолеГруппировкиСклад = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировкиСклад.Использование = Истина; ПолеГруппировкиСклад.Поле = Новый ПолеКомпоновкиДанных("Склад"); ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы; //добавить выводимые поля в группировке: склад и количество приход. ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад"); ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоПриход"); // В том случае, если нам нужно учитывать настройки, выполненные пользователем, их необходимо загрузить КомпоновщикНастроекДанныхОтчета.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроекДанныхОтчета.ПолучитьНастройки()); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет); // Выведем полученные данные в табличный документ ТабДок.Очистить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры &НаКлиенте Процедура ПрограммноСформироватьОтчет(Команда) ПрограммноСформироватьОтчетНаСервере(Результат); Элементы.Результат.ОтображениеСостояния.Видимость = Ложь; Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать; КонецПроцедуры
@alexcode_1c
@alexcode_1c 9 месяцев назад
Модуль объекта: Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить(); НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ПолеОтбора = Новый ПолеКомпоновкиДанных("Товар"); НовыйЭлементОтбора.ЛевоеЗначение = ПолеОтбора; НовыйЭлементОтбора.Использование = Истина; НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; НовыйЭлементОтбора.ПравоеЗначение = Справочники.Товары.НайтиПоНаименованию("Кофе"); МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; Результат = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); ДокументРезультат.Вывести(Результат); КонецПроцедуры
@avagafonov
@avagafonov 2 года назад
Низкий поклон за Ваш материал!!!
@alexcode_1c
@alexcode_1c 2 года назад
Спасибо за очень высокую оценку! Воодушевляет на новые видео и темы!))
@SmotrelkinNaTeleke
@SmotrelkinNaTeleke 2 года назад
все четко и понятно спс
@user-cl1tm8id4z
@user-cl1tm8id4z Год назад
Добрый день! Совсем недавно нашел Ваш канал, отличная подача материала. Спасибо за Ваш труд. По этом ролику возник вопрос по следующей строке кода: Для Каждого ЭлементОтбора Из ОтборКомпоновщика.Элементы Цикл Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар") Тогда мне кажется не оптимально каждый раз в цикле выполнять создание нового: Новый ПолеКомпоновкиДанных("Товар") - это же затратная операция по ресурсам и времени. Или иначе здесь не сработает ?
@alexcode_1c
@alexcode_1c Год назад
Добрый день, Андрей! Спасибо за высокую оценку и интересный вопрос! Да, Вы правы, здесь оптимальнее вынести Новый... в отдельную переменную перед циклом. Но в целом, отборы в отчетах редко когда бывают слишком большие, поэтому потеря производительности вряд ли будет ощутимая.
@dsoldatkin
@dsoldatkin 9 месяцев назад
Привет, помести, пожалуйста, в закрепленный комментарий тексты модулей.
@alexcode_1c
@alexcode_1c 9 месяцев назад
Одновременно модуль формы и объекта не дает разместить комментарием, возможно слишком длинный текст получается. Закрепил модуль формы, и ответом к нему - модуль объекта.
@vladyan01
@vladyan01 Год назад
Я кучу раз формировал отчет на скд программно, но никак не запомню как это делать, один раз написал сохранил и просто переиспользую)))
@alexcode_1c
@alexcode_1c Год назад
Это очень распространенный и правильный подход! Копилка заготовок и шаблонов обработок со временем, мне кажется, появляется у любого разработчика.
@user-mv3mj1kj9z
@user-mv3mj1kj9z 3 месяца назад
Добрый вечер. Время 3.42 инициализируем - это,по моему, и есть загрузка настроек. Зачем еще метод "Загрузить". В чем разница между "Инициализация" и "Загрузить"?
@alexcode_1c
@alexcode_1c 3 месяца назад
Добрый вечер. "Инициализировать" размещает в компоновщике настроек доступные настройки на основании источника. Т.е. заполняются свойства компоновщика "ДоступныеПоляВыбора, ДоступныеПоляОтбора", и др. При этом фактические настройки еще пустые. А вот после ЗагрузитьНастройки переданные настройки (Например, настройки по умолчанию) заполняют свойства компоновщика "Структура", "Отбор" и др. Можно и не загружать настройки, а например, заполнять их программно на основе доступных полей.
@user-ru5tu8hm1v
@user-ru5tu8hm1v Год назад
А зачем удалять элемент отбора, если нашли нужный настраивате и установите Использование в Истина
@alexcode_1c
@alexcode_1c Год назад
Спасибо за обратную связь! В 1С зачастую одну и ту же задачу можно решить более чем одним способом. :) Вариант с перебором элементов тоже рабочий, как и вариант с очисткой отбора. ;)
Далее
Why Don't Ice Rinks Melt?
01:00
Просмотров 1,8 млн
🌮 Taco Salad Bourbon Queso Bites #Shorts
01:00
Просмотров 10 млн
Работа с JSON в 1С 8 3
23:25
Просмотров 8 тыс.
Маленькие хитрости СКД
6:42
Просмотров 10 тыс.
1С СКД. Работа с настройками
16:31