Получает количество элементов в коллекции.
Синтаксис
Количество()Полное описание, параметры и ограничения
ОграниченияИспользованияДоступныхПолейКомпоновкиДанных.Количество (DataCompositionAvailableFieldUseRestrictions.Count)
ОграниченияИспользованияДоступныхПолейКомпоновкиДанных (DataCompositionAvailableFieldUseRestrictions)
Количество (Count)
Доступен, начиная с версии 8.1.
Синтаксис:
Количество()
Возвращаемое значение:
Тип: Число.
Описание:
Получает количество элементов в коллекции.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
СКД: скрыть затраты в одном редакторе выбора полей, не изменив данные отчёта
В собственной управляемой форме две таблицы одних доступных полей. Меняем только ограничения левой, показываем настоящие элементы коллекции и проверяем неизменность полного результата СКД.
Где и как запускать
Полный модуль собственной управляемой формы Поля. Директивы клиента/сервера включены; отдельный Пульт ниже. Без записи/сети/печати, не выполнялся.
Подготовка
НОВАЯ отдельная файловая база 8.5.1.1343: имя конфигурации УчебныеОграниченияПолейСКД85, совместимость НеИспользовать, управляемое приложение. Без документов, справочников, регистров, расширений, подписок, обмена или внешних действий. Здесь запуск не выполнялся: runtimeVerifiedScenarios=0.
Собственная обработка УчебныйВыборПолей85 → управляемая форма Поля. Добавьте реквизит КомпоновщикНастроек типа КомпоновщикНастроекКомпоновкиДанных. В Использовать всегда включите КомпоновщикНастроек.ФиксированныеНастройки и КомпоновщикНастроек.ПользовательскиеНастройки. Не создавайте отдельный реквизит непонятного типа для ограничений.
В форме Поля две таблицы ОграниченныеПоля85 и СвободныеПоля85: Представление=Дерево, Автозаполнение=Да, Изменять состав строк=Нет, Изменять порядок строк=Нет, режим выбора. Для ОБЕИХ ПутьКДанным выберите КомпоновщикНастроек → Настройки → Выбор → ДоступныеПоляВыбора. Это расширение таблицы для доступных полей СКД, не обычная ТаблицаЗначений.
Создайте три команды формы: СкрытьЗатраты, СнятьОдноОграничение, ОчиститьСвоиОграничения; действия — одноимённые клиентские процедуры, выведите кнопки. ПриСозданииНаСервере назначьте одноимённому событию. Вставьте полный основной модуль формы Поля целиком, без обёртки общим модулем.
В той же обработке управляемая форма Пульт, команда ОткрытьПоля с действием ОткрытьПоля, отдельный полный модуль ниже. F7 и обновление только своего стенда. Пульт открывает новое собственное окно Поля с уникальным ключом; не перенастраивает чужое уже открытое окно.
Источник только три константных строки Книга 750/500, Ручка 50/30, Книга 500/300. СКД формирует собственную таблицу в памяти: выручка 1300, затраты 830. Это не секретные или рабочие данные. Нет сохранения пользовательских настроек, записи БД, файла, сети или печати.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойКонтекст();
СвоиПути = Новый Массив;
СвоиПути.Добавить("КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора");
СвоиПути.Добавить("КомпоновщикНастроек.Settings.Selection.SelectionAvailableFields");
Если СвоиПути.Найти(Элементы.ОграниченныеПоля85.ПутьКДанным) = Неопределено
Или СвоиПути.Найти(Элементы.СвободныеПоля85.ПутьКДанным) = Неопределено Тогда
Отказ = Истина;
ВызватьИсключение "Обе собственные таблицы должны быть связаны с реальными доступными полями выбора";
КонецЕсли;
Схема = СоздатьСвоюСхему();
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
Если Элементы.ОграниченныеПоля85.ОграниченияИспользования.Количество() <> 0
Или Элементы.СвободныеПоля85.ОграниченияИспользования.Количество() <> 0 Тогда
Отказ = Истина;
ВызватьИсключение "У нового собственного окна не должно быть чужих ограничений";
КонецЕсли;
ПроверитьСвойПолныйОтчет();
КонецПроцедуры
&НаКлиенте
Процедура СкрытьЗатраты(Команда)
СкрытьЗатратыНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура СнятьОдноОграничение(Команда)
СнятьОдноОграничениеНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьСвоиОграничения(Команда)
ОчиститьСвоиОграниченияНаСервере();
КонецПроцедуры
&НаСервере
Процедура СкрытьЗатратыНаСервере()
ПроверитьСвойКонтекст();
ПроверитьСвойПолныйОтчет();
Ограничения = Элементы.ОграниченныеПоля85.ОграниченияИспользования;
Если ТипЗнч(Ограничения) <> Тип("ОграниченияИспользованияДоступныхПолейКомпоновкиДанных")
Или Ограничения.Количество() <> 0 Тогда
ВызватьИсключение "Сначала снимите собственное ограничение; чужие или повторные правила не перезаписываются";
КонецЕсли;
Доступные = КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора;
Затраты = Доступные.НайтиПоле(Новый ПолеКомпоновкиДанных("Затраты"));
Выручка = Доступные.НайтиПоле(Новый ПолеКомпоновкиДанных("Выручка"));
Если Затраты = Неопределено Или Выручка = Неопределено Тогда
ВызватьИсключение "Нужны настоящие доступные поля собственной Local-схемы";
КонецЕсли;
Свое = Ограничения.Добавить();
Свое.Поле = Затраты.Поле;
Свое.Доступность = Ложь;
Если ТипЗнч(Свое) <> Тип("ОграничениеИспользованияДоступногоПоляКомпоновкиДанных")
Или Свое.Поле <> Новый ПолеКомпоновкиДанных("Затраты") Или Свое.Доступность Тогда
ВызватьИсключение "Нужно своё настоящее выключающее правило только для Затраты";
КонецЕсли;
Временное = Ограничения.Вставить(0);
Временное.Поле = Выручка.Поле;
Временное.Доступность = Истина;
Если Ограничения.Индекс(Свое) <> 1 Или Ограничения.Получить(0) <> Временное Тогда
ВызватьИсключение "Вставка своего временного правила должна изменить индекс, не поле";
КонецЕсли;
Ограничения.Сдвинуть(Свое, -1);
Если Ограничения.Индекс(Свое) <> 0 Или Ограничения.Получить(0) <> Свое
Или Свое.Поле <> Затраты.Поле Или Свое.Доступность Тогда
ВызватьИсключение "Сдвиг не должен подменить или включить своё правило затрат";
КонецЕсли;
Ограничения.Удалить(Выручка);
Если Ограничения.Количество() <> 1 Или Ограничения.Получить(0) <> Свое Тогда
ВызватьИсключение "По реальному доступному полю Выручка удаляется только своё временное правило";
КонецЕсли;
Найденное = Ограничения.Найти(Строка(Затраты.Поле));
Если Найденное = Неопределено Тогда
ВызватьИсключение "Поиск по каноническому строковому идентификатору собственного поля не подтвердился";
КонецЕсли;
Если Найденное <> Свое Или Найденное.Поле <> Затраты.Поле Или Найденное.Доступность Тогда
ВызватьИсключение "Поиск должен вернуть своё правило, а не поле по подписи";
КонецЕсли;
Если Элементы.СвободныеПоля85.ОграниченияИспользования.Количество() <> 0 Тогда
ВызватьИсключение "Ограничение одной своей таблицы не должно затронуть вторую";
КонецЕсли;
ПроверитьСвойПолныйОтчет();
Сообщить("Проверено собственное правило: Затраты скрываются только в левой таблице доступных полей. Вторая таблица и полный результат СКД не ограничены.");
КонецПроцедуры
&НаСервере
Процедура СнятьОдноОграничениеНаСервере()
ПроверитьСвойКонтекст();
Затраты = КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.НайтиПоле(Новый ПолеКомпоновкиДанных("Затраты"));
Если Затраты = Неопределено Тогда
ВызватьИсключение "Собственное доступное поле Затраты исчезло";
КонецЕсли;
Ограничения = Элементы.ОграниченныеПоля85.ОграниченияИспользования;
ПроверитьЕдинственноеСвоеПравило(Ограничения);
Ограничения.Удалить(Затраты);
Если Ограничения.Количество() <> 0 Тогда
ВызватьИсключение "Удаление правил собственного доступного поля не подтвердилось";
КонецЕсли;
ПроверитьСвойПолныйОтчет();
Сообщить("Снято своё правило по настоящему доступному полю, включая его синонимы; рабочие данные не менялись.");
КонецПроцедуры
&НаСервере
Процедура ОчиститьСвоиОграниченияНаСервере()
ПроверитьСвойКонтекст();
Ограничения = Элементы.ОграниченныеПоля85.ОграниченияИспользования;
ПроверитьЕдинственноеСвоеПравило(Ограничения);
Ограничения.Очистить();
Если Ограничения.Количество() <> 0 Или Элементы.СвободныеПоля85.ОграниченияИспользования.Количество() <> 0 Тогда
ВызватьИсключение "Очищается только собственная коллекция левой таблицы";
КонецЕсли;
ПроверитьСвойПолныйОтчет();
Сообщить("Своя коллекция ограничений очищена; оба списка снова без собственного скрытия затрат.");
КонецПроцедуры
&НаСервере
Процедура ПроверитьЕдинственноеСвоеПравило(Ограничения)
Если Ограничения.Количество() <> 1 Тогда
ВызватьИсключение "Снимать можно только одно созданное этим уроком правило собственной таблицы";
КонецЕсли;
Свое = Ограничения.Получить(0);
Если Свое.Поле <> Новый ПолеКомпоновкиДанных("Затраты") Или Свое.Доступность Тогда
ВызватьИсключение "Неподготовленное правило не очищается и не удаляется";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроверитьСвойПолныйОтчет()
Схема = СоздатьСвоюСхему();
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Если Настройки.Выбор.Элементы.Количество() <> 3 Или Настройки.Отбор.Элементы.Количество() <> 0 Тогда
ВызватьИсключение "Проверяем неизменный собственный вариант, не изменённый пользователем отчёт";
КонецЕсли;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Таблица = Новый ТаблицаЗначений;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Таблица);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение "Нужен настоящий результат своей схемы, не заранее подставленная таблица";
КонецЕсли;
Если Результат.Количество() <> 3 Или Результат.Колонки.Количество() <> 3
Или Результат.Колонки.Найти("Наименование") = Неопределено
Или Результат.Колонки.Найти("Выручка") = Неопределено
Или Результат.Колонки.Найти("Затраты") = Неопределено Тогда
ВызватьИсключение "Ограничения таблицы выбора не должны удалять затраты из уже выбранного отчёта";
КонецЕсли;
Найденные = Новый Массив;
Для Каждого СтрокаРезультата Из Результат Цикл
Если СтрокаРезультата.Выручка = 750 Тогда
Имя = "Книга";
Затраты = 500;
ИначеЕсли СтрокаРезультата.Выручка = 50 Тогда
Имя = "Ручка";
Затраты = 30;
ИначеЕсли СтрокаРезультата.Выручка = 500 Тогда
Имя = "Книга";
Затраты = 300;
Иначе
ВызватьИсключение "Лишняя строка собственного константного источника";
КонецЕсли;
Если Найденные.Найти(СтрокаРезультата.Выручка) <> Неопределено
Или СтрокаРезультата.Наименование <> Имя Или СтрокаРезультата.Затраты <> Затраты Тогда
ВызватьИсключение "Не совпала полная собственная строка до или после ограничения";
КонецЕсли;
Найденные.Добавить(СтрокаРезультата.Выручка);
КонецЦикла;
Если Результат.Итог("Выручка") <> 1300 Или Результат.Итог("Затраты") <> 830 Тогда
ВызватьИсключение "Не сохранились контрольные выручка 1300 и затраты 830";
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СоздатьСвоюСхему()
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ ""Книга"" КАК Наименование, 750 КАК Выручка, 500 КАК Затраты
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 50, 30
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 500, 300";
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Выручка,Затраты", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
Возврат Схема;
КонецФункции
&НаСервереБезКонтекста
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеОграниченияПолейСКД85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыУчебныйВыборПолей85.Пульт
УчебныеОграниченияПолейСКД85 → Обработки → УчебныйВыборПолей85 → Формы → Пульт → Модуль
Полный клиентский модуль собственной управляемой формы Пульт; не выполнялся.
&НаКлиенте
Процедура ОткрытьПоля(Команда)
ОткрытьФорму("Обработка.УчебныйВыборПолей85.Форма.Поля", , ЭтаФорма, Новый УникальныйИдентификатор);
КонецПроцедурыРазбор по шагам
Реальный образец связки найден в XML и модуле КА2 ФормаВыбораДоступногоПоля: реквизит SettingsComposer, путь Settings.Selection.SelectionAvailableFields и Добавить через Элементы таблицы. Урок воспроизводит только механизм на собственных константах, не использует рабочую форму КА2.
При создании проверяем имя собственной конфигурации, платформу, совместимость и оба уже заданных пути. Допускаются только два точных написания одной связи: русские имена свойств и сохранённые в реальном XML Settings.Selection.SelectionAvailableFields. ПутьКДанным читаем, не перезаписываем: native разрешает установку только когда он ещё не задан. Инициализация собственного реквизита привязывает две таблицы к одной собственной схеме.
ОграниченияИспользования — readonly-свойство управляемой таблицы. Его коллекцию можно редактировать, но нельзя присваивать ей другой объект. Тип коллекции и тип её Добавить проверяются, а поле ограничения берётся из настоящего доступного поля схемы.
СкрытьЗатраты требует пустую собственную коллекцию. Добавляет своё правило Поле=Затраты и Доступность=False. Временное правило Выручка=True вставляется перед ним: Индекс/Получить/Сдвинуть показывают изменение порядка без замены поля или его флага.
Удалить получает настоящее доступное поле Выручка, как разрешает native-контракт. Поэтому удаляются соответствующие собственные временные правила и их синонимы; элемент ограничения не передаём наугад. Остаётся ровно одно своё выключающее правило затрат.
Найти получает Строка(Затраты.Поле), то есть каноническое имя собственного поля, не Заголовок и не случайный UUID. Nullable результат, идентичность правила, Поле и Доступность перепроверяются.
Вторая таблица остаётся без ограничений. Полный отчёт формируется заново из той же собственной схемы и настоящих настроек редактора: все три исходные строки, все три колонки и обе суммы проверяются до и после ограничения.
СнятьОдноОграничение удаляет правила по реальному доступному полю Затраты. ОчиститьСвоиОграничения очищает только собственную левую коллекцию. Оба пути сначала требуют ровно одно известное правило; чужую коллекцию или произвольные правила не очищаем.
Ограничение списка доступных полей не является RLS, правом доступа, маскировкой результата или шифрованием. Затраты уже включены в выборку и остаются в отчёте. Такое скрытие подходит для удобства отдельного редактора, не для защиты информации.
Как проверить результат
Будущий ручной тест: F7, свой Пульт → новое окно Поля. Сначала в обоих деревьях доступны свои Наименование/Выручка/Затраты; в серверном коде проходят три строки и суммы 1300/830.
Нажмите СкрытьЗатраты: в левой коллекции одно правило Затраты=False, правая коллекция пустая. Визуально проверьте скрытие Затраты только слева. Статическая проверка флага сама по себе не доказывает отрисовку — здесь UI не запускался.
Полный результат после скрытия всё ещё содержит Затраты 500/30/300 и итог 830. Если колонка/строка пропала, опыт не считается успешным.
После СнятьОдноОграничение левая коллекция пуста. Повторите СкрытьЗатраты и проверьте альтернативное ОчиститьСвоиОграничения: снова пусто, правая коллекция и полный результат неизменны.
Повторное СкрытьЗатраты без снятия, неизвестное правило или изменённый выбор/отбор должны вызвать явную ошибку. Не исправляйте это очисткой чужих настроек.
Ожидаемый результат
Будущий результат: управляемая таблица выбора скрывает своё поле только локально; реальные данные СКД остаются прежними. Собственные правила снимаются двумя способами. В 1С/браузере не проверялось.
На что обратить внимание
Не переносите ограничения интерфейса в модель безопасности. Для секретных затрат требуются настоящие права/RLS и отдельная проверка источника/выдачи данных.
Native ПолеДоступно содержит несогласование: тип параметра называет элемент ограничения, описание — доступное поле. Здесь этот метод не вызывается и не помечается покрытым; неподтверждённый вызов не добавляется ради счётчика.
Native Удалить перечисляет другие допустимые типы, а не просто элемент, возвращённый Добавить. Поэтому в этом уроке передаётся реальное доступное поле своей схемы.
Пути и типы управляемой таблицы отличаются от обычного табличного поля. Не привязываем этот урок к API обычного элемента и не выдумываем Новый коллекции ограничений.
Две собственные таблицы видят одни доступные поля, но коллекции ограничений принадлежат элементам интерфейса. Ни source-поля, ни уже выбранные колонки отчёта не удаляются.
Код не запускается автоматически из справочника. Ожидаемое скрытие требует ручной UI-проверки своего нового окна; runtimeVerifiedScenarios=0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.