Игнорировать значения null скд

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

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

Трюк №1. Многоликость правого значения.

Пример.
В качестве примера я не стал изобретать велосипед, а взял самую обычную оборотно-сальдовую ведомость по счету 60 из демо-версии 1С:Бухгалтерии (я использую ред. 2.0.). Кто не знает, начиная с редакции 2.0 этот отчёт сделан на базе СКД.

Итак, зададим прямо в ней отбор для строк с условием "БУ Дт (оборот)" Равно "БУ Кт (оборот)", а также применим к отчёту условное оформление, подсветив жёлтым цветом ячейки строк, где "БУ Кт (кон. сальдо)" Больше "БУ Кт (оборот)". Если кто не знает, как включить панель "Оформление" — найдите кнопку "Параметры панели настроек" справа от надписи "Панель настроек".

Конечный результат должен получиться примерно таким:

Трюк №2. Отбор на группировках.

Пример.
Цель примера: отобразить ОСВ, в которой для взаиморасчетных счетов (60,62,76) показать расшифровку по контрагентам, а для затратных (20,23,25,26) — по статьям затрат.

Сама СКД реализована в виде набора данных, где используется запрос к виртуальной таблице остатков и оборотов регистра бухгалтерии "Хозрасчетный".
Размещаем вложенные группировки "Организация" и "Счет". В группировке "Счет" параллельно размещаем 2 группировки "Субконто1" и "Субконто2", для которых задаем соответствующие отборы.
Иллюстрацию настройки привожу в скриншоте:


Если в основных настройках отчёта на закладке "Другие настройки" вы не отключали вывод отборов, то это обязательно нужно будет сделать в "других настройках" наших группировок "Субконто1" и "Субконто2"

Трюк №3. Шапка-невидимка

При разработке схемы в предопределённом макете оформления добавьте макет группировки, с определением по имени группировки "Невидимка" так, как показано на скриншоте. Обратите внимание, что поле "Область" должно остаться пустым!

А затем задайте для группировки "Субконто2" имя "Невидимка":

И вуаля. шапка группировки "Субконто2" исчезает, а отчёт становится вот таким:

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

Да, есть ещё один ньюанс этого трюка: учитывайте, что "шапка-невидимка" накрывает не только эту группировку, но и все нижестоящие! Т.е. если вы назначите имя "Невидимка" группировке "Субконто1", то в шапке не будет видно ни "Субконто1", ни "Субконто2"!

Трюк №4. Называй меня как хочешь



После всех настроек вариант отчёта выглядит вот так:



P.S.
Небольшая подсказка для тех, кто будет качать схему. Схема — одна, но все трюки выполнены в виде отдельных вариантов настроек отчёта этой схемы:

В процессе разработки отчетов на СКД в 1с предприятие часто возникает задача вывода нулей в пустые поля отчета. Дело в том, что, при отсутствии необходимых данных в базе, запрос возвращает не число 0, а специальное значение NULL, которое затем необходимо преобразовать в число. Например, если мы напишем

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

У вас есть вопрос, нужна помощь консультанта?

Но представим, что мы используем соединение 2 наборов данных в СКД, и результат одного из них оказывается пустым. В этом случае нам не поможет конструкция ЕСТЬNULL в тексте запроса этого набора, т.к. он вернет пустую выборку. Там не будет значений NULL, которые можно было бы преобразовать в 0, там вообще ничего не будет. NULL появляется только после соединения наборов данных, а за это отвечает система компоновки. Оставшийся выход — воспользоваться вычисляемыми полями. В нашем примере нам придется создать вычисляемое поле "Цена" и прописать в его выражение ЕСТЬNULL (Цена,0). К моменту срабатывания выражений вычисляемых полей уже произойдет соединение запросов, так что у нас уже будет поле "Цена", и оно будет содержать NULL. Создавая вычисляемое поле с таким же именем, мы по сути переопределяем поле, которое вернули нам наборы данных.

Читайте также:  Вычислить значение матричного многочлена

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

зато есть необходимость менять текст запроса, создавать ТЗ, загружать его в СКД и прочее. А посчитать case для строчки дело не сложное, к тому же в моем примере идет сравнение чисел, что в общем-то вряд ли сильно затруднит обработку.

Но я так же могу поспорить и с фразой "правильный — значит быстродейственный." Мы пишем не на С++ и 1С сама по себе довольно медлительна и много где теряет производительность. Вообще код в 1С должен соблюдать баланс между скоростью работы и скоростью восприятия этого кода другим программистом. По моему сугубо личному мнению все эти обработки при компановке, передача ТЗ как внешний источник и прочие извращения это от криворукости, когда человек не может в СКД сделать нормальный запрос. И анализировать это разбирая процедуры, которые наваял автор бывает довольно проблемно. И если вы ради вычисления одного поля будете всё переносить в модуль, то. ну даже не знаю. Бывают ситуации, когда без этого не обойтись, но они бывают редко.

