Как программно сформировать отчет в 1С СКД (8.3 и 8.2)
Как известно, с помощью Системы Компоновки Данных (СКД) в 1С 8.3 и 8.2 можно быстро построить отчет практически любой сложности. Простота и скорость создания отчета достигается удобным визуальным конструктором, который обеспечивает необходимый результат без написания кода. Но все же бывает необходимость «вмешаться» в работу конструктора и программно сформировать отчет.
Когда может потребоваться программный вывод отчета в 1С на СКД:
- программная установка параметров СКД;
- использование внешних данных в отчете;
- специфика табличного документа при выводе на печать;
- прочие нестандартные ситуации.
Предлагаю на примере рассмотреть, как можно сформировать отчет на СКД и заполнить его параметры программно.
Создадим новый внешний отчет. Напишем простейший запрос на примере 1С Бухгалтерия, который выводит начальный и конечный остатки и обороты по счету:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Счет,
ХозрасчетныйОстаткиИОбороты.Субконто1,
ХозрасчетныйОстаткиИОбороты.Субконто2,
ХозрасчетныйОстаткиИОбороты.Субконто3,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток,
ХозрасчетныйОстаткиИОбороты.СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , Счет = &Счет, , ) КАК ХозрасчетныйОстаткиИОбороты
Вот, как выглядит отчет в стандартном виде:
Теперь сформируем его программно. Для этого нам нужно добавить Основную Форму:
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Добавим команду и кнопку на форме:
В действиях команды пропишем следующий код (читать код на сайте достаточно трудно, поэтому рекомендуем скачать уже готовый пример отчета и посмотреть код в нем):
&НаСервере
Процедура СформироватьОтчетНаСервере(ТаблДок)
ОбъектОтчет = РеквизитФормыВЗначение(«Отчет»);
ОСКД = ОбъектОтчет.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
НастройкиОСКД = ОСКД.НастройкиПоУмолчанию;
//НастройкиОСКД = КомпоновщикНастроек.ПолучитьНастройкиОСКД();
ПараметрыДанныхОСКД = НастройкиОСКД.ПараметрыДанных.Элементы;
ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти(«НачалоПериода»);
ЭлементНачалоПериода.Использование = Истина;
ЭлементНачалоПериода.Значение = НачалоМесяца(ТекущаяДата());
ЭлементКонецПериода = ПараметрыДанныхОСКД.Найти(«КонецПериода»);
ЭлементКонецПериода.Использование = Истина;
ЭлементКонецПериода.Значение = КонецМесяца(ТекущаяДата());
ЭлементСчет = ПараметрыДанныхОСКД.Найти(«Счет»);
ЭлементСчет.Использование = Истина;
ЭлементСчет.Значение = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
//КомпоновщикНастроекДанных = Новый КомпоновщикНастроекКомпоновкиДанных;
//КомпоновщикНастроекДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОСКД));
//КомпоновщикНастроекДанных.ЗагрузитьНастройкиОСКД(ОСКД.НастройкиОСКДПоУмолчанию);
//КомпоновщикНастроекДанных.ЗагрузитьПользовательскиеНастройкиОСКД(Отчет.КомпоновщикНастроек.ПользовательскиеНастройкиОСКД);
КомпоновщикМакетаОСКД = Новый КомпоновщикМакетаКомпоновкиДанных;
//Макет = КомпоновщикМакетаОСКД.Выполнить(ОСКД, КомпоновщикНастроекДанных.ПолучитьНастройкиОСКД());
Макет = КомпоновщикМакетаОСКД.Выполнить(ОСКД, НастройкиОСКД);
ПроцессорКомпоновкиОСКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиОСКД.Инициализировать(Макет);
ТаблДок.Очистить();
ПроцессорВыводаОСКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВыводаОСКД.УстановитьДокумент(ТаблДок);
ПроцессорВыводаОСКД.Вывести(ПроцессорКомпоновкиОСКД);
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчет(Команда)
СформироватьОтчетНаСервере(Результат);
// Чтобы не писалось «Отчет не сформирован…»
Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
КонецПроцедуры
Данный пример программно задает параметры запроса в СКД. Это задается следующим блоком:
Чтобы параметры можно было задавать на форме, следует закомментировать выделенные строки, а остальные раскомментировать.
В итоге получаем отчет с собственной кнопкой на форме:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Александр:
Супер! Большое спасибо!
Станислав:
А если при комментировании выделенных строк и раскомментировании не выделенных строк появляется ошибка
«Переменная не определена (КомпоновщикНастроек)»
Алексей:
Вот это вот закомментированное с ошибками. НастройкиОСКДПоУмолчанию — оченвидно, «НастройкиПоУмолчанию».
«КомпоновщикНастроек» -тоже не определен
Евг:
Спасибо. Сделала как у вас. Но когда выводится табличный документ у таблицы цвет серый, а не черный. В свойствах написано черный. Помогите пож как исправить?
Ярослав:
Зачем эти подлые приколы с копирование текста из сайта?
Дяд Федор Песикот:
Расшифровки то не будет!
Павел:
Класс! долго и упроно боролся!
Спасибо Благодарное совсем человеческое!
Коля:
не работает вас пример!
Аноним:
Елена
Спасибо, очень все понятно, все по полочкам разложено, спасибо за пример