1с скд использование вложенных агрегатных функций не допускается
Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.
Предыдущие мои статьи по СКД можно посмотреть по ссылкам ниже:
- Основные понятия и элементы схемы компоновки
- Настройки вариантов отчетов
- Работа с пользовательскими настройками
- Расширения языка запросов
- Наборы данных и связи между ними, иерархии
- Внутренние функции СКД, ВычислитьВыражение
Нет такого программиста 1С, который никогда не работал бы с СКД. И все, кто выводил с помощью системы компоновки даже самые простые отчеты, знают, что такое агрегатные функции. Так как вывод итогов по ресурсам на уровне группировок, это, пожалуй, самая распространенная задача при создании отчета.
Но, далеко не все знают, что список возможных агрегатных функций не ограничивается выпадающим списком в конструкторе СКД:
Если посмотреть справку то можно увидеть гораздо больше агрегатных функций, о существовании некоторых из которых мало кто знает:
А в выпадающем списке консоли СКД отображены только основные агрегатные функции, которые чаще всего приходится применять.
Но мы, программисты 1С довольно редко читаем справку. Обычно мы пытаемся понять новый материал интуитивно, максимум обращаемся к синтаксис-помощнику, и очень зря. Ведь, использование этих функций позволяет сильно облегчить и, главное, ускорить создание большого количество отчетов.
Статья как раз про эти, «скрытые» агрегатные функции, которые иногда оказываются ну очень полезными. В статье будут описаны возможности этих функций, по некоторым будут приведены примеры.
Массив
Функция формирует массив, содержащий значения детальных записей по полю или выражению, указанному в качестве параметра. Обрабатываются подчиненные записи текущей группировки. Ключевое слово «Различные», позволяет получить только уникальные записи. Если в качестве параметра передана таблица значений, сформируется массив со значениями первой колонки таблицы:
Если массив формируется по числовому полю, то к его результату можно применять еще одну агрегатную функцию (Сумма, Количество, Максимум, Минимум, Среднее).
ТаблицаЗначений
Ф ункция формирует таблицу значений. Количество колонок результирующей функции равно количеству переданных параметров (полей или выражений). Обрабатываются подчиненные записи текущей группировки. После ключевого слова «КАК» можно задать наименования колонок таблицы. Ключевое слово «Различные» перед первым параметром позволяет получить только различные записи. Проверка выполняется по всем колонкам таблицы значений.
Если в качестве параметров указаны поля-остатки и данные выбираются с периодичностью (Остатки и обороты), стоки таблицы формируются в разрезе периодов и уникальной комбинации измерений. То-есть, если значение остатка в разных периодах различное, в итоговой таблице значений будет сформировано несколько строк, со значениями из разных периодов.
Для наглядности приведу пример .
Создадим набор данных со следующим запросом:
Добавляем вычисляемое поле «ТаблицаЗначений» и в качестве выражения ресурса, укажем для него:
В результате получаем таблицу значений со значениями на каждый день, в котором было изменение остатка:
Важное дополнение. Если для колонок таблицы значений не заданы наименования после ключевого слова «КАК», во всех функциях, которые выполняют обработку этой таблицы (Свернуть, Упорядочить, ПолучитьЧасть) нельзя использовать наименования для указания требуемых колонок. Имена колонок будут иметь специальные наименования, назначенные системой. Для обращения к этим колонкам можно будет использовать только их порядковые номера. Так что если планируется обращение к колонкам таблицы значений по именам, обязательно нужно указывать эти имена после ключевого слова «КАК».
Свернуть
Функция позволяет удалить повторяющиеся строки из массива или таблицы значений. Если в качестве первого параметра используется Таблица значений, необходимо вторым параметром указать порядковые номера или имена колонок, по которым нужно свернуть данные:
Важный момент , данная функция не сворачивает данные с группировкой суммовых показателей. Происходит именно отсечение строк с повторяющимися значениями:
Для массива, функция аналогична применению ключевого слова «Различные» в функции «Массив». Для таблицы значений, функция позволяет проверить уникальность не по всем колонкам, в отличие от применения ключевого слова «Различные» в функции «ТаблицаЗначений».
ПолучитьЧасть
Функция позволяет получить часть таблицы значений. Оставить только необходимые колонки. Наименования или порядковые номера колонок нужно указать вторым параметром функции:
В результате получится таблица значений с одной колонкой «Номенклатура».
Упорядочить
Функция позволяет упорядочить массив или таблицу значений. Если используется таблица значений, вторым параметром нужно указать номера колонок, по которым требуется выполнить упорядочивание. Можно указать направление упорядочивания (Возр / Убыв) и признак «Автоупорядочивание»:
СоединитьСтроки
Функция выполняет соединение срок, переданных в качестве массива или таблицы значений. Втором параметром можно указать символ соединения строк, массива или таблицы (по умолчанию используется символ перевода строки). Если в качестве первого параметра используется таблица значений, в третьем параметре можно указать символ соединения колонок таблицы (по умолчанию используется символ «;»). Результатом выполнения функции является строка.
Примеры использования функций:
ГрупповаяОбработка
Функция выполняет групповую обработку строк. Вычисляет указные выражения и формирует таблицу значений с результатами этих выражений в контексте текущей или указанной группировки. Важный момент, что в обработку включаются строки, которые находятся на одном уровне с обрабатываемой строкой или на одном уровне иерархии (это не подчиненные строки как для большинства агрегатных функций).
Синтаксис функции следующий:
Выражения – поля или выражения, которые требуется обработать и поместить в результирующие данные.
ВыраженияИерархии – поля или выражения, которые требуется обработать для иерархических записей (если обработка выполняется для иерархии). Если параметр не указан, используются такие же поля, которые указаны в параметре «Выражения».
ИмяГруппировки – Имя группировки, по строкам которой необходимо выполнить расчет. Если параметр не указан, вычисление выполняется по строкам на уровне текущей группировки. Если указанная группировка не доступна на текущем уровне (группировка более низкого уровня), функция вернет значение NULL .
Результат групповой обработки возвращается в виде объекта с типом « ДанныеГрупповойОбработкиКомпоновкиДанных ». Данные групповой обработки можно передать в качестве параметра в экспортную функцию общего модуля
Объект содержит следующие реквизиты:
- Данные – результирующая таблица значений. Колонками таблицы являются поля или результаты выражений, перечисленные в первом параметре функции «ГрупповаяОбработка».
- ТекущийЭлемент – строка таблицы значений соответствующая текущему элементу группировки.
- ВременныеДанныеОбработки – структура в которую можно поместить произвольные параметры в процессе работы с результатом групповой обработки в функции общего модуля. Эти параметры будут доступны при следующей обработке групповых данных в рамках этой же группировки.
Пример использования функции
Создадим набор данных с простым запросом:
Создадим вычисляемое поле «ГрупповаяОбработка», определим его как ресурс и укажем следующее выражение:
СКДСервер.ФункцияОбщегоМодуля(ГрупповаяОбработка ("СУММА(КоличествоОборот) КАК Количество"))
В конфигурации, в общем серверном модуле «СКДСервер» разместим экспортную процедуру:
Функция рассчитывает отклонение значения в текущей группировке от среднего значения по всем группировкам.
Проверяется наличие параметра «СреднееКоличество» в структуре «ВременныеДанныеОбработки». Если параметр существует, используется он, так как среднее количество в рамках одной и той же группировки будет одинаковым. Если параметра не существует (выводится первая строка группировки), выполняется его расчет по таблицы значений «Данные». Полученное значение добавляется в структуру «ВременныеДанныеОбработки».
На заметку. Имейте в виду про следующую особенность. Функция общего модуля, указанная для ресурса, вызывается дважды для одной и той же строки. Это связано с типовой обработкой расшифровки для поля – ресурса. Если для данного поля создать собственный макет, с указанием одного и того же выражения для основного параметра и для параметра расшифровки, такой особенности не будет. Функция будет вызвана один раз для каждой строки.
Каждый
Функция вычисляет выражения для всех строк и возвращает значение «Истина», если выражения по всем строкам вернули значение «Истина». В противном случае, будет возвращено значение «Ложь».
Любой
Функция вычисляет выражения для всех строк и возвращает значение «Истина», если хотя бы по одной строке результат будет «Истина». В противном случае, будет возвращено значение «Ложь».
МестоВПорядке
Функция определяет позицию данной строки, если расположить все строки группировки в порядке, указанном в выражении первого параметра. Также как и для функции «ГрупповаяОработка», используются строки, которые находятся на одном уровне с обрабатываемой или на одном уровне иерархии (не вложенные строки).
Строки с одинаковым значением порядка будут иметь одно и то же место.
Синтаксис функции следующий:
Порядок – выражение порядка, по которому происходит сортировка строк. Можно указать направление упорядочивания (Возр / Убыв) и признак «Автоупорядочивание».
ПорядокИерархия – выражение упорядочивания для иерархических записей. Если не указано, действует выражение для основных записей.
ИмяГруппировки – группировка, в контексте которой необходимо выполнить упорядочивание. Если параметр не указан, порядок вычисляется в контексте текущей группировки.
Для обычных строк группировки действует сортировка по полю «КоличествоОборот», для иерархических – «СуммаОборот»:
Для всех вложенных группировок место в порядке будет рассчитано по группировкам верхнего уровня «Покупатель»:
КлассификацияABC
Функция вычисляет значение классификации « ABC » по переданному выражению и пороговым значениям.
Синтаксис функции следующий:
Значение – поле или выражение, для которого требуется рассчитать классификацию ABC .
КоличествоГрупп – количество групп классификации. Можно указать количество больше трех, тогда уже будет классификация « ABCD », « ABCDE » и т.д.
ПроцентыДляГрупп – пороги для попадания в группы через запятую в виде строки. Причем для последней группы порог не указывается. Диапазон последней группы считается от последнего порога до 100%. Пример указания порогов для трех групп: «50, 80».
ИмяГруппировки - группировка, в контексте которой необходимо выполнить расчет. Если параметр не указан, вычисление происходит в контексте текущей группировки.
Классификация вложенных строк выполняется по строкам группировки верхнего уровня «Покупатель»:
В СКД существует еще целый набор математических агрегатных функций:
- СтандартноеОтклонениеГенеральнойСовокупности
- СтандартноеОтклонениеВыборки
- ДисперсияВыборки
- ДисперсияГенеральнойСовокупности
- КовариацияГенеральнойСовокупности
- КовариацияВыборки
- Корреляция
- РегрессияНаклон
- РегрессияОтрезок
- РегрессияКоличество
- РегрессияR2
- РегрессияСреднееX
- РегрессияСреднееY
- РегрессияSXX
- РегрессияSYY
- РегрессияSXY
Их рассмотрение и использование заслуживает отдельной статьи, так что здесь я их разбирать не буду.
Спасибо за внимание. В следующих статьях я планирую рассматривать программную работу с отчетами на СКД, а также привести разбор некоторых интересных примеров.
Более корректная формула (с проверкой на деление на 0) на рисунке:
Далее, данное поле добавляется как ресурс на следующей вкладке «Ресурсы», по умолчанию для него подставится функция Сумма и получится Сумма(ДоходПроцент), что вызовет ошибку использования вложенных агрегатных функций.
Поэтому правите вручную (не через диалог выбора)
Корректируете оформление, в частности формат (точность) на вкладке «Вычисляемые поля», иначе будет выводится много знаков после запятой в расчетном поле
Если ранее таблица уже была сформирована, то добавляете расчетное поле в выбранные поля СКД на вкладке «Настройки» или формируете выходную форму конструктором настроек, как обычно.
Далее проверяете результат, меня мой не устроил, поэтому я переделал формулу на « Выбор когда Сумма(Приход) = 0 Тогда «» Иначе Формат(Сумма(Сумма)*100/Сумма(Приход) ,»ЧДЦ=3″)+»%» конец «, убрал формат из оформления, добавил в нем принудительное выравнивание по правому краю (т.к. для строкового поля автовыравнивание по умолчанию — по левому краю)
Предварительный результат отчета получился вот таким:
Можно дурачить всех все время, — при условии, что реклама ведется правильно, а расходы на нее достаточно велики.
— Джозеф Левин
Важно! Если параметр функции имеет тип Строка и в нем указывается имя поля, которое содержит пробелы, то такое имя поля должно быть заключено в квадратные скобки.
Например: "[Количество Оборот]".
1. Сумма (Total) - рассчитывает сумму значений выражений, переданных ей в качестве аргумента для всех детальных записей. В качестве параметра можно передавать Массив. В этом случае функция будет применена к содержимому массива.
2. Количество (Count) - рассчитывает количество значений отличных от значения NULL. В качестве параметра можно передавать Массив. В этом случае функция будет применена к содержимому массива.
Синтаксис :
Количество([Различные] Параметр)
В указания получения различных значений следует перед параметром метода Количество указать Различные (Distinct).
Пример :
Количество(Продажи.Контрагент)
Количество(Различные Продажи.Контрагент)
3. Максимум (Maximum) - получает максимальное значение. В качестве параметра можно передавать Массив. В этом случае функция будет применена к содержимому массива.
4. Минимум (Minimum) - получает минимальное значение. В качестве параметра можно передавать Массив. В этом случае функция будет применена к содержимому массива.
5. Среднее (Average) - получает среднее значение для значений, отличных от NULL. В качестве параметра можно передавать Массив. В этом случае функция будет применена к содержимому массива.
6. Массив (Array) - формирует массив, содержащий для каждой детальной записи значение параметра.
Синтаксис :
Массив([Различные] Выражение)
В качестве параметра можно использовать таблицу значений. При этом результатом работы функции будет массив, содержащий значения первой колонки таблицы значений, переданной в качестве параметра. Если выражение содержит функцию Массив, то считается, что данное выражение является агрегатным. Если указано ключевое слово Различные, то получаемый массив не будет содержать дублирующихся значений.
7. ТаблицаЗначений (ValueTable) - формирует таблицу значений, содержащую столько колонок, сколько параметров у функции. Детальные записи получаются из наборов данных, которые нужны для получения всех полей, участвующих в выражениях параметров функции.
Синтаксис :
ТаблицаЗначений([Различные] Выражение1 [КАК ИмяКолонки1][, Выражение2 [КАК ИмяКолонки2]. ])
Если параметрами функции выступают поля–остатки, то в результирующую таблицу значений попадут значения для записей по уникальным комбинациям измерений из других периодов. При этом значения получаются только для полей-остатков, измерений, счетов, полей периодов и их реквизитов. Значениями остальных полей в записях из других периодов считаются равными NULL. Если выражение содержит функцию ТаблицаЗначений, то считается, что данное выражение является агрегатным. Если указано ключевое слово Различные, то в получаемой таблице значений не будет строк, содержащих одинаковые данные. После каждого параметра может располагаться необязательное ключевое слово КАК и имя, которое будет назначено колонке таблицы значений.
Пример :
ТаблицаЗначений(Различные Номенклатура, ХарактеристикаНоменклатуры КАК Характеристика)
8. Свернуть (GroupBy) - предназначена для удаления дубликатов из массива.
Синтаксис :
Свернуть(Выражение, НомераКолонок)
- Выражение - выражение типа Массив или ТаблицаЗначений, значения элементов которого нужно свернуть;
- НомераКолонок - (если выражение имеет тип ТаблицаЗначений) тип Строка. Номера или имена (через запятую) колонок таблицы значений, среди которых нужно искать дубликаты. По умолчанию – все колонки.
9. ПолучитьЧасть (GetPart) - получает таблицу значений, содержащую определенные колонки из исходной таблицы значений.
Синтаксис :
ПолучитьЧасть(Выражение, НомераКолонок)
- Выражение - тип ТаблицаЗначений. Таблица значений, из которой нужно получить колонки;
- НомераКолонок - тип Строка. Номера или имена (через запятую) колонок таблицы значений, которые нужно получить.
Пример :
ПолучитьЧасть(Свернуть(ТаблицаЗначений(НомерТелефона, Адрес) ,"НомерТелефона"),"НомерТелефона");
10. Упорядочить (Order) - предназначена для упорядочивания элементов массива и таблицы значений.
Синтаксис :
Упорядочить(Выражение, НомераКолонок)
- Выражение - Массив или ТаблицаЗначений, из которой нужно получить колонки;
- НомераКолонок - (если выражение имеет тип ТаблицаЗначений) номера или имена (через запятую) колонок таблицы значений, по которым нужно упорядочить. Может содержать направление упорядочивания и необходимость автоупорядочивания: Убыв/Возр + Автоупорядочивание.
Пример :
Упорядочить(ТаблицаЗначений(НомерТелефона, Адрес, ДатаЗвонка),"ДатаЗвонка Убыв");
11. СоединитьСтроки (JoinStrings) - предназначена для объединения строк в одну строку.
Синтаксис :
СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок)
- Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
- РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
- РазделителиКолонок - строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".
12. ГрупповаяОбработка (GroupProcessing) - возвращает объект ДанныеГрупповойОбработкиКомпоновкиДанных. В объект в свойство Данные помещается в виде таблицы значений значения группировок для каждого выражения, указанного в параметре функции Выражения. В случае использования иерархической группировки каждый уровень иерархии обрабатывается отдельно. Значения для иерархических записей также помещаются в данные. В свойство ТекущийЭлемент объекта помещается строка таблицы значений, для которой в настоящий момент вычисляется функция.
Синтаксис :
ГрупповаяОбработка(Выражения, ВыраженияИерархии, ИмяГруппировки)
- Выражения. Выражения, которые нужно вычислить. Строка, в которой через запятую перечислены выражения, которые нужно вычислить. После каждого выражение возможно наличие необязательного ключевого слова КАК и имени колонки результирующей таблицы значений. Каждое выражение образует колонку таблицы значений свойства Данные объекта ДанныеГрупповойОбработкиКомпоновкиДанных.
- ВыраженияИерархии. Выражения, которые нужно вычислить для иерархических записей. Аналогично параметру Выражения с тем отличием, что параметр ВыраженияИерархии используется для иерархических записей. Если параметр не указан, то для вычисления значений для иерархических записей используется выражения, указанные в параметре Выражение.
- ИмяГруппировки. Имя группировки, в которой нужно вычислять группировку обработки. Строка. Если не указано, то вычисление происходит в текущей группировке. Если вычисление идет в таблице и параметр содержит пустую строку, или не указан, то значение вычисляется для группировки – строки. Компоновщик макета при генерации макета компоновки данных заменяет данное имя на имя группировки в результирующем макете. Если группировка не доступна, то функция будет заменена на значение NULL.
14. Любой (Any) - если хоть одна запись имеет значение Истина, то результат Истина, иначе Ложь
15. СтандартноеОтклонениеГенеральнойСовокупности (Stddev_Pop) - вычисляет стандартное отклонение совокупности. Вычисляется по формуле: SQRT(ДисперсияГенеральнойСовокупности(X)).
Пример :
X | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Y | 7 | 1 | 2 | 5 | 7 | 34 | 32 | 43 | 87 |
Результат: 805.694444
16. СтандартноеОтклонениеВыборки (Stddev_Samp) - вычисляет совокупное типовое стандартное отклонение. Вычисляется по формуле: SQRT(ДисперсияВыборки(X)).
Пример :
X | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Y | 7 | 1 | 2 | 5 | 7 | 34 | 32 | 43 | 87 |
Результат: 28.3847573
17. ДисперсияВыборки (Var_Samp) - вычисляет типовое различие ряда чисел без учета значений NULL в этом наборе. Вычисляется по формуле: (Сумма(X^2) - Сумма(X)^2 / Количество(X)) / (Количество(X) - 1). Если Количество(X) = 1, то возвращается значение NULL.
18. ДисперсияГенеральнойСовокупности (Var_Pop) - вычисляет различие совокупности ряда чисел без учета значений NULL в этом наборе. Вычисляется по формуле: (Сумма(X^2) - Сумма(X)^2 / Количество(X)) / Количество(X)
19. КовариацияГенеральнойСовокупности (Covar_Pop) - вычисляет ковариацию ряда числовых пар. Вычисляется по формуле: (Сумма(Y * X) - Сумма(X) * Сумма(Y) / n) / n, где n число пар (Y, X) в которых ни Y ни X не являются NULL.
Синтаксис :
КовариацияГенеральнойСовокупности(Y, X)
20. КовариацияВыборки (Covar_Samp) - вычисляет типовое различие ряда чисел без учета значений NULL в этом наборе. Вычисляется по формуле: (Сумма(Y * X) - Сумма(Y) * Сумма(X) / n) / (n-1), где n число пар (Y, X) в которых ни Y ни X не являются NULL.
Синтаксис :
КовариацияВыборки(Y, X)
21. Корреляция (Corr) - вычисляет коэффициент корреляции ряда числовых пар. Вычисляется по формуле: КовариацияГенеральнойСовокупности(Y, X) / (СтандартноеОтклонениеГенеральнойСовокупности(Y) * СтандартноеОтклонениеГенеральнойСовокупности(X)). Не учитываются пары, в которых Y или X равны NULL.
Синтаксис :
Корреляция(Y, X)
22. РегрессияНаклон (Regr_Slope) - вычисляет наклон линии. Вычисляется по формуле: КовариацияГенеральнойСовокупности(Y, X) / ДисперсияГенеральнойСовокупности(X). Вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияНаклон(Y, X)
23. РегрессияОтрезок (Regr_Intercept) - вычисляет Y-точку пересечения линии регресса. Вычисляется по формуле: Среднее(Y) - РегрессияНаклон(Y, X) * Среднее(X). Вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияОтрезок(Y, X)
24. РегрессияКоличество (Regr_Count) - вычисляет количество пар не содержащих NULL.
Синтаксис :
РегрессияКоличество(Y, X)
25. РегрессияR2 (Regr_R2) - вычисляет коэффициент детерминации. Вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияR2(Y, X)
- Y - тип Число;
- X - тип Число.
- Null - если ДисперсияГенеральнойСовокупности(X) = 0;
- 1 - если ДисперсияГенеральнойСовокупности(Y)=0 И ДисперсияГенеральнойСовокупности(X)<>0;
- POW(Корреляция(Y,X),2) - если ДисперсияГенеральнойСовокупности(Y)>0 И ДисперсияГенеральнойСовокупности(X)<>0.
26. РегрессияСреднееX (Regr_AvgX) - вычисляет среднее число X после исключения X и Y пар, где или X или Y являются пустыми. Среднее(X) вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияСреднееX(Y, X)
27. РегрессияСреднееY (Regr_AvgY) - вычисляет среднее число Y после исключения X и Y пар, где или X или Y являются пустыми. Среднее(Y) вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияСреднееY(Y, X)
28. РегрессияSXX (Regr_SXX) - вычисляется по формуле: РегрессияКоличество(Y, X) * ДисперсияГенеральнойСовокупности(X). Вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияSXX(Y, X)
- Y - тип Число;
- X - тип Число.
Пример :
X | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Y | 7 | 1 | 2 | 5 | 7 | 34 | 32 | 43 | 87 |
Результат: 60
29. РегрессияSYY (Regr_SYY) - вычисляется по формуле: РегрессияКоличество(Y, X) * ДисперсияГенеральнойСовокупности(Y). Вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияSYY(Y, X)
30. РегрессияSXY (Regr_SXY) - вычисляется по формуле: РегрессияКоличество(Y, X) * КовариацияГенеральнойСовокупности(Y, X). Вычисляется без учета пар, содержащих NULL.
Синтаксис :
РегрессияSXY (Y, X)
31. МестоВПорядке (Rank)
Синтаксис :
МестоВПорядке(Порядок, ПорядокИеррахии, ИмяГруппировки)
- Порядок – тип Строка. Содержит выражения, в последовательности которых нужно расположить групповые записи, разделенные через запятую. Направление упорядочивания управляется при помощи слов Возр, Убыв. После поля также можно указать строку Автоупорядочивание, что обозначает, что при упорядочивании ссылок нужно использовать поля упорядочивания, определенные для объекта, на который ссылка. Если последовательность не указана, то значение рассчитывается в последовательности группировки;
- ПорядокИеррахии – тип Строка. Содержит выражения упорядочивания для иерархических записей;
- ИмяГруппировки – тип Строка. Имя группировки, в которой нужно вычислять группировку обработки. Если не указано, то вычисление происходит в текущей группировке. Если вычисление идет в таблице и параметр содержит пустую строку, или не указан, то значение вычисляется для группировки – строки. Компоновщик макета при генерации макета компоновки данных заменяет данное имя на имя группировки в результирующем макете. Если группировка не доступна, то функция будет заменена на значение NULL.
Пример :
МестоВПорядке("[Количество Оборот]")
32. КлассификацияABC (ClassificationABC)
Синтаксис :
КлассификацияABC(Значение, КоличествоГрупп, ПроцентыДляГрупп, ИмяГруппировки)
Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.
Предыдущие мои статьи по СКД можно посмотреть по ссылкам ниже:
- Основные понятия и элементы схемы компоновки
- Настройки вариантов отчетов
- Работа с пользовательскими настройками
- Расширения языка запросов
- Наборы данных и связи между ними, иерархии
- Внутренние функции СКД, ВычислитьВыражение
Нет такого программиста 1С, который никогда не работал бы с СКД. И все, кто выводил с помощью системы компоновки даже самые простые отчеты, знают, что такое агрегатные функции. Так как вывод итогов по ресурсам на уровне группировок, это, пожалуй, самая распространенная задача при создании отчета.
Но, далеко не все знают, что список возможных агрегатных функций не ограничивается выпадающим списком в конструкторе СКД:
Если посмотреть справку то можно увидеть гораздо больше агрегатных функций, о существовании некоторых из которых мало кто знает:
А в выпадающем списке консоли СКД отображены только основные агрегатные функции, которые чаще всего приходится применять.
Но мы, программисты 1С довольно редко читаем справку. Обычно мы пытаемся понять новый материал интуитивно, максимум обращаемся к синтаксис-помощнику, и очень зря. Ведь, использование этих функций позволяет сильно облегчить и, главное, ускорить создание большого количество отчетов.
Статья как раз про эти, «скрытые» агрегатные функции, которые иногда оказываются ну очень полезными. В статье будут описаны возможности этих функций, по некоторым будут приведены примеры.
Массив
Функция формирует массив, содержащий значения детальных записей по полю или выражению, указанному в качестве параметра. Обрабатываются подчиненные записи текущей группировки. Ключевое слово «Различные», позволяет получить только уникальные записи. Если в качестве параметра передана таблица значений, сформируется массив со значениями первой колонки таблицы:
Если массив формируется по числовому полю, то к его результату можно применять еще одну агрегатную функцию (Сумма, Количество, Максимум, Минимум, Среднее).
ТаблицаЗначений
Ф ункция формирует таблицу значений. Количество колонок результирующей функции равно количеству переданных параметров (полей или выражений). Обрабатываются подчиненные записи текущей группировки. После ключевого слова «КАК» можно задать наименования колонок таблицы. Ключевое слово «Различные» перед первым параметром позволяет получить только различные записи. Проверка выполняется по всем колонкам таблицы значений.
Если в качестве параметров указаны поля-остатки и данные выбираются с периодичностью (Остатки и обороты), стоки таблицы формируются в разрезе периодов и уникальной комбинации измерений. То-есть, если значение остатка в разных периодах различное, в итоговой таблице значений будет сформировано несколько строк, со значениями из разных периодов.
Для наглядности приведу пример .
Создадим набор данных со следующим запросом:
Добавляем вычисляемое поле «ТаблицаЗначений» и в качестве выражения ресурса, укажем для него:
В результате получаем таблицу значений со значениями на каждый день, в котором было изменение остатка:
Важное дополнение. Если для колонок таблицы значений не заданы наименования после ключевого слова «КАК», во всех функциях, которые выполняют обработку этой таблицы (Свернуть, Упорядочить, ПолучитьЧасть) нельзя использовать наименования для указания требуемых колонок. Имена колонок будут иметь специальные наименования, назначенные системой. Для обращения к этим колонкам можно будет использовать только их порядковые номера. Так что если планируется обращение к колонкам таблицы значений по именам, обязательно нужно указывать эти имена после ключевого слова «КАК».
Свернуть
Функция позволяет удалить повторяющиеся строки из массива или таблицы значений. Если в качестве первого параметра используется Таблица значений, необходимо вторым параметром указать порядковые номера или имена колонок, по которым нужно свернуть данные:
Важный момент , данная функция не сворачивает данные с группировкой суммовых показателей. Происходит именно отсечение строк с повторяющимися значениями:
Для массива, функция аналогична применению ключевого слова «Различные» в функции «Массив». Для таблицы значений, функция позволяет проверить уникальность не по всем колонкам, в отличие от применения ключевого слова «Различные» в функции «ТаблицаЗначений».
ПолучитьЧасть
Функция позволяет получить часть таблицы значений. Оставить только необходимые колонки. Наименования или порядковые номера колонок нужно указать вторым параметром функции:
В результате получится таблица значений с одной колонкой «Номенклатура».
Упорядочить
Функция позволяет упорядочить массив или таблицу значений. Если используется таблица значений, вторым параметром нужно указать номера колонок, по которым требуется выполнить упорядочивание. Можно указать направление упорядочивания (Возр / Убыв) и признак «Автоупорядочивание»:
СоединитьСтроки
Функция выполняет соединение срок, переданных в качестве массива или таблицы значений. Втором параметром можно указать символ соединения строк, массива или таблицы (по умолчанию используется символ перевода строки). Если в качестве первого параметра используется таблица значений, в третьем параметре можно указать символ соединения колонок таблицы (по умолчанию используется символ «;»). Результатом выполнения функции является строка.
Примеры использования функций:
ГрупповаяОбработка
Функция выполняет групповую обработку строк. Вычисляет указные выражения и формирует таблицу значений с результатами этих выражений в контексте текущей или указанной группировки. Важный момент, что в обработку включаются строки, которые находятся на одном уровне с обрабатываемой строкой или на одном уровне иерархии (это не подчиненные строки как для большинства агрегатных функций).
Синтаксис функции следующий:
Выражения – поля или выражения, которые требуется обработать и поместить в результирующие данные.
ВыраженияИерархии – поля или выражения, которые требуется обработать для иерархических записей (если обработка выполняется для иерархии). Если параметр не указан, используются такие же поля, которые указаны в параметре «Выражения».
ИмяГруппировки – Имя группировки, по строкам которой необходимо выполнить расчет. Если параметр не указан, вычисление выполняется по строкам на уровне текущей группировки. Если указанная группировка не доступна на текущем уровне (группировка более низкого уровня), функция вернет значение NULL .
Результат групповой обработки возвращается в виде объекта с типом « ДанныеГрупповойОбработкиКомпоновкиДанных ». Данные групповой обработки можно передать в качестве параметра в экспортную функцию общего модуля
Объект содержит следующие реквизиты:
- Данные – результирующая таблица значений. Колонками таблицы являются поля или результаты выражений, перечисленные в первом параметре функции «ГрупповаяОбработка».
- ТекущийЭлемент – строка таблицы значений соответствующая текущему элементу группировки.
- ВременныеДанныеОбработки – структура в которую можно поместить произвольные параметры в процессе работы с результатом групповой обработки в функции общего модуля. Эти параметры будут доступны при следующей обработке групповых данных в рамках этой же группировки.
Пример использования функции
Создадим набор данных с простым запросом:
Создадим вычисляемое поле «ГрупповаяОбработка», определим его как ресурс и укажем следующее выражение:
СКДСервер.ФункцияОбщегоМодуля(ГрупповаяОбработка ("СУММА(КоличествоОборот) КАК Количество"))
В конфигурации, в общем серверном модуле «СКДСервер» разместим экспортную процедуру:
Функция рассчитывает отклонение значения в текущей группировке от среднего значения по всем группировкам.
Проверяется наличие параметра «СреднееКоличество» в структуре «ВременныеДанныеОбработки». Если параметр существует, используется он, так как среднее количество в рамках одной и той же группировки будет одинаковым. Если параметра не существует (выводится первая строка группировки), выполняется его расчет по таблицы значений «Данные». Полученное значение добавляется в структуру «ВременныеДанныеОбработки».
На заметку. Имейте в виду про следующую особенность. Функция общего модуля, указанная для ресурса, вызывается дважды для одной и той же строки. Это связано с типовой обработкой расшифровки для поля – ресурса. Если для данного поля создать собственный макет, с указанием одного и того же выражения для основного параметра и для параметра расшифровки, такой особенности не будет. Функция будет вызвана один раз для каждой строки.
Каждый
Функция вычисляет выражения для всех строк и возвращает значение «Истина», если выражения по всем строкам вернули значение «Истина». В противном случае, будет возвращено значение «Ложь».
Любой
Функция вычисляет выражения для всех строк и возвращает значение «Истина», если хотя бы по одной строке результат будет «Истина». В противном случае, будет возвращено значение «Ложь».
МестоВПорядке
Функция определяет позицию данной строки, если расположить все строки группировки в порядке, указанном в выражении первого параметра. Также как и для функции «ГрупповаяОработка», используются строки, которые находятся на одном уровне с обрабатываемой или на одном уровне иерархии (не вложенные строки).
Строки с одинаковым значением порядка будут иметь одно и то же место.
Синтаксис функции следующий:
Порядок – выражение порядка, по которому происходит сортировка строк. Можно указать направление упорядочивания (Возр / Убыв) и признак «Автоупорядочивание».
ПорядокИерархия – выражение упорядочивания для иерархических записей. Если не указано, действует выражение для основных записей.
ИмяГруппировки – группировка, в контексте которой необходимо выполнить упорядочивание. Если параметр не указан, порядок вычисляется в контексте текущей группировки.
Для обычных строк группировки действует сортировка по полю «КоличествоОборот», для иерархических – «СуммаОборот»:
Для всех вложенных группировок место в порядке будет рассчитано по группировкам верхнего уровня «Покупатель»:
КлассификацияABC
Функция вычисляет значение классификации « ABC » по переданному выражению и пороговым значениям.
Синтаксис функции следующий:
Значение – поле или выражение, для которого требуется рассчитать классификацию ABC .
КоличествоГрупп – количество групп классификации. Можно указать количество больше трех, тогда уже будет классификация « ABCD », « ABCDE » и т.д.
ПроцентыДляГрупп – пороги для попадания в группы через запятую в виде строки. Причем для последней группы порог не указывается. Диапазон последней группы считается от последнего порога до 100%. Пример указания порогов для трех групп: «50, 80».
ИмяГруппировки — группировка, в контексте которой необходимо выполнить расчет. Если параметр не указан, вычисление происходит в контексте текущей группировки.
Классификация вложенных строк выполняется по строкам группировки верхнего уровня «Покупатель»:
В СКД существует еще целый набор математических агрегатных функций:
- СтандартноеОтклонениеГенеральнойСовокупности
- СтандартноеОтклонениеВыборки
- ДисперсияВыборки
- ДисперсияГенеральнойСовокупности
- КовариацияГенеральнойСовокупности
- КовариацияВыборки
- Корреляция
- РегрессияНаклон
- РегрессияОтрезок
- РегрессияКоличество
- РегрессияR2
- РегрессияСреднееX
- РегрессияСреднееY
- РегрессияSXX
- РегрессияSYY
- РегрессияSXY
Их рассмотрение и использование заслуживает отдельной статьи, так что здесь я их разбирать не буду.
Спасибо за внимание. В следующих статьях я планирую рассматривать программную работу с отчетами на СКД, а также привести разбор некоторых интересных примеров.
Что-то вроде FAQ Отзывов (3) В закладки
В свете ближайшего выхода 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С:Предприятие».
Подстрока(, , ) – Данная функция предназначена для выделения подстроки из строки.
ДлинаСтроки() – Функция предназначена для определения длины строки. Параметр — выражение строкового типа
Строка() – Если в качестве параметра передан массив, то функция возвращает строку, содержащую строковые представления всех элементов массива, разделенных символами “; “. Если в качестве параметра передана таблица значений, то функция возвращает строку, содержащую строковые представления всех строк таблицы значений, причем представления ячеек каждой строки разделяются символами “; “, а строки — смиволом перевода строки. Если у какого либо элемента строковое представление пустое, то вместо его представления выводится строка.
Читайте также: