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

Свойства · Condition

Тип: Булево. Определяет, будет ли доступно поле для отбора. Истина - поле недоступно.

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

ОграничениеИспользованияПоляСхемыКомпоновкиДанных.Условие (DataCompositionSchemaFieldUseRestriction.Condition)

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

Условие (Condition)

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

Использование:
Чтение и запись.
Описание:
Тип: Булево.
Определяет, будет ли доступно поле для отбора.
Истина - поле недоступно.
Доступность:

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

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

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

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

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

Запретить цену в группировке и сортировке, оставив её видимой

Современный способ настройки — свойства описания поля. Это ограничение возможностей редактора списка, не запрет чтения цены.

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

Модуль собственной управляемой формы внешней обработки. Вставляйте готовые процедуры с директивами на уровне модуля; каждый урок — в отдельной копии формы.

Подготовка

  1. В учебной базе 8.5.1.1343 создайте новую внешнюю обработку УчебныйСписок85, пустую управляемую основную форму. Режим совместимости — 8.3.19 или выше. Не переделывайте список рабочей конфигурации.

  2. В реквизитах формы добавьте Список типа ДинамическийСписок. Создайте один элемент ТаблицаФормы с именем ТаблицаТоваров и путём к данным Список. Колонки вручную не добавляйте: их создаёт код. Это не ТаблицаЗначений и не коллекция строк для Добавить().

  3. В событиях формы назначьте ПриСозданииНаСервере одноимённой процедуре из примера. Не используйте одновременно другой обработчик заполнения этого списка.

  4. При открытии код задаёт произвольный запрос из четырёх константных строк. Основная таблица не указана; таблицы базы, файлы и внешние сервисы не используются. Запись данных отсутствует.

  5. Каждый раз открывайте отдельную копию формы. Автоматическое сохранение настроек отключено: старый пользовательский отбор не должен вмешиваться в упражнение.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Список.ПроизвольныйЗапрос = Истина;
    Список.ОсновнаяТаблица = "";
    Список.ДинамическоеСчитываниеДанных = Ложь;
    Список.АвтоЗаполнениеДоступныхПолей = Истина;
    Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
    Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
    КлючевыеПоля = Новый Массив;
    КлючевыеПоля.Добавить("УчебныйНомер");

    Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
    Список.ТекстЗапроса = "ВЫБРАТЬ
|    1 КАК УчебныйНомер,
|    ""Книга"" КАК Наименование,
|    ""Канцелярия"" КАК Категория,
|    3 КАК Количество,
|    250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70";
    Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
    ОписаниеЦены = Список.Поля.Найти("Цена");
    Если ОписаниеЦены = Неопределено Тогда
        ВызватьИсключение "В описании списка не найдено поле Цена";
    КонецЕсли;
    ОписаниеЦены.Заголовок = "Цена, руб.";
    ОписаниеЦены.ОграничениеИспользования.Группировка = Истина;
    ОписаниеЦены.ОграничениеИспользования.Порядок = Истина;
    ОписаниеЦены.ОграничениеИспользования.Условие = Ложь;
    ОписаниеЦены.ОграничениеИспользования.Поле = Ложь;
    ОписаниеЦены.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=2");
    Сообщить(ОписаниеЦены.ПутьКДанным = "Цена");
    Сообщить(ОписаниеЦены.ОграничениеИспользования.Группировка);
    Сообщить(ОписаниеЦены.ОграничениеИспользования.Порядок);
    Сообщить(Не ОписаниеЦены.ОграничениеИспользования.Условие);
    Сообщить(Не ОписаниеЦены.ОграничениеИспользования.Поле);

    Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Список." + ИмяПоля;
        Колонка.Заголовок = ИмяПоля;
    КонецЦикла;
КонецПроцедуры

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

  1. Найти возвращает описание поля по пути к данным. Не подменяем всю коллекцию Поля новым объектом: свойство только для чтения, элементы настраиваются.

  2. Истина у Группировка/Порядок означает запрет использования в этих настройках. Ложь у Поле/Условие оставляет выбор поля и отбор доступными.

  3. Редактор списка должен убрать цену из доступных группировок и сортировок, но показывать значение и разрешать отбор. Это разные функции.

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

  1. Пять проверок дают Истина.

  2. В настройках списка Цена не предлагается для новой группировки и сортировки, но доступна для отбора. В строке Книги остаётся 250,00.

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

