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

Учебные задачи

На собственной таблице 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С» и не аффилирован с ней.