однако вариант с переносом расчета периода из запроса в вычисляемые поля он и правда с этой точки зрения лучше, тк всё воспринимается ещё легче.

Не считаете — обоснуйте, почему.

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

Я только что специально протестировал этот механизм с использованием планировщика(только сам запрос), чтобы я ни делал выше 0% общая стоимость выполнения comptute scalar не превышала, там что-то в районе 0.000000014 общая стоимость. Поэтому истории про то, что тяжело рассчитать case для каждой строчки несколько надуманы.
Кстати что интересно в SQL запрос попадает не весь case а только верный вариант, не знаю с чем это связано пока.

Я стесняюсь спросить, ЧТО вы еще собираетесь в отчете с вертикальной группировкой по периоду? Регистр сведений? Может вообще дату документов? Опять же возвращаемся к разговору про быстродействие.

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

Lyns_owner 339 03.02.15 00:38 Сейчас в теме

Мы пишем не на С++ и 1С сама по себе довольно медлительна и много где теряет производительность

А вам сказать, благодаря кому она такая медленная? или Сами догадаетесь? А тестировали вы на каких данных? Сколько строк в результирующем запросе? 10?
Программист пишет не так, чтобы это было легко сделать (очень близко к определению понятия "говнокод"), а так, чтобы это работа правильно и максимально быстро.
Да извольте анализировать процедуры, написанные автором. Все правильное реализуется непросто, а что реализуется просто — то поделка школьника. Возьмите к примеру запросы вычисления страховых взносов в ЗУПе — их тупо листать устанешь, не то что разбирать. А на первый взгляд, там сложного ничего нет — есть база и есть процент))

Разворот по датам, которые брались из документа(но не дата документа) довольно сложная аналитическая самописная конфа для финансового планирования и ради одного отчета делать регистр начальство не посчитало нужным

В корне неправильный подход. Возвращаясь к вопросу о быстродействии 1с — чего вы хотели, если не используете возможности платформы (виртуальные таблицы в частности)?

Но дело ведь не в этом, правда? 🙂

Читайте также:  Загрузчику ресурсов не удалось найти файл mui

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

Slazzy 38 03.02.15 12:19 Сейчас в теме

А еще ваши ответы характеризуют вас как некомпетентного специалиста.

А теперь по делу. Сделал регистр сведений, добавил туда пару полей и одно из полей Дата, добавил в него 510к строк. Судя по плану запроса вычисление периода тратит 1% от общего времени(ориентировочно)

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

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

(), я надеюсь на этом мы закончим нашу беседу, мне она не очень интересна, извините уж:)

Проконсультироваться
со специалистом 1С

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

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

В таблице «Поля» заполняются свойства:
1. «Поле» — имя поля, в случае запроса заполняется автоматически, в случае набора данных «Объект» определяется вручную.

2. «Путь» — указывается путь к данным из набора. Именно это название, указанное в этом поле будет фигурировать во всех дальнейших настройках СКД.

3. «Заголовок» — строка с заголовком поля, которые выводится в отчет или в настройках

4. «Ограничение доступности поля» — ряд галочек – настроек, служит для указания того, как данное поле не может быть использовано в настройках. Возможно, указать такие ограни-чения
a. «Поле» — поле нельзя использовать в выборках СКД
b. «Условие» — поле нельзя использовать как условие
c. «Группа» — запрет на использование поля в группировках
d. «Упорядочивание» — запрет использовать поле в сортировках

5. «Ограничение доступности полей-реквизитов» — ряд галочек ниже, указывает на ограничения для реквизитов поля, смысл установки данных ограничений такой же что и в для поля

6. «Роль» — обозначает дополнительные свойства поля и его взаимоотношения с другими полями. Для редактирования ролей открывается специальный диалог:

a. «Без роли» — никаких особых «нагрузок» на поле не накладывается, режим по умолчанию для большинства полей
b. «Период» — содержит номер периода, если поле имеет тип периода. Самый младший период должен иметь тип 1. Например, в запросе рассчитываем итоги по различным периодам: ПериодСекунда = 1, ПериодДень=2, ПериодНеделя=3 и т.д. Данный номер будет указывать, как в СКД рассчитывается итоги по полям остатка.
c. «Дополнительный» – указывает на то, что поле–период не является обязательным
d. «Счет» — указывает на то, что поля является бухгалтерским счетом, используется для рас-чета бухгалтерских итогов.
e. «Вид» — строка выражение, с помощью которого рассчитывается вид счета. Результатом выражения должно быть значение перечисления ВидСчета (Активный, Пассивный, Активно/Пассивный), либо число. Значение числа 0 соответствует активному счету, 1 – пассивному, 2 – активно-пассивному. Выражение записывается на языке выражений системы компоновки данных. Данная информация используется при расчете по полям бухгалтерских остатков;
f. «Остатки» – признак того, что поле является полем остатка;
g. «Имя» – строка, содержащая имя группы полей остатка. Например: "Сумма", "Количест-во";
h. «Тип» – тип остатка (НачальныйОстаток, КонечныйОстаток, Нет (поле не является остат-ком));
i. «Бух. Тип» – тип бухгалтерского остатка (Дебет, Кредит, Нет (поле не является бухгалтерским остатком));
j. «Поле счета» – имя поля-счета, для которого рассчитываются остатки;
k. Игнорировать значения NULL – если установлено, то в результат не нужно включать групповые записи по данному полю в случае, если поле содержит значение NULL.
l. «Обязательное» — при выполнении запроса поле с указанным флажком будут присутствовать всегда, даже если не были выбраны в выборке.