Адресное ограничение редактора списка при сохранении показов цены.

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

  1. Ограничения СКД не являются RLS и не защищают секретные поля.

  2. Для стандартных и ключевых полей при основной таблице есть дополнительные ограничения платформы; этот урок использует собственный запрос без основной таблицы.

  3. Не используйте Роль и ВыражениеПредставления описания поля в этом списке: они не поддерживаются.

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

Ограничения суммы: выбор, группировка, порядок и отбор без изменения данных

На собственной таблице A01/3/500 и B02/5/700 создаём реальное вычисляемое описание Сумма85. Меняем пять политик использования, проверяем все четыре булевых запрета вместе с неизменными данными/формулой/типами и восстанавливаем их. Обе самостоятельно построенные модели меняются независимо, в обоих направлениях.

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

Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеЗапретыРасчета85; в1С не запускался.

Подготовка

  1. Только НОВАЯ отдельная пустая база УчебныеЗапретыРасчета85 на платформе8.5.1.1343, не копия рабочей. Нет бизнес-объектов, расширений, подписок и заданий. Здесь база не создаётся и код не запускается.

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

  3. Своя внешняя обработка УчебныеЗапретыРасчета85 → управляемая Форма: команда Выполнить с действием Выполнить и кнопкой. Отдельный полный модуль формы ниже вставляется только в этот модуль формы. Перед будущим разрешённым опытом сохраните свою базу, выполните F7 вне опыта и откройте свежий сеанс без расширений.

  4. Код создаёт две строки, Local-источник, объектный набор Продажи85 и соответствующий внешний ключ. Код85 — Строка, Количество85 — Число(1,0), Цена85 — Число(3,0), сумма — Число(6,2), всё числовое неотрицательное. Шесть разрядов ВСЕГО включают два дробных; предел суммы9999.99.

  5. Сумма85 получается через Добавить вычисляемого каталога, без неизвестного конструктора. ОграничениеИспользования этого поля readonly, но возвращает настоящий объект с четырьмя writable Булево. Начальные четыре значения задаются явно, значения по умолчанию не предполагаются.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Привилегированный режим не нужен";
    КонецЕсли;
    Стенд = СоздатьСвойСтендЗапретов();
    Копия = СоздатьСвойСтендЗапретов();
    ПроверитьСвоиЗапретыСуммы(Стенд, "Разрешено");
    ПроверитьСвоиЗапретыСуммы(Копия, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Стенд, "БезОтбора");
    ПроверитьСвоиЗапретыСуммы(Стенд, "БезОтбора");
    ПроверитьСвоиЗапретыСуммы(Копия, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Стенд, "БезГруппировкиПорядка");
    ПроверитьСвоиЗапретыСуммы(Стенд, "БезГруппировкиПорядка");
    ПроверитьСвоиЗапретыСуммы(Копия, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Стенд, "БезВыбора");
    ПроверитьСвоиЗапретыСуммы(Стенд, "БезВыбора");
    ПроверитьСвоиЗапретыСуммы(Копия, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Стенд, "ВсеЗапрещено");
    ПроверитьСвоиЗапретыСуммы(Стенд, "ВсеЗапрещено");
    ПроверитьСвоиЗапретыСуммы(Копия, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Стенд, "Разрешено");
    ПроверитьСвоиЗапретыСуммы(Стенд, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Копия, "БезОтбора");
    ПроверитьСвоиЗапретыСуммы(Копия, "БезОтбора");
    ПроверитьСвоиЗапретыСуммы(Стенд, "Разрешено");
    УстановитьСвоиЗапретыСуммы(Копия, "Разрешено");
    ПроверитьСвоиЗапретыСуммы(Копия, "Разрешено");
    ПроверитьСвоиЗапретыСуммы(Стенд, "Разрешено");
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция СвояРазрядностьПродаж(Имя)
    Если Имя = "Код85" Тогда
        Возврат 0;
    ИначеЕсли Имя = "Количество85" Тогда
        Возврат 1;
    ИначеЕсли Имя = "Цена85" Тогда
        Возврат 3;
    ИначеЕсли Имя = "Сумма85" Тогда
        Возврат 6;
    КонецЕсли;
    ВызватьИсключение "В своей модели продаж только четыре заранее определённых поля";
КонецФункции

Функция СвойТипПродаж(Имя)
    Разрядность = СвояРазрядностьПродаж(Имя);
    Если Разрядность = 0 Тогда
        Возврат Новый ОписаниеТипов("Строка");
    КонецЕсли;
    ДробнаяЧасть = 0;
    Если Разрядность = 6 Тогда
        ДробнаяЧасть = 2;
    КонецЕсли;
    Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Разрядность, ДробнаяЧасть, ДопустимыйЗнак.Неотрицательный));
КонецФункции

Процедура ПроверитьСвойТипПродаж(Описание, Имя)
    Если ТипЗнч(Описание) <> Тип("ОписаниеТипов") Тогда
        ВызватьИсключение "Нужно собственное описание типа продаж";
    КонецЕсли;
    Разрядность = СвояРазрядностьПродаж(Имя);
    ТипПоля = Тип("Число");
    Если Разрядность = 0 Тогда
        ТипПоля = Тип("Строка");
    КонецЕсли;
    ПолныеТипы = Описание.Типы();
    Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> ТипПоля Тогда
        ВызватьИсключение "Не совпал полный собственный тип поля продаж";
    КонецЕсли;
    Если Разрядность = 0 Тогда
        Возврат;
    КонецЕсли;
    ДробнаяЧасть = 0;
    Если Разрядность = 6 Тогда
        ДробнаяЧасть = 2;
    КонецЕсли;
    Квалификаторы = Описание.КвалификаторыЧисла;
    Если ТипЗнч(Квалификаторы) <> Тип("КвалификаторыЧисла") Или Квалификаторы.Разрядность <> Разрядность
        Или Квалификаторы.РазрядностьДробнойЧасти <> ДробнаяЧасть
        Или Квалификаторы.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный Тогда
        ВызватьИсключение "Не совпали разряды, дробная часть и знак собственного поля продаж";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьСвоюОсновуПродаж()
    Данные = Новый ТаблицаЗначений;
    Имена = СтрРазделить("Код85,Количество85,Цена85", ",");
    Для Каждого Имя Из Имена Цикл
        Данные.Колонки.Добавить(Имя, СвойТипПродаж(Имя));
    КонецЦикла;
    СтрокаПродажи = Данные.Добавить();
    СтрокаПродажи.Код85 = "A01";
    СтрокаПродажи.Количество85 = 3;
    СтрокаПродажи.Цена85 = 500;
    СтрокаПродажи = Данные.Добавить();
    СтрокаПродажи.Код85 = "B02";
    СтрокаПродажи.Количество85 = 5;
    СтрокаПродажи.Цена85 = 700;
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "СвоиПродажи85";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    Если ТипЗнч(Набор) <> Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный объектный набор продаж";
    КонецЕсли;
    Набор.Имя = "Продажи85";
    Набор.ИмяОбъекта = "Продажи85";
    Набор.ИсточникДанных = "СвоиПродажи85";
    Для Каждого Имя Из Имена Цикл
        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Нужно собственное простое поле исходных продаж";
        КонецЕсли;
        Поле.Поле = Имя;
        Поле.ПутьКДанным = Имя;
        Поле.ТипЗначения = СвойТипПродаж(Имя);
    КонецЦикла;
    ВнешниеДанные = Новый Структура;
    ВнешниеДанные.Вставить("Продажи85", Данные);
    Стенд = Новый Структура;
    Стенд.Вставить("Схема", Схема);
    Стенд.Вставить("ВнешниеДанные", ВнешниеДанные);
    Возврат Стенд;
КонецФункции

