СКД: 5 советов, как сделать лучше

27.10.21

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

Несколько примеров решения задач с использованием разных подходов

Оглавление

  1. Расшифровка строковых полей
  2. Чем соединение наборов данных лучше соединения таблиц в запросе
  3. Функция ВычислитьВыражение не всесильна. Иногда надо просто правильно посчитать итоги
  4. Макеты можно использовать не только для оформления
  5. Для чего стоит использовать расширения языка запросов при включенном Автозаполнении

 

1. Расшифровка строковых полей 

В отчете есть поле ссылочного типа (Номенклатура, Клиент, Приходная накладная). А мы выводим его дочернее поле. Например, для номенклатуры — полное наименование, для Клиента — публичное наименование. Красота! Только карточку номенклатуры или клиента уже не открыть (но иногда очень хочется) — в данных расшифровки нет ссылки.



рис. 1. В отчет выведено дочернее поле тип строка

 

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

 


рис. 2. Настройка условного оформления для отображения дочернего поля

 

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

 


рис. 3. Настройка свойства Выражение представления

 

Решение с помощью макета поля — создаем макет поля Партнер. Указываем ячейку поля. В ячейке указываем параметр и параметр расшифровки. Соответственно, параметр — это выводимый текст, для него указываем поле Партнер.НаименованиеПолное, а в параметре расшифровки указываем поле, которое содержит ссылку, т.к. ссылка нужна для открытия карточки элемента. И не забываем указать основное действие — Открыть значение.

 


рис. 4. Настройка макета поля

Все три способа продемонстрированы в этом видео

 

2. Чем соединение наборов данных лучше соединения таблиц в запросе

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



рис. 5. Различия в результатах при соединении таблиц и соединении наборов данных СКД

 

А вот что пишут на ИТС: Несмотря на то, что запись встречается в группировке несколько раз, при расчете итога каждая запись будет учтена только один раз. Как это работает в динамике можно посмотреть в этом видео.

 

3. Функция ВычислитьВыражение не всесильна. Иногда надо просто правильно посчитать итоги

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

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

 


рис. 6. Постановка задачи

 

Решение в лоб — получить последнюю запись, используя функцию ВычислитьВыражение() и параметры «Последняя» — «Последняя».
Но не все так просто. Написав такое в вычисляемых полях, а в ресурсах Сумма по этому полю, получим интересный результат.

 


рис. 7. Решение с помощью ВычислитьВыражение. Промежуточный результат

 

На уровне группировки Контрагент появляются неведомые значения.
Исправляем выражение в ресурсе — помещаем детальные записи в массив, берем максимум — Максимум (ВычислитьВыражениеСГруппировкойМассив («СуммаПоследняя»)).
В этом случае в группировке Контрагент последняя сумма отображается правильно.

 


рис. 8. Решение с помощью ВычислитьВыражение. Итоги в группировках верные

 

Идем дальше. А что в общих итогах? В общих итогах вовсе не сумма. Поэтому все, что далось непосильным трудом, имеет ограниченное применение. Как это решалось можно посмотреть в этом видео.


рис. 9. Решение с помощью ВычислитьВыражение. Общие итоги неверные

 

Как эта задача решается с помощью расчета итогов в СКД?
Это достигается посредством введения в набор данных поля-двойника для Суммы — в него можно вывести те же данные, что и в поле Сумма. Добавляем поле СуммаНачальныйОстаток, настраиваем роли полей: указываем, что Контрагент — это измерение, Период — поле периода, а поля Сумма, СуммаНачальныйОстаток входят в группу Сумма: одно поле является начальным остатком, другое конечным.
В выражении ресурсов для поля Сумма — просто Сумма(Сумма).



рис. 10. Настройка ролей для расчета остатков

 

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

 


рис. 11. Результат решения с помощью расчета остатков

Более детально можно посмотреть в этом видео.

 

4. Макеты можно использовать не только для оформления

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


