Разработка сложных отчетов в 1С предприятии 8

Книга адресована разработчикам прикладных решений в системе «1С:Предприятие 8». Она позволяет самостоятельно изучить возможности системы компоновки данных.
Для начинающих разработчиков в книге описывается устройство системы компоновки данных, приводятся простые примеры создания отчетов, снабженные большим количеством иллюстраций и комментариев.
Значительная часть книги посвящена выполнению практических примеров создания и настройки сложных отчетов. Эти примеры можно использовать для того, чтобы попрактиковаться в создании и модификации отчетов, использующих систему компоновки данных.
Для опытных разработчиков книга содержит подробное описание отдельных возможностей системы компоновки данных. Эту часть книги можно использовать в качестве справочного пособия или для более глубокого изучения возможностей механизма.
Для создания примеров использована платформа «1С:Предприятие» версии 8.2.15.301.
Несмотря на то, что книга готовилась для «1С:Предприятие 8.2», она является актуальной и для версии 8.3, некоторые доработки, выполненные в версии 8.3, в ней не рассмотрены, т.к. написана она до выхода этой версии.
После покупки предоставляется дополнительная возможность скачать книгу в формате epub.
Скачать дополнительные материалы к книге

коллеги!

В 1С-Рарус пытаюсь вытащить контрагента-поставщика из последней партии для отчета по остаткам, т.е. чтобы отчет по остаткам показывал мне контрагента из последнего поступления. Необходимо видеть прошлого поставщика для номенклатуры, которая двигалась через регистраторы типа «инвентаризация» или «ввод остатков».

Собственно сам пациент:

ВЫБРАТЬ ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура, ОстаткиТоваровКомпанииОстаткиИОбороты.СкладКомпании, ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоПриход, ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоРасход, ОстаткиТоваровКомпанииОстаткиИОбороты.Период, ВложенныйЗапрос.ПартияКонтрагент, ОстаткиТоваровКомпанииОстаткиИОбороты.СуммаРознНачальныйОстаток, ОстаткиТоваровКомпанииОстаткиИОбороты.СуммаРознКонечныйОстаток, ОстаткиТоваровКомпанииОстаткиИОбороты.СуммаРознПриход, ОстаткиТоваровКомпанииОстаткиИОбороты.СуммаРознРасход ИЗ РегистрНакопления.ОстаткиТоваровКомпании.ОстаткиИОбороты( &НачалоПериода, &КонецПериода, Месяц, , Номенклатура В ИЕРАРХИИ (&Номенклатура) И СкладКомпании В ИЕРАРХИИ (&СкладКомпании)) КАК ОстаткиТоваровКомпанииОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ ПартииТоваровКомпанииОбороты.Номенклатура КАК Номенклатура, ПартииТоваровКомпанииОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, ПартииТоваровКомпанииОбороты.Партия.Контрагент КАК ПартияКонтрагент ИЗ РегистрНакопления.ПартииТоваровКомпании.Обороты( , , , Номенклатура В ИЕРАРХИИ (&Номенклатура) И СкладКомпании В ИЕРАРХИИ (&СкладКомпании)) КАК ПартииТоваровКомпанииОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ ПартииТоваровКомпанииОбороты.Номенклатура КАК Номенклатура, ПартииТоваровКомпанииОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, МАКСИМУМ(ПартииТоваровКомпанииОбороты.Партия.Дата) КАК ПартияДата ИЗ РегистрНакопления.ПартииТоваровКомпании.Обороты( , , , Номенклатура В ИЕРАРХИИ (&Номенклатура) И СкладКомпании В ИЕРАРХИИ (&СкладКомпании)) КАК ПартииТоваровКомпанииОбороты ГДЕ НЕ ПартииТоваровКомпанииОбороты.Партия.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) СГРУППИРОВАТЬ ПО ПартииТоваровКомпанииОбороты.Номенклатура, ПартииТоваровКомпанииОбороты.ХарактеристикаНоменклатуры) КАК ВложенныйЗапрос ПО ПартииТоваровКомпанииОбороты.Номенклатура = ВложенныйЗапрос.Номенклатура И ПартииТоваровКомпанииОбороты.ХарактеристикаНоменклатуры = ВложенныйЗапрос.ХарактеристикаНоменклатуры И ПартииТоваровКомпанииОбороты.Партия.Дата = ВложенныйЗапрос.ПартияДата) КАК ВложенныйЗапрос ПО ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура = ВложенныйЗапрос.Номенклатура И ОстаткиТоваровКомпанииОстаткиИОбороты.ХарактеристикаНоменклатуры = ВложенныйЗапрос.ХарактеристикаНоменклатуры ГДЕ ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)

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

Засовываю запрос в СКД — контрагент отображается, но не для всех.

Почему так?

Название: Разработка сложных отчетов в «1С:Предприятии 8.2″. Система компоновки данных». Издание 2 (+ CD)»

Авторы:Е. Ю. Хрусталева

Издательство: «1С-Паблишинг»

Год: 2012

Описание: Книга адресована разработчикам прикладных решений в системе «1С:Предприятие 8». Она позволяет самостоятельно изучить возможности системы компоновки данных.

Все примеры второго издания книги основаны на версии 8.2 платформы «1С:Предприятие» и адаптированы для нее. Описаны новые возможности системы компоновки данных, появившиеся в платформе 8.2.

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

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

Для опытных разработчиков книга содержит подробное описание отдельных возможностей системы компоновки данных. Эту часть книги можно использовать в качестве справочного пособия или для более глубокого изучения возможностей механизма.