Процедура ПроверитьСвоюОсновуПродаж(Стенд)
    Если ТипЗнч(Стенд) <> Тип("Структура") Или Стенд.Количество() <> 2 Тогда
        ВызватьИсключение "Нужна собственная структура схемы и внешних продаж";
    КонецЕсли;
    Схема = Неопределено;
    ВнешниеДанные = Неопределено;
    Если Не Стенд.Свойство("Схема", Схема) Или Не Стенд.Свойство("ВнешниеДанные", ВнешниеДанные) Тогда
        ВызватьИсключение "Не совпали оба собственных ключа стенда продаж";
    КонецЕсли;
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.ИсточникиДанных.Количество() <> 1
        Или Схема.НаборыДанных.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный собственный источник и объектный набор";
    КонецЕсли;
    Если ТипЗнч(ВнешниеДанные) <> Тип("Структура") Или ВнешниеДанные.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный собственный внешний объект продаж";
    КонецЕсли;
    Данные = Неопределено;
    Если Не ВнешниеДанные.Свойство("Продажи85", Данные) Тогда
        ВызватьИсключение "Внешний ключ обязан содержать настоящую собственную таблицу";
    КонецЕсли;
    Если ТипЗнч(Данные) <> Тип("ТаблицаЗначений") Или Данные.Количество() <> 2 Или Данные.Колонки.Количество() <> 3 Тогда
        ВызватьИсключение "Нужны две собственные продажи и три колонки";
    КонецЕсли;
    Источник = Схема.ИсточникиДанных.Получить(0);
    Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
        Или Источник.Имя <> "СвоиПродажи85" Или Источник.ТипИсточникаДанных <> "Local" Тогда
        ВызватьИсключение "Не совпал собственный логический источник";
    КонецЕсли;
    Набор = Схема.НаборыДанных.Получить(0);
    Если ТипЗнч(Набор) <> Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Или Набор.Имя <> "Продажи85"
        Или Набор.ИмяОбъекта <> "Продажи85" Или Набор.ИсточникДанных <> "СвоиПродажи85"
        Или Схема.НаборыДанных.Найти("Продажи85") <> Набор Или Набор.Поля.Количество() <> 3 Тогда
        ВызватьИсключение "Не совпал полный собственный набор и его три исходных поля";
    КонецЕсли;
    Имена = СтрРазделить("Код85,Количество85,Цена85", ",");
    Для Индекс = 0 По 2 Цикл
        Колонка = Данные.Колонки.Получить(Индекс);
        Поле = Набор.Поля.Получить(Индекс);
        Если ТипЗнч(Колонка) <> Тип("КолонкаТаблицыЗначений") Или Колонка.Имя <> Имена[Индекс]
            Или ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
            Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имена[Индекс] Тогда
            ВызватьИсключение "Не совпали все имена, порядок и пути исходных колонок и полей";
        КонецЕсли;
        ПроверитьСвойТипПродаж(Колонка.ТипЗначения, Имена[Индекс]);
        ПроверитьСвойТипПродаж(Поле.ТипЗначения, Имена[Индекс]);
    КонецЦикла;
    Коды = СтрРазделить("A01,B02", ",");
    Количества = Новый Массив;
    Количества.Добавить(3);
    Количества.Добавить(5);
    Цены = Новый Массив;
    Цены.Добавить(500);
    Цены.Добавить(700);
    Суммы = Новый Массив;
    Суммы.Добавить(1500);
    Суммы.Добавить(3500);
    Для Индекс = 0 По 1 Цикл
        СтрокаПродажи = Данные.Получить(Индекс);
        Если ТипЗнч(СтрокаПродажи) <> Тип("СтрокаТаблицыЗначений")
            Или ТипЗнч(СтрокаПродажи.Код85) <> Тип("Строка") Или СтрокаПродажи.Код85 <> Коды[Индекс]
            Или ТипЗнч(СтрокаПродажи.Количество85) <> Тип("Число") Или СтрокаПродажи.Количество85 <> Количества[Индекс]
            Или ТипЗнч(СтрокаПродажи.Цена85) <> Тип("Число") Или СтрокаПродажи.Цена85 <> Цены[Индекс]
            Или СтрокаПродажи.Количество85 * СтрокаПродажи.Цена85 <> Суммы[Индекс] Тогда
            ВызватьИсключение "Не совпали все собственные ячейки и отдельный арифметический эталон BSL";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция СвоиЗапретыСуммы(Стенд)
    ПроверитьСвоюОсновуПродаж(Стенд);
    Каталог = Стенд.Схема.ВычисляемыеПоля;
    Если ТипЗнч(Каталог) <> Тип("ВычисляемыеПоляСхемыКомпоновкиДанных") Или Каталог.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный собственный расчёт суммы";
    КонецЕсли;
    Сумма = Каталог[0];
    Если ТипЗнч(Сумма) <> Тип("ВычисляемоеПолеСхемыКомпоновкиДанных")
        Или Сумма.ПутьКДанным <> "Сумма85" Или Сумма.Заголовок <> "Сумма продажи"
        Или Сумма.Выражение <> "Количество85 * Цена85" Тогда
        ВызватьИсключение "Не совпало полное собственное вычисление суммы";
    КонецЕсли;
    ПроверитьСвойТипПродаж(Сумма.ТипЗначения, "Сумма85");
    Запреты = Сумма.ОграничениеИспользования;
    Если ТипЗнч(Запреты) <> Тип("ОграничениеИспользованияПоляСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Вычисляемое поле должно вернуть собственный объект ограничений";
    КонецЕсли;
    Возврат Запреты;
КонецФункции

Функция СвояПолитикаСуммы(Имя)
    Политика = Новый Структура;
    Политика.Вставить("Поле", Ложь);
    Политика.Вставить("Группировка", Ложь);
    Политика.Вставить("Порядок", Ложь);
    Политика.Вставить("Условие", Ложь);
    Если Имя = "Разрешено" Тогда
        Возврат Политика;
    ИначеЕсли Имя = "БезОтбора" Тогда
        Политика.Условие = Истина;
    ИначеЕсли Имя = "БезГруппировкиПорядка" Тогда
        Политика.Группировка = Истина;
        Политика.Порядок = Истина;
    ИначеЕсли Имя = "БезВыбора" Тогда
        Политика.Поле = Истина;
    ИначеЕсли Имя = "ВсеЗапрещено" Тогда
        Политика.Поле = Истина;
        Политика.Группировка = Истина;
        Политика.Порядок = Истина;
        Политика.Условие = Истина;
    Иначе
        ВызватьИсключение "В опыте только пять явно заданных собственных политик";
    КонецЕсли;
    Возврат Политика;
КонецФункции

Процедура УстановитьСвоиЗапретыСуммы(Стенд, ИмяПолитики)
    Политика = СвояПолитикаСуммы(ИмяПолитики);
    Запреты = СвоиЗапретыСуммы(Стенд);
    Запреты.Поле = Политика.Поле;
    Запреты.Группировка = Политика.Группировка;
    Запреты.Порядок = Политика.Порядок;
    Запреты.Условие = Политика.Условие;
КонецПроцедуры

Процедура ПроверитьСвоиЗапретыСуммы(Стенд, ИмяПолитики)
    Политика = СвояПолитикаСуммы(ИмяПолитики);
    Запреты = СвоиЗапретыСуммы(Стенд);
    Если ТипЗнч(Запреты.Поле) <> Тип("Булево") Или Запреты.Поле <> Политика.Поле
        Или ТипЗнч(Запреты.Группировка) <> Тип("Булево") Или Запреты.Группировка <> Политика.Группировка
        Или ТипЗнч(Запреты.Порядок) <> Тип("Булево") Или Запреты.Порядок <> Политика.Порядок
        Или ТипЗнч(Запреты.Условие) <> Тип("Булево") Или Запреты.Условие <> Политика.Условие Тогда
        ВызватьИсключение "Не совпали все четыре булевых запрета собственного вычисляемого поля";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьСвойСтендЗапретов()
    Стенд = СоздатьСвоюОсновуПродаж();
    Сумма = Стенд.Схема.ВычисляемыеПоля.Добавить();
    Если ТипЗнч(Сумма) <> Тип("ВычисляемоеПолеСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Добавить обязан вернуть собственное вычисляемое описание";
    КонецЕсли;
    Сумма.ПутьКДанным = "Сумма85";
    Сумма.Выражение = "Количество85 * Цена85";
    Сумма.Заголовок = "Сумма продажи";
    Сумма.ТипЗначения = СвойТипПродаж("Сумма85");
    УстановитьСвоиЗапретыСуммы(Стенд, "Разрешено");
    Возврат Стенд;
КонецФункции
УчебныеЗапретыРасчета85.Форма

Своя внешняя обработка УчебныеЗапретыРасчета85 → управляемая Форма → Модуль

Полный отдельный модуль собственной формы с серверным вызовом; здесь не запускался.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Четыре запрета своего вычисляемого поля и независимость моделей проверены; отчёт не выполнялся");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеЗадачи.ВыполнитьПример();
КонецПроцедуры

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

  1. СвоиЗапретыСуммы сначала сверяет все строки/колонки/исходные поля, внешний ключ, единственное вычисление, его путь/заголовок, формулу Количество85 * Цена85 и полные числовые квалификаторы. Только затем получает объект ограничения и проверяет его тип.

  2. Истина означает ЗАПРЕТ: Поле запрещает выбор поля, Группировка — использование в группировке, Порядок — в упорядочивании, Условие — в отборе. Ложь означает отсутствие именно этого запрета, не выдачу прав. Свойство отбора называется Условие, не Отбор.

  3. СвояПолитикаСуммы создаёт отдельную структуру ожидания: Разрешено=0000; БезОтбора=0001; БезГруппировкиПорядка=0110; БезВыбора=1000; ВсеЗапрещено=1111. Порядок цифр только в пояснении: Поле,Группировка,Порядок,Условие. В коде это настоящие Булево, не строковые цифры.

  4. Каждая установка задаёт ВСЕ четыре значения, чтобы запреты прежней политики не оставались случайно. Проверка сверяет тип Булево и значение каждого флага. Изменение размеров каталога или формулы для запрета не требуется.

  5. Восемь сверок оригинала охватывают исходную политику, четыре варианта запретов, восстановление и две проверки неизменности при изменении копии. Семь сверок копии сохраняют исходное разрешение во время изменений оригинала, затем проверяют её отдельный запрет отбора и возвращение исходного состояния.

  6. Копия полностью строится заново: другая таблица, схема, источник, набор, исходные поля, вычисление и объект ограничений. Это не присваивание Стенд другой переменной и не копирование общей ссылки на ограничение.

  7. В истинном коде КА2 БюджетированиеСервер аналогичные четыре ограничения применяются к обычным полям и реквизитам регистратора. Это подтверждает смысл политики, но не вызов собственного computed getter и не исполнение1С. Точный контракт вычисляемого владельца подтверждён установленной справкой8.5.1.1343.

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

  1. Ожидаемый будущий итог: у обеих моделей четыре флага=Ложь, обе собственные продажи и исходные типы неизменны; единственная сумма сохраняет полный путь/заголовок/прямую формулу и Число(6,2,Неотрицательный). Обычный арифметический эталон1500/3500 сохраняется даже при четырёх Истина.

  2. Будущий отрицательный контроль только в отдельно разрешённом стенде: в политике БезОтбора оставить Условие=Ложь при прежнем ожидании. Полная сверка должна отказать при тех же размерах и данных. Другой контроль: ценаB02=701 вместо700 должна отказать до проверки запретов. Здесь эти контроли не выполнялись.

  3. runtimeVerifiedScenarios=0. Подтверждены установленная документация и статическая целостность. Не доказаны вызовы платформы, генерация доступных полей/настроек, видимость в UI, запрет фактического выбора/порядка/отбора или результат отчёта. Арифметика BSL не является выполнением выражения СКД.

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

Полный собственный опыт пяти политик использования вычисляемой суммы с точной полярностью, сохранением исходных данных и двусторонней независимостью моделей.

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

  1. Не заменяйте readonly Сумма.ОграничениеИспользования новым объектом. Меняются только документированные четыре Булево возвращённого объекта; unknown ИсходныйОбъект не нужен.

  2. Не трактуйте Истина как разрешение, а Ложь как обход прав/других ограничений. Это описание использования поля СКД, не RLS, роли, функциональные опции, запрет чтения строк или защита конфиденциальных данных.

  3. Запрет выбора не удаляет вычисление и не обнуляет суммы. Формула, число разрядов, исходные цены и количество строк не меняются. Источники данных, настройки выбора и результаты отчёта этим кодом не перестраиваются.

  4. ОграничениеИспользованияРеквизитов обычного поля — отдельное свойство для объектных типов. Его не привязывают к собственной числовой сумме ради проверки типа; нужны настоящие объектные реквизиты и отдельный подготовленный пример.

  5. Нет запросов к рабочей базе, запуска1С, записи, сети, печати, компоновщика макета или процессора. Настройки/отчёт не считаются подготовленными к исполнению.

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

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

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

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

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