Тип: ОграничениеИспользованияПоляСхемыКомпоновкиДанных. Содержит вид ограничения использования и указывает, каким образом нельзя использовать данное поле. Ограничение использования описывается так же, как и ограничение использования поля набора данных.
Полное описание, параметры и ограничения
ВычисляемоеПолеСхемыКомпоновкиДанных.ОграничениеИспользования (DataCompositionSchemaCalculatedField.UseRestriction)
ВычисляемоеПолеСхемыКомпоновкиДанных (DataCompositionSchemaCalculatedField)
ОграничениеИспользования (UseRestriction)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: ОграничениеИспользованияПоляСхемыКомпоновкиДанных.
Содержит вид ограничения использования и указывает, каким образом нельзя использовать данное поле. Ограничение использования описывается так же, как и ограничение использования поля набора данных.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Ограничения суммы: выбор, группировка, порядок и отбор без изменения данных
На собственной таблице A01/3/500 и B02/5/700 создаём реальное вычисляемое описание Сумма85. Меняем пять политик использования, проверяем все четыре булевых запрета вместе с неизменными данными/формулой/типами и восстанавливаем их. Обе самостоятельно построенные модели меняются независимо, в обоих направлениях.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеЗапретыРасчета85; в1С не запускался.
Подготовка
Только НОВАЯ отдельная пустая база УчебныеЗапретыРасчета85 на платформе8.5.1.1343, не копия рабочей. Нет бизнес-объектов, расширений, подписок и заданий. Здесь база не создаётся и код не запускается.
Вручную создайте общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да; клиентские флаги, Глобальный и Привилегированный=Нет. Полный основной код вставьте целиком в модуль, не внутрь ещё одной процедуры.
Своя внешняя обработка УчебныеЗапретыРасчета85 → управляемая Форма: команда Выполнить с действием Выполнить и кнопкой. Отдельный полный модуль формы ниже вставляется только в этот модуль формы. Перед будущим разрешённым опытом сохраните свою базу, выполните F7 вне опыта и откройте свежий сеанс без расширений.
Код создаёт две строки, Local-источник, объектный набор Продажи85 и соответствующий внешний ключ. Код85 — Строка, Количество85 — Число(1,0), Цена85 — Число(3,0), сумма — Число(6,2), всё числовое неотрицательное. Шесть разрядов ВСЕГО включают два дробных; предел суммы9999.99.
Сумма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 → управляемая Форма → Модуль
Полный отдельный модуль собственной формы с серверным вызовом; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Четыре запрета своего вычисляемого поля и независимость моделей проверены; отчёт не выполнялся");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
СвоиЗапретыСуммы сначала сверяет все строки/колонки/исходные поля, внешний ключ, единственное вычисление, его путь/заголовок, формулу Количество85 * Цена85 и полные числовые квалификаторы. Только затем получает объект ограничения и проверяет его тип.
Истина означает ЗАПРЕТ: Поле запрещает выбор поля, Группировка — использование в группировке, Порядок — в упорядочивании, Условие — в отборе. Ложь означает отсутствие именно этого запрета, не выдачу прав. Свойство отбора называется Условие, не Отбор.
СвояПолитикаСуммы создаёт отдельную структуру ожидания: Разрешено=0000; БезОтбора=0001; БезГруппировкиПорядка=0110; БезВыбора=1000; ВсеЗапрещено=1111. Порядок цифр только в пояснении: Поле,Группировка,Порядок,Условие. В коде это настоящие Булево, не строковые цифры.
Каждая установка задаёт ВСЕ четыре значения, чтобы запреты прежней политики не оставались случайно. Проверка сверяет тип Булево и значение каждого флага. Изменение размеров каталога или формулы для запрета не требуется.
Восемь сверок оригинала охватывают исходную политику, четыре варианта запретов, восстановление и две проверки неизменности при изменении копии. Семь сверок копии сохраняют исходное разрешение во время изменений оригинала, затем проверяют её отдельный запрет отбора и возвращение исходного состояния.
Копия полностью строится заново: другая таблица, схема, источник, набор, исходные поля, вычисление и объект ограничений. Это не присваивание Стенд другой переменной и не копирование общей ссылки на ограничение.
В истинном коде КА2 БюджетированиеСервер аналогичные четыре ограничения применяются к обычным полям и реквизитам регистратора. Это подтверждает смысл политики, но не вызов собственного computed getter и не исполнение1С. Точный контракт вычисляемого владельца подтверждён установленной справкой8.5.1.1343.
Как проверить результат
Ожидаемый будущий итог: у обеих моделей четыре флага=Ложь, обе собственные продажи и исходные типы неизменны; единственная сумма сохраняет полный путь/заголовок/прямую формулу и Число(6,2,Неотрицательный). Обычный арифметический эталон1500/3500 сохраняется даже при четырёх Истина.
Будущий отрицательный контроль только в отдельно разрешённом стенде: в политике БезОтбора оставить Условие=Ложь при прежнем ожидании. Полная сверка должна отказать при тех же размерах и данных. Другой контроль: ценаB02=701 вместо700 должна отказать до проверки запретов. Здесь эти контроли не выполнялись.
runtimeVerifiedScenarios=0. Подтверждены установленная документация и статическая целостность. Не доказаны вызовы платформы, генерация доступных полей/настроек, видимость в UI, запрет фактического выбора/порядка/отбора или результат отчёта. Арифметика BSL не является выполнением выражения СКД.
Ожидаемый результат
Полный собственный опыт пяти политик использования вычисляемой суммы с точной полярностью, сохранением исходных данных и двусторонней независимостью моделей.
На что обратить внимание
Не заменяйте readonly Сумма.ОграничениеИспользования новым объектом. Меняются только документированные четыре Булево возвращённого объекта; unknown ИсходныйОбъект не нужен.
Не трактуйте Истина как разрешение, а Ложь как обход прав/других ограничений. Это описание использования поля СКД, не RLS, роли, функциональные опции, запрет чтения строк или защита конфиденциальных данных.
Запрет выбора не удаляет вычисление и не обнуляет суммы. Формула, число разрядов, исходные цены и количество строк не меняются. Источники данных, настройки выбора и результаты отчёта этим кодом не перестраиваются.
ОграничениеИспользованияРеквизитов обычного поля — отдельное свойство для объектных типов. Его не привязывают к собственной числовой сумме ради проверки типа; нужны настоящие объектные реквизиты и отдельный подготовленный пример.
Нет запросов к рабочей базе, запуска1С, записи, сети, печати, компоновщика макета или процессора. Настройки/отчёт не считаются подготовленными к исполнению.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.