Грабли на СКД

25.11.21

Разработка - СКД

Наиболее частые проблемы, с которыми сталкиваются программисты 1С при разработке отчетов на СКД.

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

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

Оглавление

  1. Выбранные поля в разных элементах структуры. Автополе и отключенное поле
  2. Расположение итогов = нет
  3. Ресурсы рассчитываются только для группировок
  4. Параметр Период – Стандартный период
  5. Параметры Период, НачалоПериода, КонецПериода
  6. Установка параметров выражением НайтиПоКоду(), НайтиПоНаименованию()
  7. Отборы в наборе данных объект
  8. Некорректный расчет итогов

 

Выбранные поля в разных элементах структуры. Автополе и отключенное поле

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

 

 

Рис. 1. Индивидуальная настройка полей выбора в каждой группировке


Рис. 2. В группировке отключено использование выбранного поля


В общем, это не плохо, когда вы контролируете какие поля в каждой группировке. Но для того чтобы понять, в какой группировке какие поля выводятся – придется прощёлкать все группировки. Также бывают ситуации, что на уровне отчета выбраны одни поля, а поскольку в выбранных полях группировки отсутствует Автополе, то они не выводятся, и приходится проверять настройки.

Вывод: Я рекомендую по максимуму располагать выбранные поля на уровне Отчет, а в группировках дополнять/исключать поля совместно с автополем.

Бывает еще такая ситуация: на уровне отчета указываются несколько выбранных полей, в группировке в выбранных полях есть Автополе, и добавлено поле Сумма, но его использование отключено. На первый взгляд отключенное поле не будет оказывать влияние не результат, но это не так – убедиться в этом можно, развернув Автополе.


Рис. 3. Какие поля будут выведены при такой структуре отчета?

 

Рис. 4. Перечень полей, если развернуть Автополе

 

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

Вывод: Такое поведение кажется неявным, тем не менее отсутствие выбранного поля <> присутствие поля с отключенным использованием.

 

Рис. 5. Результат при такой настройке

 

Расположение итогов = нет

Наверное, самые частые грабли, которые я видел на форумах. К счастью, это легко проверяется. Симптомы: разработчик добавляет в выбранные поля ресурсы, но ресурсы не выводятся в отчет. Как правило, разработчик хочет добиться отключения общих итогов по горизонтали или по вертикали, а получается так. Структура, как правильно имеет следующий вид:

 

Рис. 6. Настройки

 

Но в итоге отчет выглядит следующим образом:

Рис. 7. Вид отчета с настройкой Расположение итогов = нет

 

Все дело в настройках на вкладке дополнительно – Расположение итогов = нет. Установив эту настройку, ресурсы вообще не выводятся. Здесь надо четко понимать расположение итогов – отвечает за вывод всех ресурсов в группировке, Расположение общих итогов, Расположение общих итогов по горизонтали, по вертикали – отвечает за то, где будет располагаться секция Итого по группировке.

 

 

Рис. 8. Настройка Расположение итогов, Расположение общих итогов.

 

Для чего может пригодиться управление дополнительными параметрами Расположение итогов, Расположение группировок продемонстрировано в этом видео: и здесь.

Вывод: Не отключайте расположение итогов, вам скорее всего нужна настройка Расположение общих итогов :-)

 

Ресурсы рассчитываются только для группировок

Значения ресурсов не вычисляются для детальных записей, но есть нюансы. Например, в схему добавлено вычисляемое поле ТоварыВГруппе


 
Рис. 9. Вычисляемое поле

 

Поле сделано ресурсом - для него указано выражение ресурса.


Рис. 10. Выражения ресурсов

 

Если в детальных записях будет присутствовать хотя бы одно поле, не являющееся ресурсом, например поле Регистратор, то результат будет следующим… 

 

Рис. 11. Настройки компоновки. В детальных записях поле Регистратор

 

