Новые функции СКД 8.2.14

Демонстрация новых функций СКД 8.2.14

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

Открываем схему компоновки данных, желательно во внешнем отчете, чтобы было проще редактировать.

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

1. Настраиваем запрос в СКД.

2. Настраиваем вычисляемые поля в СКД

3. Выполняем настройку компоновки данных на закладке настройки

4. Запускаем 1С Предприятие 8.2.14. Открываем отчет. Формируем, получаем.

 

Описание самих новых функций:

1. ТекущаяДата()

Возвращает системную дату. При компоновке макета компоновки во всех выражениях, которые присутствуют в компоновке, функция ТекущаяДата() заменяется значением текущей даты.

2. ВЫЧИСЛИТЬВЫРАЖЕНИЕ()

Синтаксис:

ВычислитьВыражение(, , , , , , , )

Описание:

Функция предназначена для вычисления выражения в контексте некоторой группировки.

Функция учитывает отбор группировок, но не учитывает иерархические отборы.

Функция не может применяться к группировке в групповом отборе этой группировки. Например, в отборе группировки Номенклатура нельзя использовать выражение ВычислитьВыражение(«Сумма(СуммаОборот)", , «ОбщийИтог») > 1000. Но такое выражение можно использовать в иерархическом отборе.

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

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

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

 

Параметры

 

 


 

Тип: Строка. Выражение, которое надо вычислить.

 

 


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

 

Например:

Сумма(Продажи.СуммаОборот)/Вычислить("Сумма(Продажи.СуммаОборот)", "ОбщийИтог")

В данном примере в результате получится отношение суммы по полю Продажи.СуммаОборот записи группировки к сумме того же поля во всей компоновке;

 

 


Тип: Строка. Параметр может принимать следующие значения:

 

·        ОбщийИтог — выражение будет вычисляться для всех записей группировки.

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

·        Группировка — выражение будет вычисляться для текущей групповой записи группировки.

·        ГруппировкаНеРесурса — при вычисление функции для групповой записи по ресурсам, выражение будет вычислено для первой групповой записи исходной группировки.

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

           Компоновщик макета компоновки данных при генерации макета компоновки данных при выводе в макет поля-ресурса, по которому выполняется группировка, помещает в макет выражение, вычисляемое при помощи функции ВычислитьВыражение(), с указанием параметра ГруппировкаНеРесурса. Для остальных ресурсов в группировке по ресурсу помещаются обычные выражения ресурсов.

 

 


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

 

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

           Если первая запись выходит за пределы группировки, то считается, что записей нет. Например, если записей 3, а требуется получить Первая(4), то считается, что записей нет.

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

           Если последняя запись выходит за пределы группировки, то считается, что записей нет. Например, если записей 3, а требуется получить Последняя(4), то считается, что записей нет.

·        Предыдущая (Previous). Необходимо получить предыдущую запись группировки. После слова в скобках можно указывать выражение, результат которого будет использоваться как смещение назад от текущей записи группировки. Например, Предыдущая(2) – получение предыдущей от предыдущей записи.

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

           При получении предыдущей записи для итога по группировке считается, что получается первая запись.

·        Следующая (Next). Необходимо получить следующую запись группировки. После слова в скобках можно указывать выражение, результат которого будет использоваться как смещение вперед от текущей записи группировки. Например, Следующая(2) – получение следующей от следующей записи.

           Если следующая запись выходит за пределы группировки, то считается, что записей нет. Например, если записей 3 и для третьей записи получают Следующая(), то считается, что записей нет.

           При получении следующей записи для итога по группировке считается, что записи нет.

·        Текущая (Current). Необходимо получить текущую запись.

           При получении для итога по группировке получается первая запись.

·        ОграничивающееЗначение (BoundaryValue). Необходимость получить запись по указанному значению. После слова ОграничивающееЗначение в скобках нужно указать выражение, со значения которого нужно начинать фрагмент, первого поля упорядочивания.

           В качестве записи будет получаться первая запись, значение поля упорядочивания у которой больше или равно указанному значению. Например, если в качестве поля упорядочивания используется поле Период, и оно имеет значения 01.01.2010, 01.02.2010, 01.03.2010, и требуется получить ОграничивающееЗначение(ДатаВремя(2010, 1, 15)), то будет получена запись с датой 01.02.2010.

 

 


 

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

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

           Если первая запись выходит за пределы группировки, то считается, что записей нет. Например, если записей 3, а требуется получить Первая(4), то считается, что записей нет.

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

           Если последняя запись выходит за пределы группировки, то считается, что записей нет. Например, если записей 3, а требуется получить Последняя(4), то считается, что записей нет.

·        Предыдущая (Previous). Необходимо получить предыдущую запись группировки. После слова в скобках можно указывать выражение, результат которого будет использоваться как смещение назад от текущей записи группировки. Например, Предыдущая(2) – получение предыдущей от предыдущей записи.

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

           При получении предыдущей записи для итога по группировке считается, что получается первая запись.

·        Следующая (Next). Необходимо получить следующую запись группировки. После слова в скобках можно указывать выражение, результат которого будет использоваться как смещение вперед от текущей записи группировки. Например, Следующая(2) – получение следующей от следующей записи.

           Если следующая запись выходит за пределы группировки, то считается, что записей нет. Например, если записей 3 и для третьей записи получают Следующая(), то считается, что записей нет.

           При получении следующей записи для итога по группировке считается, что записи нет.

·        Текущая (Current). Необходимо получить текущую запись.

           При получении для итога по группировке получается первая запись.

·        ОграничивающееЗначение (BoundaryValue). Необходимость получить запись по указанному значению. После слова ОграничивающееЗначение в скобках нужно указать выражение, со значения которого нужно начинать фрагмент, первого поля упорядочивания.

           В качестве записи будет получаться первая запись, значение поля упорядочивания у которой больше или равно указанному значению. Например, если в качестве поля упорядочивания используется поле Период, и оно имеет значения 01.01.2010, 01.02.2010, 01.03.2010, и требуется получить ОграничивающееЗначение(ДатаВремя(2010, 1, 15)), то будет получена запись с датой 01.02.2010.

 

 


 

Тип: Строка. Перечисляются выражения, разделенные запятыми, которые описываютправила упорядочивания. Если не указана, то упорядочивание выполняется также как и у группировки, для которой вычисляется выражение. После каждого выражения можно указать ключевое слово Возр (для упорядочивания по возрастанию), Убыв (для упорядочивания по убывания) и Автоупорядочивание (для упорядочивания ссылочных полей по полям, по которым нужно упорядочивать объект, на который выполняется ссылка). Слово Автоупорядочивание может использоваться как со словом Возр, так и со словом Убыв.

 

 


 

Тип: Строка. Аналогично параметру Сортировка. Применяется для упорядочивания иерархических записей. Если не указано, компоновщик макета генерирует упорядочивание в соответствии с упорядочиванием, указанным в параметре Сортировка.

 

Тип: Строка. Указывает правило определения предыдущей или следующий записи в случае если есть несколько записей с одинаковым значением упорядочивания:

·        Отдельно (Separately) обозначает, что для определения предыдущей и следующей записей используется последовательность упорядоченных записей. Значение по умолчанию.

·        Вместе (Together) обозначает, что предыдущая и следующие записи определяются на основании значений выражений упорядочивания.

           Например, если полученная последовательность упорядочена по дате:

Дата ФИО Значение
1 01 января 2001 года

Иванов М.

10
2 02 января 2001 года Петров С. 20
3 03 января 2001 года Сидоров Р. 30
4 04 января 2001 года Петров С. 40

Если значение параметра равно Отдельно, то:

§  предыдущей записью к записи 3 будет запись 2.

§  если расчетный фрагмент определяется как Текущая, Текущая (соответственно, параметры Начало и Конец), то для записи 2 этот фрагмент будет состоять из одной записи 2. Выражение ВычислитьВыражение(«Сумма(Значение)", , , Текущая, Текущая) будет равно 20.

           Если значение параметра равно Вместе, то:

§  предыдущей записью к записи 3 будет запись 1.

§  если расчетный фрагмент определяется как Текущая, Текущая (соответственно, параметры Начало и Конец), то для записи 2 этот фрагмент будет состоять из записей 2 и 3. Выражение ВычислитьВыражение(«Сумма(Значение)", , , Текущая, Текущая) будет равно 50.

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

Пример:

Если требуется рассчитать сумму с накоплением, то можно использовать следующее выражение:

ВычислитьВыражение("Сумма(СуммаОборот)", , , "Первая", "Текущая")

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

ВычислитьВыражение("Курс", , , "Предыдущая")

 


Список новых функций:

 

 


 

 

ВычислитьВыражениеСГруппировкойМассив(, , , )

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

ВычислитьВыражениеСГруппировкойТаблицаЗначений(, , , ) —

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

ЗначениеЗаполнено() — Возвращает Истина, если значение отлично от значения данного типа по умолчанию, отлично от значения NULL, отлично от пустой ссылки, отлично от значения Неопределено. Для логических значений осуществляется проверка на значение NULL. Для строк осуществляется проверка на отсутствие не пробельных символов

Пример:

Формат(, ) — Получить отформатированную строку переданного значения. Форматная строка задается в соответствии с форматной строкой системы «1С:Предприятие».

Пример

Подстрока(, ) — Данная функция предназначена для выделения подстроки из строки.

ДлинаСтроки() — Функция предназначена для определения длины строки. Параметр — выражение строкового типа

Строка() — Если в качестве параметра передан массив, то функция возвращает строку, содержащую строковые представления всех элементов массива, разделенных символами "; ". Если в качестве параметра передана таблица значений, то функция возвращает строку, содержащую строковые представления всех строк таблицы значений, причем представления ячеек каждой строки разделяются символами "; ", а строки — смиволом перевода строки. Если у какого либо элемента строковое представление пустое, то вместо его представления выводится строка.

51 Comments

  1. Serj1C

    как-то сухо. выдержек из хелпа маловато

    Reply
  2. fishca

    (1) первый блин, не судите строго 😥

    Reply
  3. WKBAPKA

    так я так понимаю, что еще 14-ый релиз еще не вышел?

    Reply
  4. anig99

    (3) тестовые выходят. Завтра ждем очередного переноса срока (: У меня конфа обновления ждет с 6 на 13 релиз из-за этого.

    Reply
  5. fishca

    (3) нет. Завтра должен выйти, если не перенесут в очередной раз.

    Reply
  6. cheburashka

    Помоему ФОРМАТ() и в прежних релизах 8.2 был

    Reply
  7. anig99

    (6) не в виде функции, вроде

    Reply
  8. fishca

    (6) ты прав! 😳

    Reply
  9. fishca

    (7) 8.2.13.219 😳

    Reply
  10. anig99

    (8) а я всё ещё на 8.2.11 сижу (: А то 12 и 13 релизы только ошибки плодили.

    Reply
  11. fishca

    (10) и не факт что 14 не продолжит их «славную» традицию…

    Reply
  12. anig99

    (11) да, но вкусности 14 слишком соблазнительны

    Reply
  13. fishca

    (12) не могу не согласиться 😉

    Reply
  14. Gasdrubal

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

    Reply
  15. zahar33

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

    Reply
  16. Kesr

    Полезная вещь, стоит попоробовать

    Reply
  17. AlexO

    (14) Gasdrubal,

    а причем тут общие реквизиты и СКД??

    Общие реквизиты — это реквизиты, которые общие для множества объектов. На основе них — реализован механизм общих реквизитов. Т.е. вроде как можно один раз назначить реквизит и право на него дать, и во всех объектах он будет разграничен…

    А работает, как всегда в 1с, все через ж..

    Был пример, когда этот самый «общий» реквизит выводил для разных пользователей (с разными правами на него) РАЗНЫЕ данные внутри…

    т.е. создавал путаницу, а не разгарничение прав на данные реквизитов, для чего и соорудили эту очередную «тухлую» плюшку….

    (15) zahar33,

    Целая статья есть:

    http://infostart.ru/public/92746/

    Как работает — куча условностей и сторонних костылей (т.е. основное — это сторонние разработки: драйвера, СУБД, элементы…), которые и составляют основу «фишки», нарушится что-то в этой цепочке — работать не будет…

    но зато «1с реализовала»…

    и будет еще 10 релизов до 8.3 исправлять и дорабатывать свои «инновации»..

    Reply
  18. zahar33

    Я уже это понял идеи хорошие, а их реализация пока(надеюсь) хромает.

    Reply
  19. Raminus

    Полезно.

    Reply
  20. xaker1C

    Исполнения подкачало

    Reply
  21. Feelthis

    Огромное спасибо. Как раз очень актуально получить нарастающий итог в запросе для меня. Раньше по моему хитро делали в запросе — табличка сама с собой соединялась по периодам Таб1.период >= Таб2.Период

    Reply
  22. i132

    инетерсный пример ABCКлассификация() в агрегатнных функций СКД: http://downloads.v8.1c.ru/content/Platform/8_2_14_439/V8AddDoc.htm#_Toc292348659

    -используется функция из модуля обрабатывающая ДанныеГрупповойОбработкиКомпоновкиДанных

    В выражении компановки ABCКлассификация(ГрупповаяОбработка(«Сумма(СуммаОборот)»))

    в модуле:

    Функция ABCКлассификация(Данные) Экспорт
    Перем ТаблицаЗначений;
    
    Если Не Данные.ВременныеДанныеОбработки.Свойство(«ABCКлассификацияТаблицаЗначений», ТаблицаЗначений) Тогда
    ТаблицаЗначений = Данные.Данные.Скопировать();
    …(обработка ТЗ)…
    Данные.ВременныеДанныеОбработки.Вставить(«ABCКлассификацияТаблицаЗначений», ТаблицаЗначений);
    Данные.ВременныеДанныеОбработки.Вставить(«ABCКлассификацияИндексКлассаA», ИндексКлассаA); //номер граничной строки А-Б
    Иначе
    ТаблицаЗначений = Данные.ВременныеДанныеОбработки.ABCКлассификацияТаблицаЗначений;
    КонецЕсли;
    
    Если Данные.ТекущийЭлемент = Неопределено Тогда
    Возврат Null;// Итог по группировке.
    Иначе
    Строка = ТаблицаЗначений.Найти(Данные.Данные.Индекс(Данные.ТекущийЭлемент), «Номер»);
    
    Если Строка = Неопределено Тогда
    Возврат Null;
    Иначе
    Индекс = ТаблицаЗначений.Индекс(Строка);
    Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
    Возврат 1;
    Иначе
    Возврат 3;
    КонецЕсли;
    КонецЕсли;
    КонецФункции

    Показать

    Reply
  23. a31
    i132 пишет:

    i132 23.12.11 12:16 URL ↓Цитата ↓Ответить

    инетерсный пример ABCКлассификация() в агрегатнных функций СКД: http://downloads.v8.1c.ru/content/Platform/8_2_14_439/V8AddDoc.htm#_Toc292348659 -используется функция из модуля обрабатывающая ДанныеГрупповойОбработкиКомпоновкиДанных

    В выражении компановки ABCКлассификация(ГрупповаяОбработка(«Сумма(СуммаОборот)»))

    в модуле:

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

    Reply
  24. iotkin

    Спасибо автору.

    Reply
  25. post279

    Спасибо

    Reply
  26. post279

    Полезно

    Reply
  27. serge_focus

    Спасибо . Актуальная статья!

    Reply
  28. sergb1979

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

    Reply
  29. fishca

    (29)

    У Вас самая полезная статья.

    Есть на инфостарте более полезные статьи

    Скд частично закрытый формат. Черный ящик

    СКД — формат описан в документации

    Как поведет себя система не всегда можно прогнозировать

    опять же есть все в документации

    Reply
  30. arhal-ya@yandex.ru

    Похоже на бездушный копипаст из хелпа. В новых функциях упоминается «ЗначениеЗаполнено». Побойтесь бога — это есть даже в 8.1. Заметил при беглом прочтении. После этого читать этот длярейтинговый «мануал» расхотелось.

    Reply
  31. fishca
    Похоже на бездушный копипаст из хелпа

    а ты хотел чтобы он был с душой 😉 ?

    В новых функциях упоминается «ЗначениеЗаполнено». Побойтесь бога — это есть даже в 8.1

    согласен, попалась «старенькая» вместе с остальными «новенькими» 🙂

    После этого читать этот длярейтинговый «мануал» расхотелось

    Ждем от тебя много новых, содержательных статей не для рейтинга 🙂

    Reply
  32. arhal-ya@yandex.ru

    (32)

    а ты хотел чтобы он был с душой 😉 ?

    Хотелось чтобы содержательно и с актуальными примерами.

    Хелп 1с меня всегда поражал своей содержательностью.

    Гилев, например,в своих видеоуроках постоянно не находит там какого-нибудь метода или свойства.

    А примеры кода часто опущены за ненадобностью. На этом сайте рассчитываю встретить что-то полезное.

    Ждем от тебя много новых, содержательных статей не для рейтинга 🙂

    Непременно. Скоро еще одну выложу.

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

    согласен, попалась «старенькая» вместе с остальными «новенькими» 🙂

    ага «Формат» и «ДлинаСтроки» тоже попались.

    Reply
  33. fishca
    Непременно. Скоро еще одну выложу.

    а где интересно первая?

    Reply
  34. arhal-ya@yandex.ru

    (34)

    а где интересно первая?

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

    Reply
  35. fishca

    пока не вижу 🙂

    Reply
  36. arhal-ya@yandex.ru

    (36)

    пока не вижу 🙂

    Кхгм… И что тебе на это сказать?

    И только не надо пенять на глюки сайта…

    Кто сказал фотошоп? Никто? Значит показалось…

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

    Reply
  37. fishca

    (37) сейчас есть публикация, но это не статья, к моему сожалению, а я тебя писал про статью 😉

    Reply
  38. Созинов

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

    Reply
  39. echo77

    Ох… но! Где же я был раньше — на работу приду, распечатаю справку по функциям СКД.

    Практического применения пока не найду, но на два вопроса на сайте 1cskd.ru, думаю, я смог ответить людям

    Reply
  40. AlX0id

    мм.. люди для себя 8.2 открывают :))

    Reply
  41. Yashazz

    Мдя. Это и правда не статья, а копипаст какой-то…

    ВычислитьВыражениеСГруппировкойМассив и ВычислитьВыражениеСГруппировкойТаблицаЗначений вообще никак не описаны и пример не приведён. Советую желающим читать тут: http://langslab.com/ebooks/skd/dcs-ch2/dcs-ex17

    Reply
  42. Гость

    Работает ли данная фунцкия с датами?

    например ВычислитьВыражение(РазностьДат(Дата, Дата, Месяц), «Предыдущая», «Текущая»)

    Reply
  43. SergTH0000

    Гыыы, автор ты че? копипаст из хелпа + свои картинки? Жжошь!

    Reply
  44. fishca
    Гыыы, автор ты че? копипаст из хелпа + свои картинки? Жжошь!

    иногда это полезно делать 😉

    Reply
  45. konstantin5586
  46. fishca

    (46) konstantin5586, похоже один в один 🙂

    Reply
  47. for_sale

    мда, работа проведена просто титаническая! это ж сколько нужно было копипастить из справки? да ещё и три скриншота сделать!

    Кстати, на скриншоте в отчёте накапливаемый итог не работает. Подозреваю, что из-за того, что каждая запись в отдельной группировке. Отличная иллюстрация работы! Как и сама работа.

    Reply
  48. Hans

    Скопипастил, даже не понял что, параметров не видно, ничего не понятно.

    Reply
  49. fishca

    (49) Hans, параметров в запросе не наблюдаю. Ты о чем вообще речь ведешь?

    Reply
  50. Hans
  51. progr-2008

    ВычислитьВыражение(«Сумма(СуммаДокумента)», , , «Первая», «Текущая»)

    Если это выражение в вычисляемом поле, а в Ресурсы — сумма этого выражения, то получу суммы документов нарастающим итогом?

    Reply

Leave a Comment

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