Лайфхак работы с СКД. Собираем отчет.







В этой статье я опишу небольшой «лайфхак» по сборке отчетов в СКД. Думаю, этот подход будет интересен тем, кто хочет быстро оформить отчет.

Введение

Всем привет! В этой статье я хочу показать вам простой, но очень действенный "лайфхак" (позвольте назвать мне этот метод именно так), который позволит вам без особых сложностей собирать практически любые отчеты в системе компоновке данных (СКД).

Раньше данный метод я применял достаточно часто, особенно в периоды острой нехватки времени на выполнение задачи. 

На своем жизненном пути я сталкивался с "программистами 1с", которые совершенно не владели системой компоновки данных и считали, что в основе СКД прежде всего лежит какой-то "лютый" запрос, за который и браться то бессмысленно. Некоторые "программисты", и это не редкость, считают, язык запросов 1с и СКД — это одно и тоже…

Собственно, как и работодатели — всегда указывают свои требования на более-менее приемлемые вакансии "требуется знание и умение пользоваться СКД" до конца, как мне кажется, имея неверное представление об СКД только как о "системе запросов к данным и отчетов по ним".

Более того, я очень аккуратно отмечу, что владение СКД все-таки — это прежде всего навык пользователя, а вот задача программиста — представить данные (любыми способами) для этой компоновки.

Многие опытные программисты уже поняли к чему я клоню, и они будут правы — да, я предлагаю "программно" разобрать механизм работы "набора данных" для системы СКД, а именно — создание набора данных (через передачу объекта) и его компоновку так, как нам нужно.

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

Итак, начнем:

 

Подготовка

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

Основное, что нам нужно — это определить и подготовить "таблицу", в которой будут все необходимые данные для выполнения условий задачи.

Создаем новый внешний отчет. Нарисуем форму отчета и "пробежимся" по всем настройкам, которые нужно "нащелкать".

Здесь у нас основные реквизиты — Подразделение, Дата начала, Дата окончания. Так же есть "Результат" — с типом "Табличный документ".

Рис.1.Основная форма отчета.

 

Реквизиты и компоновка объекта "отчет" будут такими:

Рис.2. Настройка формы отчета. Определение реквизитов. Компоновка на форме.

 

На что обратим внимание в свойствах формы:

Рис.3. Результат отчета, данные расшифровки и настройки.

 

Пожалуй, это основные моменты самого объекта "отчет". Теперь, переходим к программной части отчета.

Для этого создадим внутри модуля отчета процедуру ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка).

 

В общем виде содержимое данной процедуры (ее можно скопировать) должно выглядеть вот так:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка     = Ложь;
ОсновнаяТаблицаЗапроса     = ПолучимТаблицуДанных();

СхемаКомпоновкиДанных     = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки      = КомпоновщикНастроек.ПолучитьНастройки();

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

ВнешнийНаборДанных     = Новый Структура("ДанныеОтчета", ОсновнаяТаблицаЗапроса);
ПроцессорКомпоновкиДанных  = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);

ДокументРезультат.Очистить();

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

КонецПроцедуры

 

Обратим внимание, на передачу ВнешнегоНабораДанных в ПроцессорКомпоновкиДанных. Мы передаем таблицу "ОсновнаяТаблицаЗапроса", данные которой получены функцией ПолучимТаблицуДанных().

 

Опишем в модуле отчета основную функцию  ПолучимТаблицуДанных(), которая определит в дальнейшем нашу таблицу внешнего источника, выглядит она вот так:

&НаСервере
Функция ПолучимТаблицуДанных()

ТаблицаРезультат = Новый ТаблицаЗначений;

ТаблицаРезультат.Колонки.Добавить("Дата");
ТаблицаРезультат.Колонки.Добавить("Номер");
ТаблицаРезультат.Колонки.Добавить("Реализация");
ТаблицаРезультат.Колонки.Добавить("Организация");
ТаблицаРезультат.Колонки.Добавить("Подразделение");
ТаблицаРезультат.Колонки.Добавить("Контрагент");

ТаблицаРезультат.Колонки.Добавить("Номенклатура");
ТаблицаРезультат.Колонки.Добавить("ЕдиницаИзмерения");
ТаблицаРезультат.Колонки.Добавить("Количество");
ТаблицаРезультат.Колонки.Добавить("Сумма");
ТаблицаРезультат.Колонки.Добавить("СтавкаНДС");

ТаблицаРезультат.Колонки.Добавить("СуммаБезНДС");
ТаблицаРезультат.Колонки.Добавить("СебестоимостьБезНДС");
ТаблицаРезультат.Колонки.Добавить("ТипНоменклатуры");
ТаблицаРезультат.Колонки.Добавить("Цена");
ТаблицаРезультат.Колонки.Добавить("ГруппаНоменклатуры");

ТаблицаРезультат.Колонки.Добавить("РаспределенияЗатрат");
ТаблицаРезультат.Колонки.Добавить("Процент");
ТаблицаРезультат.Колонки.Добавить("Склад");