Значение ресурса не будет вычислено (и соответственно выведено) в детальных записях:

 

 

Рис. 12. Значение ресурса не определено в детальных записях

 

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

 

Рис. 13. Детальные записи в группировке


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

 

Параметр Период – Стандартный период

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

 

  

Рис. 14. Настройки параметров периода

 

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

 

 

Рис. 15. Ошибка: Несоответствие типов

 

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

Вывод: Чтобы избежать путаницы, я рекомендую параметру с типом СтандарныйПериод присваивать имя, отличное от Период, например «ПериодОтчета»

 

Рис. 16. Параметры Период, СтандартныйПериод на своем месте

 

Параметры Период, НачалоПериода, КонецПериода

При использовании в СКД флага Автозаполнение в схему буду добавлены параметры виртуальных таблиц: Период – для виртуальных таблиц СрезПервых, СрезПоследних, Остатки, а так же НачалоПериода, КонецПериода – для виртуальных таблиц Обороты, ОстаткиИОбороты. Бывают случаи, когда необходимо использовать виртуальную таблицу с пустым параметром периода и проморгать, что для нее будет использоваться такой параметр, хотя в нашем случае мы хотели бы оставить параметр пустым.

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

Вот такой запрос:

ВЫБРАТЬ
	ТоварныеЗапасыОстатки.Товар КАК Товар,
	ТоварныеЗапасыОстатки.Склад КАК Склад,
	ТоварныеЗапасыОстатки.КоличествоОстаток КАК КоличествоОстаток,
	ЦеныТоваровСрезПоследних.Цена КАК Цена
ИЗ
	РегистрНакопления.ТоварныеЗапасы.Остатки КАК ТоварныеЗапасыОстатки
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(&ПериодЦены, ВидЦен = &ВидЦен) КАК ЦеныТоваровСрезПоследних
		ПО ТоварныеЗапасыОстатки.Товар = ЦеныТоваровСрезПоследних.Товар

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

ВЫБРАТЬ
	ТоварныеЗапасыОстатки.Товар КАК Товар,
	ТоварныеЗапасыОстатки.КоличествоОстаток КАК КоличествоОстаток,
	ЦеныТоваровСрезПоследних.Цена КАК Цена,
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ТоварныеЗапасыОстатки.Товар) КАК ТоварПредставление
ИЗ
	РегистрНакопления.ТоварныеЗапасы.Остатки(&amp;П) КАК ТоварныеЗапасыОстатки
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(&amp;П, ВидЦен = &amp;ВидЦен) КАК ЦеныТоваровСрезПоследних
		ПО ТоварныеЗапасыОстатки.Товар = ЦеныТоваровСрезПоследних.Товар

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

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

Установка параметров выражением НайтиПоКоду(), НайтиПоНаименованию()

Случай, когда в схеме для параметров прописывается выражение вида:

Справочник.Контрагенты.НайтиПоКоду("444")

Здорово, что в СКД так можно делать – написать выражение на встроенном языке, которое будет вычислено при компоновке результата. Но! А что будет если в результате поиска ничего не будет найдено? Правильно – параметру будет присвоена пустая ссылка и мы об этом не узнаем, т.к. ограничение доступности для этого параметра стоит. 

 

Рис. 17. Выражения в параметрах СКД
 

Вывод: Я рекомендую устанавливать значения параметров компоновки данных в событии ПриКомпоновкеРезультата, при чем, проверяя все результаты поисков и сообщая о непредвиденных результатах пользователю.


Отборы в наборе данных объект

Если добавить набор данных объект и для полей набора данных не указать свойство Тип значения, то в настройках отбора будет доступно лишь сравнение с полем компоновки данных. На скриншоте ниже для Поле1 – не указан тип и система не будет знать из какого справочника предлагать пользователю значения сравнения, для поля Поле2 – указан тип справочник Контрагенты, соответственно в элементе отбора будут предлагаться элементы этого справочника.

 

 