Читайте также:  Где ставится значок копирайта

7. «Выражение представления» — содержит выражение, которое используется при выводе зна-чений поля в отчет.

Например нужно преобразовать дату в особый формат для этого указываем такое выражение «Формат(ПериодПолугодие,"ДФ = '""Полугодие с"" дд.ММ.гггг""'")» или ссылку на документ преобразовать к произвольному виду: ««Дата: »+Ссылка.Дата+«Номер: »+Ссылка.Номер».

8. «Выражение упорядочивания» — как упорядочивать это поле. При редактировании открывается диалог:

В диалоге можно указать, как данное поле упорядочивать. «Выражение» — как упорядочива-ется это поле, «Тип упорядочивания» — «по возрастанию» или «по убыванию», «Необходи-мость автоупорядочивания» – автоматическое определение полей, по которым необходимо упорядочивать результат компоновки данных.

9. «Проверка иерархии» — используется, в случае если нужно формировать нестандартные отборы.
a. «Набор данных» – набор данных для проверки иерархии;
b. «Параметр» – параметр, в который будет подставляться значение, для которого нужно получить дочерние элементы;

10. «Тип значения» — уточнение типа значения поля набора данных, полезно использховать для уточнения полей составного типа

11. «Оформление» — параметры оформления поля набора данных. При редактировании открывается диалог:

Можно задавать следующие параметры:
Цвет фона — Определяет цвет фона в ячеках
Цвет текста — Определяет цвет текст в ячейках
Цвет в диаграмме — Определяет цвет линий в диа-грамме
Цвет границы — Цвет линий границы
Стиль границы — Типы линий границы
Стиль границы слева — слева
Стиль границы сверху — сверху
Стиль границы справа — справа
Стиль границы снизу — снизу
Шрифт — Вид шрифта, толщина, наклон и т.д.
Отступ — Количество знаков отступа
Авто отступ — Количество знаков отступа, применяется в группировках
Горизонтальное положение — Положение текста в ячейке по горизонтали
Вертикальное положение — Положение текста в ячейке по вертикале
Размещение — Размещение текста который не помещается в ячейку
Ориентация текста — Ориентация текст в градусах (90-поворот перпендикулярно)
Формат — Форматная строка значения
Выделять отрицательные — Признак того чтобы выделять отрицательные значения
Минимальная ширина — Минимальная ширина ячейки в пунктах
Минимальная высота — Минимальная высота ячеки
Максимальная высота — Максимальная высота
Текст — Текст который выводится вместо значения

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

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

Вопрос-ответ Ваш отзыв В закладки

День добрый! Как в запросе через СКД сделать Привязку параметра подзапроса к дате документа. А Так же сделать цикл выбора номенклатуры по всему документу

also Разное 1 отзыв В закладки

Бесплатный видео курс по системе компоновки данных от ребят из spec8.ru

Вопрос-ответ Отзывов (6) В закладки

Есть задание на отчёт из более чем 100 колонок.
Суть отчёта показать что оператор делал по контрагенту т.е. набор колонок:

Причём Операторов 10-20, контрагентов 10 000 – 80 000

Информацию я получаю пакетами в запросе (в Временые таблицы), всего получается 14 пакетов, соответственно 14 ВременныхТаблиц в каждой таблице есть Колонки “Оператор”,”Контрагент” ну и набор колонок для вывода в отчёт.

Первая проблема которая возникает как это всё объединить. Т.е. к какой таблице подключить каждую из 14 ВременыхТаблиц полученных в пакетах.
Понятно что не одна из 14 таблиц не может быть опорной таблицей.

Что-то вроде FAQ Отзывов (3) В закладки

В свете ближайшего выхода 8.2.14, попытаюсь описать некоторые новые функции системы компоновки данных.

Вопрос-ответ Отзывов (2) В закладки

Искал встроенную возможность добавить в отчет функции МАКС или МИН, однако ни чего не нашел и пришлось использовать конструкцию вида ВЫБОР КОГДА а>б ТОГДА а ИНАЧЕ б КОНЕЦ. Может кто подскажет как это сделать лучше чем я.

Исходно задача такая, в запросе есть два поля Вход и Выход. Нужно добавить третье поле (вероятно, вычисляемое поле), которое представляет собой МАКС(Вход, Выход).

Кому интересно, пока искал составил такой вот список функций языка выражений:

Оцените статью
Adblock
detector