Можно создать макет Поля и это никак не будет влиять на внешний вид результата. НО для поля можно задать Параметр расшифровки, и в СКД значение расшифровки может содержать не одно значение, а целую коллекцию — чем мы можем воспользоваться при расшифровке ячеек каким-либо другим отчетом.

 


рис. 12. Настройка полей расшифровки макета поля

 

После всех действий в данных расшифровки появится не одно, а несколько полей. В режиме 1С:Предприятие при попытке расшифровать поле это будет выглядеть так:


рис. 13. Результат работы расшифровки

 

5. Для чего стоит использовать расширения языка запросов при включенном Автозаполнении

Что такое расширение языка запросов? Это такие синтаксические конструкции в тексте запроса, заключенные в фигурные скобки, которые определяют поведение для компоновщика макета компоновки данных. В конструкторе запроса они доступны на вкладке Компоновка данных.

 


рис. 14. Что такое расширение языка запросов

 

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


рис. 15. Необязательный отбор по дате документа

 

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

 


рис. 16. Добавление своего поля отбора

 

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

 


рис. 17. Преимущество настройки - единое поле отбора

 

Когда надо наложить отбор на одно и то же поле в объединении запросов. Если в этом случае наложить отбор на поле Склад, это приведет к тому, что в запросе по РН Продажи ничего не будет выбрано.

 


рис. 18. Поле склад в объединении запросов


рис. 19. Результат наложения отбора по полю Склад при такой настройке

 

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

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

 


рис. 20. Добавление своего поля отбора. Результат при такой настройке

 

Рекомендуем освоить создание схемы без Автозаполнения — сразу придет понимание, как это работает.
 

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159730    876    399    

862

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8741    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    7015    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3159    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10843    23    John_d    25    

124

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

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

05.12.2023    8062    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6915 27.10.21 11:42 Сейчас в теме
Годный контент! Спасибо!
user1230640; wolfalan; rozer; Neti; +4 Ответить
2. aximo 2100 27.10.21 12:02 Сейчас в теме
по макетам - можно вот эту статейку почитать https://infostart.ru/1c/articles/1178202/
3. ixijixi 1913 28.10.21 09:14 Сейчас в теме
Коллеги, вопрос.

Каким образом можно (без отключения автозаполнения!) запретить СКД накладывать отборы на временные таблицы, а применять отбор только на последний запрос пакета?

Например, есть запрос:
ВЫБРАТЬ
	Т.Подразделение КАК Подразделение,
	Т.СтатьяФинансирования КАК СтатьяФинансирования
ПОМЕСТИТЬ ВТСвойстваПодразделений
ИЗ
	РегистрСведений.БухучетЗарплатыПодразделений КАК Т
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Подразделения.Ссылка КАК Ссылка,
	СвойстваПодразделений.СтатьяФинансирования КАК СтатьяФинансирования,
	СвойстваПодразделений.СтатьяФинансирования.Код ЕСТЬ NULL КАК НетФинансирования
ИЗ
	Справочник.ПодразделенияОрганизаций КАК Подразделения
		ЛЕВОЕ СОЕДИНЕНИЕ ВТСвойстваПодразделений КАК СвойстваПодразделений
		ПО (СвойстваПодразделений.Подразделение = Подразделения.Ссылка)
Показать


СКД, при установке отбора по подразделению, преобразует его в запрос
ВЫБРАТЬ
	Т.Подразделение КАК Подразделение,
	Т.СтатьяФинансирования КАК СтатьяФинансирования
ПОМЕСТИТЬ ВТСвойстваПодразделений
ИЗ
	РегистрСведений.БухучетЗарплатыПодразделений КАК Т
ГДЕ
	Т.Подразделение = &П
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Подразделения.Ссылка КАК Подразделение,
	СвойстваПодразделений.СтатьяФинансирования КАК СтатьяФинансирования,
	СвойстваПодразделений.СтатьяФинансирования.Код ЕСТЬ NULL КАК НетФинансирования,
	Подразделения.Представление КАК ПодразделениеПредставление,
	ПРЕДСТАВЛЕНИЕССЫЛКИ(СвойстваПодразделений.СтатьяФинансирования) КАК СтатьяФинансированияПредставление
