Тип: Число. Указывает количество записей.
Полное описание, параметры и ограничения
ЗаписиМакетаКомпоновкиДанных.КоличествоЗаписей (DataCompositionTemplateRecords.RecordsCount)
ЗаписиМакетаКомпоновкиДанных (DataCompositionTemplateRecords)
КоличествоЗаписей (RecordsCount)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: Число.
Указывает количество записей.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Примечание:
Если значение равно -1, выводятся все записи.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Лимит детальных записей: одна настоящая строка и возврат полного вывода
Тот же полный макет ограничиваем до одной детальной записи при 100%, сверяем все ячейки полученного товара и возвращаем две строки с количеством 4 и суммой 800.
Где и как запускать
Полный серверный общий модуль УчебныеДетальныеЗаписи85 собственного нового стенда; отдельный полный модуль формы ниже.
Подготовка
НОВАЯ пустая файловая база 8.5.1.1343: корневое Имя=УчебныеДетальныеЗаписи85, совместимость НеИспользовать, управляемое приложение. Не рабочая база и не копия КА2/УНФ/УТ/БП. Без бизнес-метаданных, расширений, подписок, заданий и внешних действий. Здесь в 1С не запускалось: runtimeVerifiedScenarios=0.
Общий модуль УчебныеДетальныеЗаписи85: Сервер=Да, Клиент=Нет, Вызов сервера=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной код одного урока. Все свои исходные данные, схема, выбор, настройки, макет и проверки включены; неизвестных входных объектов нет.
Создайте обработку УчебноеТелоОтчета85 → управляемая форма Пульт → команда Выполнить с действием Выполнить и кнопкой. Полный отдельный модуль формы ниже. F7 и обновление только нового своего стенда перед будущим отдельно разрешенным опытом.
Собственный запрос: Книга/3/250/750 и Ручка/1/50/50. Только детальные записи и четыре выбранных поля, без таблиц/диаграмм или иерархических группировок. Генератор макета для коллекции значений; настоящий вывод получается в ТаблицаЗначений.
Обычные ЗаписиМакетаКомпоновкиДанных не тождественны ЗаписиГруппировкиТаблицыМакетаКомпоновкиДанных: их МакетШапки/МакетПодвала — СТРОКИ имен областей, не объекты макетов строковой оси. Смотрите actual-часть в серверном отладчике после ПолучитьСвоиДетальныеЗаписи.
В лимитном уроке порядок строк явно не задается: после КоличествоЗаписей=1 допустима любая одна полная строка исходного запроса. Проверка сверяет ее четыре настоящие ячейки, а не обещает первую Книгу по случайному порядку.
Редакторский урок делает независимый полный XDTO-макет из собственной строки памяти. Временные пустые каркасы детальных записей и очищенное тело не выводятся. Перед повторным выводом восстанавливается ВЕСЬ исходный макет. Файлы, архивы и резервные копии не создаются.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим не нужен";
КонецЕсли;
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 250 КАК Цена,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 1, 50, 50";
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Записи = ПолучитьСвоиДетальныеЗаписи(Макет);
ПоказатьСвоиОпределенияЗаписей(Макет, Записи);
Записи.КоличествоЗаписей = -1;
Записи.ПроцентЗаписей = 100;
Если Записи.КоличествоЗаписей <> -1 Или Записи.ПроцентЗаписей <> 100 Тогда
ВызватьИсключение "В собственном полном макете нужно разрешить все детальные записи";
КонецЕсли;
ПроверитьСвойПолныйВывод(Макет, Неопределено);
Записи.КоличествоЗаписей = 1;
Если Записи.КоличествоЗаписей <> 1 Или Записи.ПроцентЗаписей <> 100 Тогда
ВызватьИсключение "Меняется только лимит своей части: один результат при полном проценте";
КонецЕсли;
ПроверитьСвойОдиночныйВывод(Макет);
Записи.КоличествоЗаписей = -1;
Если Записи.КоличествоЗаписей <> -1 Или Записи.ПроцентЗаписей <> 100 Тогда
ВызватьИсключение "После опыта нужно вернуть полный вывод детальных записей";
КонецЕсли;
ПроверитьСвойПолныйВывод(Макет, Неопределено);
Сообщить("Ограничение части восстановлено; исходный запрос сохранил обе строки и полный результат 4/800.");
КонецПроцедуры
Функция ПолучитьСвоиДетальныеЗаписи(Макет)
Найденные = Новый Массив;
СобратьСвоиОбычныеЗаписи(Макет.Тело, Найденные);
Если Найденные.Количество() <> 1 Тогда
ВызватьИсключение "В своем простом макете нужна ровно одна настоящая часть обычных детальных записей";
КонецЕсли;
Возврат Найденные[0];
КонецФункции
Процедура СобратьСвоиОбычныеЗаписи(Тело, Найденные)
Для Каждого Часть Из Тело Цикл
Если ТипЗнч(Часть) = Тип("ЗаписиМакетаКомпоновкиДанных") Тогда
Найденные.Добавить(Часть);
ИначеЕсли ТипЗнч(Часть) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
СобратьСвоиОбычныеЗаписи(Часть.Тело, Найденные);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПоказатьСвоиОпределенияЗаписей(Макет, Записи)
Если ТипЗнч(Записи) <> Тип("ЗаписиМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Нужны настоящие обычные детальные записи, не записи строковой оси таблицы";
КонецЕсли;
Сообщить("Имя части=" + Записи.Имя + "; идентификатор=" + Записи.Идентификатор);
Сообщить("Фактический отбор записей=" + Записи.ОтборЗаписей);
ПроверитьСвоиИменаНаборов(Макет, Записи.НаборыДанных);
ПроверитьСвоиИменаНаборов(Макет, Записи.ОбязательныеНаборыДанных);
Если Записи.НаборыДанных.Количество() = 0 Тогда
ВызватьИсключение "Своя часть вывода должна ссылаться хотя бы на один настоящий набор";
КонецЕсли;
ПроверитьСсылкуНаОбласть(Макет, Записи.МакетШапки);
ПроверитьСсылкуНаОбласть(Макет, Записи.МакетПодвала);
Если ТипЗнч(Записи.Тело) <> Тип("ТелоМакетаКомпоновкиДанных")
Или ТипЗнч(Записи.Порядок) <> Тип("ВыраженияУпорядочиванияКомпоновкиДанных") Тогда
ВызватьИсключение "Нужны настоящие readonly-тело и коллекция выражений порядка";
КонецЕсли;
Сообщить("Частей тела=" + Строка(Записи.Тело.Количество()) + "; выражений порядка=" + Строка(Записи.Порядок.Количество()));
Для Каждого Выражение Из Записи.Порядок Цикл
Сообщить("Фактическое выражение порядка=" + Выражение.Выражение + "; направление=" + Строка(Выражение.ТипУпорядочивания));
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьСсылкуНаОбласть(Макет, ИмяОбласти)
Если ТипЗнч(ИмяОбласти) <> Тип("Строка") Тогда
ВызватьИсключение "Ссылка на макет области должна быть строкой";
КонецЕсли;
Если ИмяОбласти = "" Тогда
Сообщить("Необязательный макет области отсутствует");
Возврат;
КонецЕсли;
ОписаниеОбласти = Макет.Макеты.Найти(ИмяОбласти);
Если ОписаниеОбласти = Неопределено Тогда
ВызватьИсключение "Нельзя выдумывать техническое имя отсутствующей области: " + ИмяОбласти;
КонецЕсли;
Сообщить("Реальная ссылка на область: " + ИмяОбласти);
КонецПроцедуры
Процедура ПроверитьСвоиИменаНаборов(Макет, Имена)
Если ТипЗнч(Имена) <> Тип("Массив") Тогда
ВызватьИсключение "Нужен настоящий readonly-массив имён наборов записей";
КонецЕсли;
Для Каждого ИмяНабора Из Имена Цикл
Если ТипЗнч(ИмяНабора) <> Тип("Строка") Тогда
ВызватьИсключение "Имя скомпилированного набора должно быть строкой";
КонецЕсли;
НайденныйНабор = Макет.НаборыДанных.Найти(ИмяНабора);
Если НайденныйНабор = Неопределено Тогда
ВызватьИсключение "Записи ссылаются на отсутствующий реальный набор " + ИмяНабора;
КонецЕсли;
Сообщить("Реальная зависимость детальных записей: " + ИмяНабора);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьСвойПолныйВывод(Макет, ВнешниеДанные)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, ВнешниеДанные);
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Приемник = Новый ТаблицаЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Или Результат.Количество() <> 2
Или Результат.Колонки.Количество() <> 4 Тогда
ВызватьИсключение "Настоящий вывод должен дать две строки и четыре колонки";
КонецЕсли;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
ВызватьИсключение "Потеряна ожидаемая колонка реального вывода " + ИмяПоля;
КонецЕсли;
КонецЦикла;
Книга = Результат.Найти("Книга", "Наименование");
Ручка = Результат.Найти("Ручка", "Наименование");
Если Книга = Неопределено Или Ручка = Неопределено Тогда
ВызватьИсключение "Не найдены обе реальные исходные строки результата";
КонецЕсли;
Если Книга.Количество <> 3 Или Книга.Цена <> 250 Или Книга.Сумма <> 750
Или Ручка.Количество <> 1 Или Ручка.Цена <> 50 Или Ручка.Сумма <> 50
Или Результат.Итог("Количество") <> 4 Или Результат.Итог("Сумма") <> 800 Тогда
ВызватьИсключение "Потеряны или изменены реальные ячейки собственного полного вывода";
КонецЕсли;
Сообщить("Настоящий вывод проверен: Книга 3 × 250 = 750, Ручка 1 × 50 = 50; количество 4, сумма 800.");
КонецПроцедуры
Процедура ПроверитьСвойОдиночныйВывод(Макет)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Приемник = Новый ТаблицаЗначений;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Или Результат.Количество() <> 1 Или Результат.Колонки.Количество() <> 4 Тогда
ВызватьИсключение "Лимит одной детальной записи должен дать ровно одну настоящую строку и четыре колонки";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Если Результат.Колонки.Найти(Имя) = Неопределено Тогда
ВызватьИсключение "Потеряно собственное поле одиночного реального результата " + Имя;
КонецЕсли;
КонецЦикла;
Товар = Результат.Получить(0);
Если Товар.Наименование = "Книга" Тогда
Если Товар.Количество <> 3 Или Товар.Цена <> 250 Или Товар.Сумма <> 750 Тогда
ВызватьИсключение "Для реальной Книги должны сохраниться все три числовые ячейки 3/250/750";
КонецЕсли;
ИначеЕсли Товар.Наименование = "Ручка" Тогда
Если Товар.Количество <> 1 Или Товар.Цена <> 50 Или Товар.Сумма <> 50 Тогда
ВызватьИсключение "Для реальной Ручки должны сохраниться ячейки 1/50/50";
КонецЕсли;
Иначе
ВызватьИсключение "Одна выведенная запись должна быть настоящим товаром собственного запроса";
КонецЕсли;
Сообщить("При лимите 1 получено: " + Товар.Наименование + "; количество=" + Строка(Товар.Количество) + "; сумма=" + Строка(Товар.Сумма));
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыУчебноеТелоОтчета85.Пульт
УчебныеДетальныеЗаписи85 → Обработки → УчебноеТелоОтчета85 → Формы → Пульт → Модуль
Полный модуль собственной управляемой формы; здесь не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеДетальныеЗаписи85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
ПолучитьСвоиДетальныеЗаписи ищет настоящий тип в Тело макета и обычных вложенных группировках; простой свой стенд обязан иметь ровно одну часть. Это не общий обход таблиц, диаграмм или иерархических группировок произвольного отчета.
Имя/Идентификатор и ОтборЗаписей читаются из самой скомпилированной части для диагностики. Их нельзя отдельно переименовывать или подменять текстом SQL без согласования с другими определениями макета. Пустой фактический отбор сам по себе не ошибка.
НаборыДанных и ОбязательныеНаборыДанных — readonly-массивы строк. Каждый фактический элемент разрешается через Макет.НаборыДанных.Найти с проверкой Неопределено. Первый массив должен иметь источник для данной части; второй может быть пустым и не дополняется выдуманными обязательными наборами.
Строковые МакетШапки/МакетПодвала разрешаются в Макет.Макеты, если не пусты. Пустое имя — отсутствие необязательной области; оно не превращается в произвольный текст шапки. Для генератора коллекции значений внешнее оформление не обещается.
Readonly-Тело и Порядок читаются как настоящие коллекции. Выражения и направления порядка выводятся из фактических элементов; у ТипУпорядочивания readonly-контракт. Не заменяем коллекции новым массивом и не делаем вид, что отсутствие порядка гарантирует первую Книгу.
КоличествоЗаписей=-1 означает все записи, ПроцентЗаписей=100 — полный процент. После установки этих свойств настоящий процессор должен вернуть две строки, четыре колонки и точные ячейки Книги/Ручки, количество 4 и сумму 800. Эталонная таблица вместо результата не создается.
После полного исходного вывода ставим КоличествоЗаписей=1, не меняя ПроцентЗаписей=100 и запрос. Создаем свежий процессор и проверяем ровно одну строку. Допустимы Книга/3/250/750 или Ручка/1/50/50; никакая другая строка не принимается.
Затем возвращаем -1 и проверяем еще один полноценный реальный вывод двух товаров. Это восстановление настройки части, а не добавление второй строки результата вручную.
Как проверить результат
Будущий полный результат: Книга/3/250/750 и Ручка/1/50/50 в любом порядке, две строки, четыре колонки, итоги 4/800. Настоящая часть записей ссылается только на существующие наборы и области своего макета.
Для отдельного своего разрешенного отрицательного опыта: перед проверкой имен набора добавить в readonly-массив НаборыДанных строку НетТакогоНабора85, не заменяя само свойство. Разрешение зависимости должно отказать. Здесь проверка и изменение не выполнялись.
Если макет не содержит обычных записей, результат пустой или структура отличается от собственного стенда, пример должен отказать, а не подменить его ожидаемыми строками. Реальная компиляция/вывод/XDTO в 1С здесь не выполнялись.
Ожидаются три последовательных результата: две строки/4/800, одна настоящая полная строка, снова две строки/4/800. Один лишь прочитанный установленный лимит не считается доказательством реального ограничения результата.
Ожидаемый результат
Ожидается полноценный настоящий вывод двух товаров и 4/800; в лимитном опыте между полными выводами одна настоящая полная строка. Здесь в 1С не запускалось.
На что обратить внимание
runtimeVerifiedScenarios=0. Код и native-контракты сверяются статически; ожидаемые результаты не выдаются за запуск 1С.
Свойство КоличествоЗаписей ограничивает вывод данной части, не количество исходных строк запроса. ПроцентЗаписей не является отбором по значению Сумма. Произвольные сочетания процентных и количественных ограничений и правила округления этим уроком не проверяются.
Записи.НаборыДанных, ОбязательныеНаборыДанных, Тело и Порядок readonly как ссылки на коллекции. Читать или редактировать допустимые элементы коллекции — не то же самое, что присвоить новое значение свойству.
Фабрики тела Добавить(Тип) и Вставить(Индекс,Тип) ОБЯЗАТЕЛЬНО получают Тип("ЗаписиМакетаКомпоновкиДанных"). Это отличается от фабрик каталога источников. Записи не создаются через выдуманный Новый; Индекс/Сдвинуть/Удалить получают собственный настоящий элемент этого же тела.
В черновике разрешено назначить собственные имя/идентификатор временного каркаса и пустые ссылки шапки/подвала, но это не полноценная часть вывода: нет связанных источников/областей/тела. Черновик не исполняется, исходная скомпилированная часть не переименовывается.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.