ОграничениеИспользованияДоступногоПоляКомпоновкиДанных.Поле

Свойства · Field

Тип: ПолеКомпоновкиДанных. Поле компоновки данных, на которое накладывается ограничение.

Полное описание, параметры и ограничения

ОграничениеИспользованияДоступногоПоляКомпоновкиДанных.Поле (DataCompositionAvailableFieldUseRestriction.Field)

ОграничениеИспользованияДоступногоПоляКомпоновкиДанных (DataCompositionAvailableFieldUseRestriction)

Поле (Field)

Доступен, начиная с версии 8.1.

Использование:
Чтение и запись.
Описание:
Тип: ПолеКомпоновкиДанных.
Поле компоновки данных, на которое накладывается ограничение.
Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

СКД: скрыть затраты в одном редакторе выбора полей, не изменив данные отчёта

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

Где и как запускать

Полный модуль собственной управляемой формы Поля. Директивы клиента/сервера включены; отдельный Пульт ниже. Без записи/сети/печати, не выполнялся.

Подготовка

  1. НОВАЯ отдельная файловая база 8.5.1.1343: имя конфигурации УчебныеОграниченияПолейСКД85, совместимость НеИспользовать, управляемое приложение. Без документов, справочников, регистров, расширений, подписок, обмена или внешних действий. Здесь запуск не выполнялся: runtimeVerifiedScenarios=0.

  2. Собственная обработка УчебныйВыборПолей85 → управляемая форма Поля. Добавьте реквизит КомпоновщикНастроек типа КомпоновщикНастроекКомпоновкиДанных. В Использовать всегда включите КомпоновщикНастроек.ФиксированныеНастройки и КомпоновщикНастроек.ПользовательскиеНастройки. Не создавайте отдельный реквизит непонятного типа для ограничений.

  3. В форме Поля две таблицы ОграниченныеПоля85 и СвободныеПоля85: Представление=Дерево, Автозаполнение=Да, Изменять состав строк=Нет, Изменять порядок строк=Нет, режим выбора. Для ОБЕИХ ПутьКДанным выберите КомпоновщикНастроек → Настройки → Выбор → ДоступныеПоляВыбора. Это расширение таблицы для доступных полей СКД, не обычная ТаблицаЗначений.

  4. Создайте три команды формы: СкрытьЗатраты, СнятьОдноОграничение, ОчиститьСвоиОграничения; действия — одноимённые клиентские процедуры, выведите кнопки. ПриСозданииНаСервере назначьте одноимённому событию. Вставьте полный основной модуль формы Поля целиком, без обёртки общим модулем.

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

  6. Источник только три константных строки Книга 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.Форма.Поля", , ЭтаФорма, Новый УникальныйИдентификатор);
КонецПроцедуры

Разбор по шагам

  1. Реальный образец связки найден в XML и модуле КА2 ФормаВыбораДоступногоПоля: реквизит SettingsComposer, путь Settings.Selection.SelectionAvailableFields и Добавить через Элементы таблицы. Урок воспроизводит только механизм на собственных константах, не использует рабочую форму КА2.

  2. При создании проверяем имя собственной конфигурации, платформу, совместимость и оба уже заданных пути. Допускаются только два точных написания одной связи: русские имена свойств и сохранённые в реальном XML Settings.Selection.SelectionAvailableFields. ПутьКДанным читаем, не перезаписываем: native разрешает установку только когда он ещё не задан. Инициализация собственного реквизита привязывает две таблицы к одной собственной схеме.

  3. ОграниченияИспользования — readonly-свойство управляемой таблицы. Его коллекцию можно редактировать, но нельзя присваивать ей другой объект. Тип коллекции и тип её Добавить проверяются, а поле ограничения берётся из настоящего доступного поля схемы.

  4. СкрытьЗатраты требует пустую собственную коллекцию. Добавляет своё правило Поле=Затраты и Доступность=False. Временное правило Выручка=True вставляется перед ним: Индекс/Получить/Сдвинуть показывают изменение порядка без замены поля или его флага.

  5. Удалить получает настоящее доступное поле Выручка, как разрешает native-контракт. Поэтому удаляются соответствующие собственные временные правила и их синонимы; элемент ограничения не передаём наугад. Остаётся ровно одно своё выключающее правило затрат.

  6. Найти получает Строка(Затраты.Поле), то есть каноническое имя собственного поля, не Заголовок и не случайный UUID. Nullable результат, идентичность правила, Поле и Доступность перепроверяются.

  7. Вторая таблица остаётся без ограничений. Полный отчёт формируется заново из той же собственной схемы и настоящих настроек редактора: все три исходные строки, все три колонки и обе суммы проверяются до и после ограничения.

  8. СнятьОдноОграничение удаляет правила по реальному доступному полю Затраты. ОчиститьСвоиОграничения очищает только собственную левую коллекцию. Оба пути сначала требуют ровно одно известное правило; чужую коллекцию или произвольные правила не очищаем.

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

Как проверить результат

  1. Будущий ручной тест: F7, свой Пульт → новое окно Поля. Сначала в обоих деревьях доступны свои Наименование/Выручка/Затраты; в серверном коде проходят три строки и суммы 1300/830.

  2. Нажмите СкрытьЗатраты: в левой коллекции одно правило Затраты=False, правая коллекция пустая. Визуально проверьте скрытие Затраты только слева. Статическая проверка флага сама по себе не доказывает отрисовку — здесь UI не запускался.

  3. Полный результат после скрытия всё ещё содержит Затраты 500/30/300 и итог 830. Если колонка/строка пропала, опыт не считается успешным.

  4. После СнятьОдноОграничение левая коллекция пуста. Повторите СкрытьЗатраты и проверьте альтернативное ОчиститьСвоиОграничения: снова пусто, правая коллекция и полный результат неизменны.

  5. Повторное СкрытьЗатраты без снятия, неизвестное правило или изменённый выбор/отбор должны вызвать явную ошибку. Не исправляйте это очисткой чужих настроек.

Ожидаемый результат

Будущий результат: управляемая таблица выбора скрывает своё поле только локально; реальные данные СКД остаются прежними. Собственные правила снимаются двумя способами. В 1С/браузере не проверялось.

На что обратить внимание

  1. Не переносите ограничения интерфейса в модель безопасности. Для секретных затрат требуются настоящие права/RLS и отдельная проверка источника/выдачи данных.

  2. Native ПолеДоступно содержит несогласование: тип параметра называет элемент ограничения, описание — доступное поле. Здесь этот метод не вызывается и не помечается покрытым; неподтверждённый вызов не добавляется ради счётчика.

  3. Native Удалить перечисляет другие допустимые типы, а не просто элемент, возвращённый Добавить. Поэтому в этом уроке передаётся реальное доступное поле своей схемы.

  4. Пути и типы управляемой таблицы отличаются от обычного табличного поля. Не привязываем этот урок к API обычного элемента и не выдумываем Новый коллекции ограничений.

  5. Две собственные таблицы видят одни доступные поля, но коллекции ограничений принадлежат элементам интерфейса. Ни source-поля, ни уже выбранные колонки отчёта не удаляются.

  6. Код не запускается автоматически из справочника. Ожидаемое скрытие требует ручной UI-проверки своего нового окна; runtimeVerifiedScenarios=0.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.