ТаблицаРезультат.Колонки.Добавить("НадбавкаПоГруппе");
ТаблицаРезультат.Колонки.Добавить("СебестоимостьСНадбавкой");
ТаблицаРезультат.Колонки.Добавить("ВаловаяПрибыль");
ТаблицаРезультат.Колонки.Добавить("Премия");

// ==== далее наполним эту таблицу данными из запроса(ов) ====
// ==== Пишем запрос, который соберет (по "документам") все необходимые "реализации", "номенклатуры" и прочих реквизитов

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



// ==== Определение процентов и категорий распределения затрат

ОпределениеПроцентовИКатегорий();

// ==== Расчет ресурсов "Надбавки по группе", "Себестоимости...", "Валовой прибыли", "Премии"


//ОпределениеНадбавокИВаловойПрибыли1(); // метод 1

//ОпределениеНадбавокИВаловойПрибыли2(); // метод 2

ОпределениеНадбавокИВаловойПрибыли3(); // метод 3


// ==== Таблица "собрана", возвращаем результат:

Возврат ТаблицаРезультат;

КонецФункции

 

Первоначальная "идея" создания этой функции — собрать данные (любым правильным или неправильным способом) в описанную выше ТаблицаРезультат.

Для простоты дела необязательно писать огромный запрос, который соберет все и сразу (хотя это самый правильный подход).

Соберите и заполните строки "по-кусочкам", что значительно упростит подход. В этом и заключается "лайфхак", когда данные собираются частями (разными функциями, которые, кстати, можно менять в дальнейшем). Да, это медленнее.

 

В вышеуказанной функции, я провожу расчет Надбавок и Прибыли по функции "метод 3", остальные закомментированы, например "как устаревшие", но с сохранением алгоритма. Алгоритмы этих функций я не привожу в данной статье.

 

Так, будем, считать, что я собрал все необходимые данные в эту таблицу. Переходим к реализации в СКД.

 

Реализация в СКД

Теперь, "нащелкаем" компоновку СКД.

Создаем новый "НаборДанных1" и в имени объекта указываем "ДанныеОтчета" (см.рис.4). Затем, определяем все необходимые поля из таблицы "ДанныеОтчета". Прописываем типы, форматы, доступные значения и параметры редактирования.

Рис.4. Выбор объекта для набора данных. Определение полей отчета.

 

Затем, идем в закладку "Ресурсы", где определяем "числовые значения" отчета. Так же, "накликаем мышкой" (рис.1).

Рис.5. Ресурсы отчета.

 

Переходим на закладку "Настройки" и проводим уже окончательную настройку отчета — то, как он будет скомпонован (см. Рис 6). В "Выбранные поля" перемещаем реквизиты и ресурсы отчета. Сам отчет компонуем по реквизитам.

Рис.6. Итоговая компоновка отчета.

 

Так же в "других настройках" можно выбрать цветовое оформление отчета.

В итоге, все сохраняем и запускаем отчет в 1с предприятие. Смотрим, что получилось (см. рис.7). Получился красивый отчет по набору данных, собранный в СКД.

Рис.7. Готовый отчет СКД, созданный на основе собранного набора данных.

 

Заключение

Так, наконец, мы собрали отчет в СКД. Рабочий, с понятными настройками. Давайте отметим, какие основные плюсы и минусы данного метода:

 

Начнем с плюсов:

1.Небольшое время "сборки" отчета средней сложности.

2.Можно собрать "несобираемые" вещи в СКД, так же не заморачиваясь на сложных соединениях таблиц (например, подогнать все под единую таблицу и засунуть в компоновку).

3.Простая "расширяемость" отчета (легко добавить новые колонки).

4.Легко поменять алгоритмы расчета колонок (см выше).

 

Минусы, пожалуй, такие:

1.Невозможно расшифровать как собирается "число" в данном отчете. Никак.

2.Скорость работы на большом объеме информации будет в разы ниже, чем на отчете созданном единым запросом сразу в СКД.

 

Я описал лишь "базовый" подход к работе с наборами данных в системе компоновки данных.

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

Думаю, что если вы работаете с вменяемым объемом информации, на проверенных алгоритмах расчета получаемых данных, то данный способ вам пригодиться.

Всем спасибо, что дочитали данную статью до конца, надеюсь, что она оказалась вам полезна. Всем привет!

Все операции я делал на платформе 8.3.13.1865 и УНФ 1.6.

 

Предыдущие материалы

Так же, прошу посмотреть мои предыдущие статьи:

Работа с механизмом отладки 1С. Базовые настройки

1С + IIS + SSL: Перевод опубликованной базы на защищенное соединение https с сертификатом от Let’s encrypt

Дополнительные расходы на основе перемещения запасов в УНФ (пошаговая разработка расширения конфигурации)

Методика независимой системы "Подписки на события"

Подсистема "Подписки на события" (продолжение)

