Тип: Число. Номер периода в случае, если поле является полем–периодом. Значение 0 означает, что данное поле периодом не является. Самый старший период должен иметь номер 1. Его дочерний период – 2 и т.д. Например, для запроса, получающего данные из виртуальной таблицы остатки и обороты, поле Период должно иметь номер периода = 1, поле Регистратор – 2, поле НомерСтроки – 3. На основании данной информации механизм будет рассчитывать итоги по полям остатка.
Полное описание, параметры и ограничения
РольПоляНабораДанныхКомпоновкиДанных.НомерПериода (DataCompositionDataSetFieldRole.PeriodNumber)
РольПоляНабораДанныхКомпоновкиДанных (DataCompositionDataSetFieldRole)
НомерПериода (PeriodNumber)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: Число.
Номер периода в случае, если поле является полем–периодом.
Значение 0 означает, что данное поле периодом не является. Самый старший период должен иметь номер 1. Его дочерний период – 2 и т.д.
Например, для запроса, получающего данные из виртуальной таблицы остатки и обороты, поле Период должно иметь номер периода = 1, поле Регистратор – 2, поле НомерСтроки – 3. На основании данной информации механизм будет рассчитывать итоги по полям остатка.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Описать пару остатков и обнаружить неправильное сложение месяцев
Для BOOK январь 10 → 13, февраль 13 → 11. Пара полей имеет общую группу Количество и разные типы остатка.
Где и как запускать
Полный серверный общий модуль собственной учебной базы; настройка схемы не является проведением документов.
Подготовка
В своей отдельной учебной базе 8.5.1.1343 создайте серверный общий модуль УчебныеРолиПолейСКД. Вставьте полный текст одного урока: процедуру и две функции ниже неё.
Вызовите УчебныеРолиПолейСКД.ВыполнитьПример() из серверной команды собственной обработки. Схема и таблицы остаются на сервере, на клиент выводятся только сообщения.
Товары, даты, остатки и номер 50 заданы собственными константами. Код не читает и не изменяет регистры, план счетов, документы или файлы.
Схема описывается явно: АвтоЗаполнениеДоступныхПолей выключено, каждое поле добавляется через коллекцию Поля. Роль получается из настоящего поля, отдельного конструктора роли нет.
В первом уроке выполняется СКД. Уроки остатков, измерений, периодов и бухгалтерских ролей отдельно проверяют настройку схемы и её исходные строки; это не доказательство корректных итогов рабочего отчёта.
Процедура ВыполнитьПример() Экспорт
Схема = СоздатьУчебнуюСхему("ВЫБРАТЬ ДАТАВРЕМЯ(2026, 1, 1) КАК Период,
| ""BOOK"" КАК Товар, 10 КАК КоличествоНачальныйОстаток,
| 13 КАК КоличествоКонечныйОстаток
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ДАТАВРЕМЯ(2026, 2, 1), ""BOOK"", 13, 11");
Набор = Схема.НаборыДанных.Получить(0);
Период = ДобавитьУчебноеПоле(Набор, "Период", "Дата");
Товар = ДобавитьУчебноеПоле(Набор, "Товар", "Строка");
Начальный = ДобавитьУчебноеПоле(Набор, "КоличествоНачальныйОстаток", "Число");
Конечный = ДобавитьУчебноеПоле(Набор, "КоличествоКонечныйОстаток", "Число");
Период.Роль.НомерПериода = 1;
Период.Роль.ТипПериода = ТипПериодаКомпоновкиДанных.Основной;
Товар.Роль.Измерение = Истина;
РольНачального = Начальный.Роль;
РольНачального.Остаток = Истина;
РольНачального.ТипОстатка = ТипОстаткаКомпоновкиДанных.НачальныйОстаток;
РольНачального.ГруппаОстатка = "Количество";
РольКонечного = Конечный.Роль;
РольКонечного.Остаток = Истина;
РольКонечного.ТипОстатка = ТипОстаткаКомпоновкиДанных.КонечныйОстаток;
РольКонечного.ГруппаОстатка = "Количество";
Сообщить(Товар.Роль.Измерение);
Сообщить(Период.Роль.НомерПериода = 1);
Сообщить(РольНачального.Остаток И РольКонечного.Остаток);
Сообщить(РольНачального.ГруппаОстатка = РольКонечного.ГруппаОстатка);
Сообщить(РольНачального.ТипОстатка <> РольКонечного.ТипОстатка);
Запрос = Новый Запрос(Набор.Запрос);
Строки = Запрос.Выполнить().Выгрузить();
Январь = Строки.Найти(Дата(2026, 1, 1), "Период");
Февраль = Строки.Найти(Дата(2026, 2, 1), "Период");
Сообщить(Строки.Количество() = 2);
Сообщить(Январь.КоличествоКонечныйОстаток = Февраль.КоличествоНачальныйОстаток);
Сообщить(Январь.КоличествоНачальныйОстаток = 10);
Сообщить(Февраль.КоличествоКонечныйОстаток = 11);
Сообщить(Строки.Итог("КоличествоНачальныйОстаток") = 23);
Сообщить("23 — сумма начальных остатков двух месяцев, НЕ начальный остаток всего интервала.");
КонецПроцедуры
Функция СоздатьУчебнуюСхему(ТекстЗапроса)
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеДанные";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
Набор.Запрос = ТекстЗапроса;
Возврат Схема;
КонецФункции
Функция ДобавитьУчебноеПоле(Набор, ИмяПоля, ТипПоля)
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = ИмяПоля;
Поле.ПутьКДанным = ИмяПоля;
Поле.Заголовок = ИмяПоля;
Поле.ТипЗначения = Новый ОписаниеТипов(ТипПоля);
Возврат Поле;
КонецФункцииРазбор по шагам
Обозначить Товар измерением, Период периодом № 1. Это информация для расчёта остатков по товарам и времени.
Назначить обоим числовым полям Остаток и одинаковую ГруппаОстатка. Начальному и конечному полям задать разные ТипОстатка.
Выполнить исходный константный запрос отдельно от СКД. Найти месяцы по дате, не по непредсказуемому порядку выборки.
Проверить непрерывность 13 = 13. Начальный всего интервала 10, конечный 11; механическая сумма начальных значений 23 не является начальным остатком.
Как проверить результат
Десять булевых проверок дают Истина; затем выводится предупреждение про 23.
В отладчике роли пары содержат группу Количество. Здесь ещё нет ресурсов и итоговых группировок СКД: алгоритм итогов не запускается.
Ожидаемый результат
Рабочий код настройки пары остатков и контроль исходных данных до построения итогового отчёта.
На что обратить внимание
Нельзя суммировать остатки одного товара по последовательным датам как обороты.
Для реального регистра нужны его настоящие измерения и периоды, а не эти учебные поля.
Правильные роли не исправляют дубли запроса и неправильные связи наборов данных.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Построить отчёт без ошибочных ролей остатка и периода
Явно описываем четыре поля запроса и получаем две строки отчёта: Книга 750, Ручка 50. Сумма продажи — не остаток на дату.
Где и как запускать
Полный серверный общий модуль собственной учебной базы; настройка схемы не является проведением документов.
Подготовка
В своей отдельной учебной базе 8.5.1.1343 создайте серверный общий модуль УчебныеРолиПолейСКД. Вставьте полный текст одного урока: процедуру и две функции ниже неё.
Вызовите УчебныеРолиПолейСКД.ВыполнитьПример() из серверной команды собственной обработки. Схема и таблицы остаются на сервере, на клиент выводятся только сообщения.
Товары, даты, остатки и номер 50 заданы собственными константами. Код не читает и не изменяет регистры, план счетов, документы или файлы.
Схема описывается явно: АвтоЗаполнениеДоступныхПолей выключено, каждое поле добавляется через коллекцию Поля. Роль получается из настоящего поля, отдельного конструктора роли нет.
В первом уроке выполняется СКД. Уроки остатков, измерений, периодов и бухгалтерских ролей отдельно проверяют настройку схемы и её исходные строки; это не доказательство корректных итогов рабочего отчёта.
Процедура ВыполнитьПример() Экспорт
Схема = СоздатьУчебнуюСхему("ВЫБРАТЬ
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 250 КАК Цена,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 1, 50, 50");
Набор = Схема.НаборыДанных.Получить(0);
ДобавитьУчебноеПоле(Набор, "Наименование", "Строка");
ДобавитьУчебноеПоле(Набор, "Количество", "Число");
ДобавитьУчебноеПоле(Набор, "Цена", "Число");
Сумма = ДобавитьУчебноеПоле(Набор, "Сумма", "Число");
РольСуммы = Сумма.Роль;
РольСуммы.Остаток = Ложь;
РольСуммы.Измерение = Ложь;
РольСуммы.НомерПериода = 0;
РольСуммы.ТипОстатка = ТипОстаткаКомпоновкиДанных.Нет;
РольСуммы.ТипБухгалтерскогоОстатка = ТипБухгалтерскогоОстаткаКомпоновкиДанных.Нет;
РольСуммы.Основное = Ложь;
Сообщить(ТипЗнч(РольСуммы) = Тип("РольПоляНабораДанныхКомпоновкиДанных"));
Сообщить(ТипЗнч(РольСуммы.Обязательное) = Тип("Булево"));
Сообщить(НЕ РольСуммы.Остаток И НЕ РольСуммы.Измерение);
Сообщить(РольСуммы.НомерПериода = 0);
Сообщить(РольСуммы.ТипОстатка = ТипОстаткаКомпоновкиДанных.Нет);
Сообщить(НЕ РольСуммы.Основное);
РабочиеНастройки = Схема.НастройкиПоУмолчанию;
Для Каждого ПолеСхемы Из Набор.Поля Цикл
Выбранное = РабочиеНастройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ПолеСхемы.ПутьКДанным);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = РабочиеНастройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, РабочиеНастройки, , ,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Приемник = Новый ТаблицаЗначений;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Сообщить(Результат.Количество() = 2);
Сообщить(Результат.Итог("Сумма") = 800);
Сообщить(Результат.Найти("Книга", "Наименование").Количество = 3);
КонецПроцедуры
Функция СоздатьУчебнуюСхему(ТекстЗапроса)
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеДанные";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
Набор.Запрос = ТекстЗапроса;
Возврат Схема;
КонецФункции
Функция ДобавитьУчебноеПоле(Набор, ИмяПоля, ТипПоля)
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = ИмяПоля;
Поле.ПутьКДанным = ИмяПоля;
Поле.Заголовок = ИмяПоля;
Поле.ТипЗначения = Новый ОписаниеТипов(ТипПоля);
Возврат Поле;
КонецФункцииРазбор по шагам
Создать собственную схему и четыре настоящих поля. РольСуммы — объект из Сумма.Роль, не копия и не произвольная структура.
Отключить роли остатка, измерения и основного поля; номер периода 0. Обязательное только прочитать: это вычисляемая служебная информация, не пользовательский переключатель.
Добавить четыре выбранных поля и детальную группировку. Скомпилировать макет именно для вывода в коллекцию значений.
Выполнить СКД и сравнить собственный результат с двумя константами. Итог 800 здесь проверяется у готовой таблицы, а не выдумывается из флага роли.
Как проверить результат
Девять проверок выводят Истина.
В Результат две строки, у Книга количество 3, итог Сумма 800. Порядок строк не проверяется.
Ожидаемый результат
Полный программный отчёт с явно описанной схемой и проверяемым результатом.
На что обратить внимание
Роль и Обязательное нельзя заменить присваиванием: свойства только для чтения. Изменяются разрешённые свойства объекта Роль.
НомерПериода не является номером строки таблицы. Для непериодного поля оставляют 0.
ТипБухгалтерскогоОстатка.Нет подходит обычной сумме продажи: это не дебет и не кредит.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.