ИЗ
	Справочник.ПодразделенияОрганизаций КАК Подразделения
		ЛЕВОЕ СОЕДИНЕНИЕ ВТСвойстваПодразделений КАК СвойстваПодразделений
		ПО (СвойстваПодразделений.Подразделение = Подразделения.Ссылка)
ГДЕ
	Подразделения.Ссылка = &П
Показать


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

ПС: Пример сферический в вакууме, важен сам принцип)
Прикрепленные файлы:
ВнешнийОтчет1.erf
4. toypaul 63 28.10.21 09:41 Сейчас в теме
(3) Вот так работает

ВЫБРАТЬ
ПриходнаяНакладная.Ссылка КАК Ссылка,
ПриходнаяНакладная.Контрагент КАК КонтрагентПриход
ПОМЕСТИТЬ приход
ИЗ
Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
РасходнаяНакладная.Ссылка КАК Ссылка,
РасходнаяНакладная.Контрагент КАК Контрагент,
приход.Ссылка КАК Ссылка1
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ЛЕВОЕ СОЕДИНЕНИЕ приход КАК приход
ПО РасходнаяНакладная.Контрагент = приход.КонтрагентПриход
{ГДЕ
РасходнаяНакладная.Контрагент.*}
5. ixijixi 1913 28.10.21 09:45 Сейчас в теме
(4) Ну то есть тупо переименовать поле в первом запросе пакета?
6. toypaul 63 28.10.21 09:46 Сейчас в теме
(5) лучше умно переименовать :) и на досуге полезно почитать https://infostart.ru/1c/articles/1219807/
7. echo77 1906 28.10.21 11:15 Сейчас в теме
(3)
Используя расширение языка запросов во временной таблице задать другой псевдоним полю:
{ВЫБРАТЬ
	Подразделение.* КАК НеИспользовать}

Внешне в конструкторе СКД ничего не изменится, но работать будет иначе. Проверялось на платформе 8.3.18.1289

То есть, вот так:
ВЫБРАТЬ
    Т.Подразделение КАК Подразделение,
    Т.СтатьяФинансирования КАК СтатьяФинансирования
ПОМЕСТИТЬ ВТСвойстваПодразделений
{ВЫБРАТЬ
	Подразделение.* КАК НеИспользовать}
ИЗ
    РегистрСведений.БухучетЗарплатыПодразделений КАК Т
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Подразделения.Ссылка КАК Ссылка,
    СвойстваПодразделений.СтатьяФинансирования КАК СтатьяФинансирования,
    СвойстваПодразделений.СтатьяФинансирования.Код ЕСТЬ NULL КАК НетФинансирования
ИЗ
    Справочник.ПодразделенияОрганизаций КАК Подразделения
        ЛЕВОЕ СОЕДИНЕНИЕ ВТСвойстваПодразделений КАК СвойстваПодразделений
        ПО (СвойстваПодразделений.Подразделение = Подразделения.Ссылка)
Показать


Если во временной таблице используется обращение к виртуальной таблице, в которой накладывается нежелательный отбор, то так же меняем псевдоним поля в параметрах виртуальной таблицы:
{Подразделение.* КАК НеИспользовать}

В этом случае среди полей набора данных будет добавлено поле НеИспользовать - для него можно наложить ограничение доступности, чтобы не смущало пользователей
eeeio; independ; maytuganov; AlexK_2012; JohnyDeath; abasovit; starik-2005; Irwin; Vond; Neti; +10 Ответить
8. ixijixi 1913 28.10.21 12:10 Сейчас в теме
9. Neti 2538 28.10.21 12:37 Сейчас в теме
(7) Ничоси! А что так можно было?
10. Vond 28.10.21 12:58 Сейчас в теме
(7) Однако же... Прекрасный лайфхак. Горизонты расширены, спасибо )
AlexK_2012; echo77; +2 Ответить
13. Yashazz 4791 29.10.21 10:16 Сейчас в теме
(7) При программной работе с СКД не прокатывает. По крайней мере, у меня ни разу не прокатило, сколько ни пытался - игнорит всё это. Только через конструктор в конфигураторе.
11. mixsture 28.10.21 13:17 Сейчас в теме
2. Чем соединение наборов данных лучше соединения таблиц в запросе