22 Comments

  1. VmvLer

    Пишу мнение на ходу, т.е. читаю абзац и тут же мнение

    1. Введение: слишком долгая прелюдия о личном, ну зачем мне знать с чем вы сталкивались на своем жизненном пути и какие кучи навоза разгребали — это же лайфак по конкретной задаче, а не анкета на сайте знакомств, нэ?

    2. Подготовка: Никакая это не подготовка, а набор хаотичных действий. Мысли вашего изложения не текут как

    ручеек в горы в долину, а прыгают аки горные бараны завидев снежного барса.

    Функция ПолучимТаблицуДанных() — что это за треш и угар, зачем учить плохому?

    3. Реализация в СКД: Очевидные скрины конструктора СКД. Спасибо, что очень мало текста, ведь было бы больно читать о том, что итак очевидно.

    4. Заключение: Просто субъективные выводы …ни о чем.

    Такие дела. Взялись писать лайфак, то хотя бы почитайте что это такое и как их пишут.

    Reply
  2. Yashazz

    Жесть. Я это ещё 12 лет назад делал, см. мои, хотя и обруганные многими, «полезняшки» https://infostart.ru/public/1133780/

    Reply
  3. user1166203

    Прям почувствовал боль SQL сервера от этого отчета…

    Reply
  4. wowik

    (1) не вижу чтобы вы написали на инфостарте хотя бы одну статью, интересно было бы посмотреть. Автору статьи +1.

    Reply
  5. VmvLer

    (5) у меня тут другое амплуа.

    Reply
  6. zqzq

    Так и не понял, зачем ЭТО, когда можно в 10 раз быстрее схему СКД с запросом накидать и форму по умолчанию. В качестве быстрой сборки отчета точно не подойдёт, только для специфичных условий, например в отчет передать результат другого отчета СКД.

    Если выкинуть всю лирику, вывод: внешние наборы данных иногда полезны, но чаще вредны.

    Reply
  7. BackinSoda

    Лайфхак, собственно, в использовании внешнего набора данных ?

    Плюсы спорные, то же время и написание запроса, что тут, что в скд самом. А вот невозможность расшифровки печалит.

    Reply
  8. marat3581525

    Автор молодец, хорошая статья. Не понимаю почему так коллеги по ремеслу набросились, автор старался.

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

    Reply
  9. Bassgood

    (9) Только называть «лайфхаком» работу с внешними наборами данных СКД, о которых и так уже имеется масса информации, как то не айс, это просто очередное описание использования возможностей СКД.

    Reply
  10. DmitrySinichnikov

    «Создаем свою форму» — зачем?!??!

    Reply
  11. Synoecium

    это скорее не лайфхак, а троллейбус из буханки :))

    При этом метод действительно полезен, но автор не раскрыл на примере наглядные плюсы внешних наборов данных(типа обход ограничений скд), не раскрыл тему расшифровки при таком способе и т.д. Поэтому статья вызывает противоречивые чувства, больше недоумение

    Reply
  12. SeiOkami

    Всё хорошо. Но в чём состоит «лайфхак» ?

    Reply
  13. Mellow

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

    Reply
  14. DedMoroz1983

    Думал вах, оказалось ох.

    Reply
  15. sokir

    Открыл Америку!

    Мы 10 лет программили незная про внешние источники.

    Reply
  16. ice-net

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

    Reply
  17. timeforlive

    Лайфхак заявлен на быстроту создания отчета, но мне что-то подсказывает, что быстрее будет сделать внешний отчет.

    Reply
  18. Praetori2017

    Зашел по ссылке из письма рассылки инфостарта. Зашел из-за этого «быстро оформить отчет.» Думал тут вообще про макеты.

    Reply
  19. ah7777777

    Нормальная статья. Я сам иногда пользуюсь таким методом когда собираю данные из несобираемого. например из базы 1с и DBF файлов. В СКД легко оформить читаемый отчет это его большой плюс и возможность и экспериментировать выходными формами как самому, так и отдать более-менее продвинутому клиенту.

    Reply
  20. darkdan77

    Ребята, давай жить дружно. Статья не тянет на лайфхак? Может и не тянет. Хотя, я думаю, многим будет полезно узнать о наборе данных «Объект» и, самое главное, ПРОИЗВОЛЬНЫМ заполнением полей набора данных Объект, где данные могут быть не только из базы 1с, а также из других источников (например файлов или других баз, в общем, куда запросом не залезешь). Вообще то, тема очень интересная. Предлагаю дополнить эту статью своими соображениями (статьями). Это будет продуктивнее, чем ругать автора.

    И еще, если статья кому-то полезна, то она имеет право на жизнь.

    Reply
  21. herfis

    В копилку продвинутых приемов ректального программирования.

    Ну или называть и подавать статью следовало несколько по-другому.

    Reply
  22. philya
    1.Невозможно расшифровать как собирается «число» в данном отчете. Никак.

    Автор. Ты вводишь в заблуждение.

    Прописываешь в форме отчета процедуру расшифровки, которая из данных расшифровки определяет, какую ячейку жмакнул пользователь и стоишь еще один отчет, если стандартное «расшифровать…» не подходит (в таблицу данных можно сложить еще немного данных, которые сгруппируются при выводе).

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *