Тип: Булево. Определяет, будет ли доступно поле для отбора. Истина - поле недоступно.
Полное описание, параметры и ограничения
ОграничениеИспользованияПоляСхемыКомпоновкиДанных.Условие (DataCompositionSchemaFieldUseRestriction.Condition)
ОграничениеИспользованияПоляСхемыКомпоновкиДанных (DataCompositionSchemaFieldUseRestriction)
Условие (Condition)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Определяет, будет ли доступно поле для отбора.
Истина - поле недоступно.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Запретить цену в группировке и сортировке, оставив её видимой
Современный способ настройки — свойства описания поля. Это ограничение возможностей редактора списка, не запрет чтения цены.
Где и как запускать
Модуль собственной управляемой формы внешней обработки. Вставляйте готовые процедуры с директивами на уровне модуля; каждый урок — в отдельной копии формы.
Подготовка
В учебной базе 8.5.1.1343 создайте новую внешнюю обработку УчебныйСписок85, пустую управляемую основную форму. Режим совместимости — 8.3.19 или выше. Не переделывайте список рабочей конфигурации.
В реквизитах формы добавьте Список типа ДинамическийСписок. Создайте один элемент ТаблицаФормы с именем ТаблицаТоваров и путём к данным Список. Колонки вручную не добавляйте: их создаёт код. Это не ТаблицаЗначений и не коллекция строк для Добавить().
В событиях формы назначьте ПриСозданииНаСервере одноимённой процедуре из примера. Не используйте одновременно другой обработчик заполнения этого списка.
При открытии код задаёт произвольный запрос из четырёх константных строк. Основная таблица не указана; таблицы базы, файлы и внешние сервисы не используются. Запись данных отсутствует.
Каждый раз открывайте отдельную копию формы. Автоматическое сохранение настроек отключено: старый пользовательский отбор не должен вмешиваться в упражнение.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.ПроизвольныйЗапрос = Истина;
Список.ОсновнаяТаблица = "";
Список.ДинамическоеСчитываниеДанных = Ложь;
Список.АвтоЗаполнениеДоступныхПолей = Истина;
Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
КлючевыеПоля = Новый Массив;
КлючевыеПоля.Добавить("УчебныйНомер");
Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
Список.ТекстЗапроса = "ВЫБРАТЬ
| 1 КАК УчебныйНомер,
| ""Книга"" КАК Наименование,
| ""Канцелярия"" КАК Категория,
| 3 КАК Количество,
| 250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70";
Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
ОписаниеЦены = Список.Поля.Найти("Цена");
Если ОписаниеЦены = Неопределено Тогда
ВызватьИсключение "В описании списка не найдено поле Цена";
КонецЕсли;
ОписаниеЦены.Заголовок = "Цена, руб.";
ОписаниеЦены.ОграничениеИспользования.Группировка = Истина;
ОписаниеЦены.ОграничениеИспользования.Порядок = Истина;
ОписаниеЦены.ОграничениеИспользования.Условие = Ложь;
ОписаниеЦены.ОграничениеИспользования.Поле = Ложь;
ОписаниеЦены.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=2");
Сообщить(ОписаниеЦены.ПутьКДанным = "Цена");
Сообщить(ОписаниеЦены.ОграничениеИспользования.Группировка);
Сообщить(ОписаниеЦены.ОграничениеИспользования.Порядок);
Сообщить(Не ОписаниеЦены.ОграничениеИспользования.Условие);
Сообщить(Не ОписаниеЦены.ОграничениеИспользования.Поле);
Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена", ",") Цикл
Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
Колонка.Вид = ВидПоляФормы.ПолеВвода;
Колонка.ПутьКДанным = "Список." + ИмяПоля;
Колонка.Заголовок = ИмяПоля;
КонецЦикла;
КонецПроцедуры
Разбор по шагам
Найти возвращает описание поля по пути к данным. Не подменяем всю коллекцию Поля новым объектом: свойство только для чтения, элементы настраиваются.
Истина у Группировка/Порядок означает запрет использования в этих настройках. Ложь у Поле/Условие оставляет выбор поля и отбор доступными.
Редактор списка должен убрать цену из доступных группировок и сортировок, но показывать значение и разрешать отбор. Это разные функции.
Как проверить результат
Пять проверок дают Истина.
В настройках списка Цена не предлагается для новой группировки и сортировки, но доступна для отбора. В строке Книги остаётся 250,00.
Ожидаемый результат
Адресное ограничение редактора списка при сохранении показов цены.
На что обратить внимание
Ограничения СКД не являются RLS и не защищают секретные поля.
Для стандартных и ключевых полей при основной таблице есть дополнительные ограничения платформы; этот урок использует собственный запрос без основной таблицы.
Не используйте Роль и ВыражениеПредставления описания поля в этом списке: они не поддерживаются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Ограничения суммы: выбор, группировка, порядок и отбор без изменения данных
На собственной таблице 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С, записи, сети, печати, компоновщика макета или процессора. Настройки/отчёт не считаются подготовленными к исполнению.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.