Все примеры, рассматриваемые в книге, содержатся на прилагаемом компакт-диске.

Одна из задач автоматизации — ускорение работы пользователя, что во многом достигается путем сокращения повторяющихся рутинных действий. У многих пользователей есть постоянные отчеты, для открытия которых они находят команду в меню, вводят отборы и параметры в открывшейся форме, нажимают «сформировать». В таких случаях разработчик 1С может создать команды программного запуска отчета с открытием и настройкой, что позволит сразу получить готовый отчет, а механизм системы компоновки данных, называемый в сокращении СКД, представляет ему для этого обширный инструментарий. В этой статье мы познакомимся с несколькими методами программного запуска отчета с открытием и различной настройкой, из которых каждый сможет выбрать наиболее подходящий.

Сначала получаем форму.

Если отчет хранится в базе тогда выполняем на клиенте код:

1С (Код)

1 Форма = ПолучитьФорму(«Отчет.<Отчет>.Форма»);

Иначе

1С (Код)

1 2 Отчет = ВнешниеОтчеты.Создать(«ПутьКОтчету»); Форма = Отчет.ПолучитьФорму(«ИмяФормы»);

Если нужен не «вариант по умолчанию»

1С (Код)

1 Форма.УстановитьТекущийВариант(«<КлючВарианта>»);

Далее получаем настройки:

1С (Код)

1 Настройки = ПолучитьНастройки(Форма.Отчет.КомпоновщикНастроек);

Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.

1С (Код)

1 2 3 4 5 &НаСервереБезКонтекста Функция ПолучитьНастройки(КомпоновщикНастроек) Настройки = КомпоновщикНастроек.ПолучитьНастройки(); Возврат Настройки; КонецФункции

Загружаем измененные настройки в компоновщик

1С (Код)

1 Форма.Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

Формируем отчет

1С (Код)

1 Форма.СкомпоноватьРезультат();

Открываем форму

1С (Код)

1 Форма.Открыть();

Открытие формы отчета с помощью ОткрытьФорму и расширения формы отчета.

Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:

  1. СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
  2. Отбор — Устанавливает отбор на результат СКД.
  3. КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.

Пример:

1С (Код)

Программный вывод СКД в табличный документ и таблицу значений.

Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.

Код выполняется на сервере.

Получение локального макета

1С (Код)

1 СхемаКомпоновкиДанных = ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);

Получение макета произвольного отчета

1С (Код)

1 СхемаКомпоновкиДанных = Отчеты.<Отчет>.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);

Получение макета во внешней обработке

1С (Код)

1 2 Обработка = РеквизитФормыВЗначение(«Объект»); СхемаКомпоновкиДанных = Обработка.ПолучитьМакет(<ИмяМакета>);

Получение макета из внешней обработки или отчета

1С (Код)

1 2 Обработка = ВнешниеОбработки.Создать(«ПутьКОбработке»); СхемаКомпоновкиДанных = Обработка.ПолучитьМакет(«ИмяМакета»);

или

1С (Код)

1 2 Отчет = ВнешниеОтчеты.Создать(«ПутьКОтчету»); СхемаКомпоновкиДанных = Отчет.ПолучитьМакет(«ИмяМакета»);

Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:

1С (Код)

1 Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.

1С (Код)

1 2 3 4 5 КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

1С (Код)

1 2 3 4 5 //В процедуре формы ПриСозданииНаСервере() URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор()); ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы); КомпоновщикНастроекРеквизитФормы.Инициализировать(ИсточникНастроек); КомпоновщикНастроекРеквизитФормы.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

И когда будем формировать

1С (Код)

1 Настройки = КомпоновщикНастроекРеквизитФормы.ПолучитьНастройки();

Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .

Объявляем создаем необходимые объекты:

1С (Код)

1 2 3 ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

Создаем макет компоновки с помощью компоновщика макета:

1С (Код)

1 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);

Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:

1С (Код)

1 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, , Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));

Инициализируем процессор компоновки данных

1С (Код)

1 ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);

Создаем процессор вывода:

1С (Код)

1 2 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(<ТабличныйДокументВывода>);

Для вывода в таблицу значений используется другой процессор вывода:

1С (Код)

1 2 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(<ТаблицаЗначенийВывода>);

Запускаем процесс вывода:

1С (Код)

1 ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Теперь мы можем проводить нужные операции с полученными данными.

Если вывод в таблицу значений завершился ошибкой «Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.

Возможности настройки Схемы Компоновки Данных и Компоновщика Настроек СКД при программном формировании.

При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.

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

1С (Код)

Или если с добавлением нового параметра

1С (Код)

Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.

1С (Код)

1 Настройки = СхемаКомпоновкиДанных.ВариантыНастроек.Настройки;

Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе «Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.

Параметры

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

1С (Код)

1 Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(«<ИмяПараметра>»,<ЗначениеПараметра>);

Добавление параметра делается следующим образом

1С (Код)

Отбор

У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.

1С (Код)

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

Структура

Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки «Детальные записи”.

1С (Код)

Резюме

Система компоновки данных была создана для ускорения разработки отчетов и упрощения работы пользователей. Программные изменения помогают усилить этот эффект. Программист может создать выгрузки и по сути свои отчеты на основании типовых отчетов. К примеру, выгрузка заработной платы в управленческую базу. Структура базы может сильно изменена, но поля в отчете «Расчетная ведомость Т-51” будут называться так же, и сам отчет вряд ли переименуется. Да и если что-то переименуется — выгрузку исправить будет очень просто.

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

Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).