Рис. 18. Набор данных объект. Для Поле1 не указан Тип значения.

 

Рис. 19. Отбор по полю набора данных объект, для которого не указан тип значения.

 

Вывод: при использовании набора данных объект, если предполагается отбор по полю – указываем его тип в настройках. Можно указывать тип для всех полей

 

Некорректный расчет итогов

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

 

Рис. 20. Пример правильной настройки ролей

 

Тем не менее, для того чтобы СКД правильно расставила порядок, одного поля Регистратор недостаточно, нужно еще поле Период и оно даже есть в нашем наборе данных (на скриншоте). Но, если это поле не используется в настройках компоновки, то компоновщик макета его удаляет и результат в группировках может быть вычислен неправильный. Чтобы такого не было – в роли поля Период ставим флаг Обязательное.

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

1. В наборе данные присутствуют данные виртуальной таблицы ОстаткиИОбороты, но выбирается только Начальный или только Конечный остаток

2. Объединение виртуальной таблицы ОстаткиИОбороты еще с какими-то данными

Описано в статье СКД: Корректный расчет остатков по нескольким регистрам, в этом видео

 

p.s. Очень надеюсь, что статья прояснила некоторые моменты для тех, кто только осваивает механизм СКД.

СКД

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122183    673    389    

714

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4045    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8161    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4658    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5807    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

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

18.09.2023    6703    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    4521    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Бэнни 203 02.11.21 11:34 Сейчас в теме
Вот это хорошо!
kaaasteeen; DrAku1a; criptid; orfos; echo77; +5 Ответить
2. tindir 02.11.21 14:09 Сейчас в теме
СКД прекрасный инструмент. Но он обладает всеми признаками наркотика =) На нее легко подсаживаешься, с ней перестаешь чувствовать границы дозволенного..и вот ты уже в настройках группировки рисуешь третье подряд автополе с отборами внутри колонки таблицы данных...

А еще отдельно пожатие шеи заслужил тот идеолог БСП, который решил в свежих релизах на уровне пользователя дописывать поля детальных записей в группировки с автополе.
onsi; user635629_exter; aexeel; Yashazz; sapervodichka; +5 Ответить
3. sapervodichka 6697 03.11.21 02:07 Сейчас в теме
(2) в одном этом умозаключении больше мысли чем в некоторых статьях )))
4. awk 741 03.11.21 08:19 Сейчас в теме
Все верно – т.к. в параметр Период, виртуальной таблицы СрезПоследних передано значение типа СтандарныйПериод.
Для исправления ошибки в параметр виртуальной таблицы надо передавать значение правильного типа (Дата), а не СтандарныйПериод.

Вывод: Чтобы избежать путаницы, я рекомендую параметру с типом СтандарныйПериод присваивать имя, отличное от Период, например «ПериодОтчета»

Или в запросе добавить {&НачалоПериода},{&КонецПериода}, {&ПустойПериод} и т.п. в зависимости от задачи.
5. Yashazz 4709 03.11.21 12:18 Сейчас в теме
На самом деле это всё семечки А вот как себя ведёт СКД с RLS или сохранёнными настройками управляемой формы - вот это и правда грабли. Платформенные и потому нерешаемые, их только аккуратно обойти можно. Иногда.
6. Yashazz 4709 03.11.21 13:53 Сейчас в теме
Ну или что вытворяет СКД с помещением во временное хранилище и последующей инициализацией компоновщика настроек по адресу хранилища, особенно в обычных формах - тоже грабли жёсткие.
7. echo77 1868 03.11.21 14:58 Сейчас в теме
(6) А можно пример? И пример как помещаете
8. Yashazz 4709 04.11.21 06:51 Сейчас в теме
(7) а элементарно - при открытии формы вызываю инициализацию СКД и компоновщика (он реквизит обработки, допустим), помещаю в хранилище по свежесозданному GUIDу (форма-то обычная, пусть его на сеанс), юзер делает настройки компоновщика, вызываю формирование, в модуле обработки беру СКД из хранилища, и - начинаются чудеса. То выбранные поля настройки пропадут, то роли и типизация полей набора уедет, то идентификаторы юзерских настроек сбросятся/переопределятся. Что интересно, от запуска к запуску поведение отличается)