И есть еще "чем хуже". Хуже тем, что меняет левые соединения на полные по своему разумению вне зависимости от того, что вы задали.
(кажется, это срабатывало при отборе по полю присоединяемой таблицы. Причем любому, даже "Не заполнено"). Как по мне - это способно перекрыть все плюсы, т.к. вызывает трудноуловимые баги в зависимости от отборов у пользователя.
12. echo77 1906 28.10.21 16:18 Сейчас в теме
(11) На ИТС пишут
В схеме компоновки данных нет указания типа связи. Все связи считаются левыми внешними соединениями. То есть запись родительского набора данных будет использоваться в компоновке даже в том случае, если для нее не найдены записи в зависимом наборе.

Поделитесь примером, как у вас получилось создать полное соединение?
14. Yashazz 4791 29.10.21 10:44 Сейчас в теме
(12) Это в конкретике возникает. Бывают случаи, не объяснимые с позиции известных материалов и обычной логики, когда соединение отрабатывает как полное. Уже обсуждалось пару раз на ИС ещё в 12-13 годах.
15. echo77 1906 29.10.21 10:51 Сейчас в теме
(14) Я и прошу конкретные примеры - тоже хочу посмотреть.
19. Zhek 02.11.21 07:42 Сейчас в теме
(11)
И есть еще "чем хуже"...

Главное "хуже" - это производительность. Наборы данных, похоже, соединяются аналогом "вложенных циклов" SQL, т.е перебором строк. Если в наборах много строк, то все печально.
Как-то давно типовой отчет по среднегодовой стоимости имущества формировался 2 часа. В одном наборе основные средства - 80 000 штук, в другом наборе - доп. сведения по основным средствам из регистра, тоже в районе 80 000 штук. После того, как переписали на левое соединение в запросе, отчет стал формироваться нормально.
16. mixsture 29.10.21 12:31 Сейчас в теме
Давно было, но кажется так: делаем 2 источника со связью, ставим отбор по полю первой таблицы + отбор по полю второй. В результате получаем усеченную выборку так, как будто соединение полное (т.е. выкидываются строки первой таблицы, которых нет во второй). Убираем отбор по полю второй таблицы и соединение превращается в левое. Причем работает абсолютно независимо от вида отбора и значений отбора.
17. echo77 1906 29.10.21 14:14 Сейчас в теме
(16)
получаем усеченную выборку так, как будто соединение полное (т.е. выкидываются строки первой таблицы, которых нет во второй)

Здесь описано ВНУТРЕННЕЕ соединение.
И да, если при соединении наборов данных данных СКД наложить отбор по полю Приемника связи - мы получим ВНУТРЕННЕЕ соединение. Что вполне логично (при связи таблиц в запросе результат такой же)
Про виды соединений можно почитать здесь

p.s. Если интересно как работают такие штуки в СКД и хотите получить ответы - пишите мне в телеграм, я провожу курс.
18. mixsture 29.10.21 18:12 Сейчас в теме
(17) да, пардон. Внутреннее, конечно. Отвлекался, пока писал. И нет, не логично и при связе таблиц в запросе совсем по-другому работает (там левое остается левым, но использование поля без выкидывания null-значений делает любое условие ложным, когда натыкается на null. А тут левое становится внутренним и не важно, избавляетесь вы от null-значений или нет - все равно получаете усеченную выборку. Более того, это никак не переспорить, когда нужно другое поведение отчета).
Оставьте свое сообщение