а насчёт прав давеча наблюдал - делаем СКД на упр.форме, 2 запроса - к шапке документа и к его же таб.части, внутреннее соединение по ссылке. Говорит, что у пользователя нет прав на операцию с БД. Убираем из запроса таб.часть - работает. Делаем запрос в консоли с табчастью - работает. Смотрим запрос макета - тоже всё ровно. Но по шапке берёт, а по таб.части доступа, вишь, нету. На чтение, ага. Делаем ровно то же на обычной форме - вуаля, никаких проблем с доступом.

Вот это я понимаю, грабли.
9. echo77 1868 04.11.21 06:56 Сейчас в теме
(8)
при открытии формы вызываю инициализацию СКД и компоновщика (он реквизит обработки, допустим), помещаю в хранилище по свежесозданному GUIDу (форма-то обычная, пусть его на сеанс), юзер делает настройки компоновщика, вызываю формирование, в модуле обработки беру СКД из хранилища, и - начинаются чудеса.

Похоже, что значение во временном хранилище было уничтожено. А можете код показать?

беру СКД из хранилища

Вот здесь я бы посмотрел какое значение получаем из хранилища - при первой компоновке, при последующих.
10. Yashazz 4709 04.11.21 06:57 Сейчас в теме
(9) Уже нет, я вообще принципиально иначе всё сделал. А если б оно было уничтожено, его бы ваще не было. Но СКД была, просто у неё фрагментарно чего-то пропадало. Подозреваю, дело во внутреннем сжатии/сериализации СКД в хранилище и назад.
12. Yashazz 4709 04.11.21 07:03 Сейчас в теме
(9) Смотрел, естессно. СКД и получаем. Но не совсем такое, как помещали.
11. Yashazz 4709 04.11.21 07:00 Сейчас в теме
(8) Когда смотришь отладчиком всё, что можно, и всё одинаковое, но на обычной форме работает, а на управляемой - орёт про доступ, причём никаких RLS на объект нет, поневоле вспоминаешь про хеллоуин)))
13. cdiamond 233 04.11.21 09:35 Сейчас в теме
Есть еще знатная пользовательская грабля, когда настройка структуры отчета вовсе не на кнопке "Настройки" и пользователь решает что такой настройки вовсе нет.
14. Hatson 528 07.11.21 22:17 Сейчас в теме
Если смотреть на СКД как на инструмент, то выходит, что это какая-то сырая недоработка. Не должно быть таких странных скрытых неочевидных артефактов. Грабли с автополем особенно доставляют.
15. echo77 1868 08.11.21 05:54 Сейчас в теме
(14) Не согласен. Все вполне логично, поведение с автополем тоже - думаю, это вытекает из принципа: нельзя два раза вывести одно и тоже выбранное поле. Если добавить в выбранные поля Автополе и еще какое-то поле, а затем развернуть автополе, то среди выбранных полей каждое поле будет только один раз, например: на уровне отчет выбираем поле Номенклатура, добавляем группировку Номенклатура, в её выбранных полях есть Автополе, в выбранные поля группировки добавляем поле Номенклатура, разворачиваем автополе - в результате в выбранных полях поле Номенклатура присутствует только один раз.
16. Hatson 528 08.11.21 10:00 Сейчас в теме
(15) В этом случае было бы логично запретить добавлять поля вместе с автополем. То есть или все поля добавляем вручную, или всё автоматически.
17. lastpioneer 231 30.12.21 14:12 Сейчас в теме
Спасибо. Очень вовремя наткнулся на статью!
Оставьте свое сообщение