Тип: Булево. Содержит связанное с элементом списка значение пометки. Ложь - пометка не установлена, Истина - пометка установлена.
Полное описание, параметры и ограничения
ЭлементСпискаЗначений.Пометка (ValueListItem.Check)
ЭлементСпискаЗначений (ValueListItem)
Пометка (Check)
Доступен, начиная с версии 8.0.
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Содержит связанное с элементом списка значение пометки.
Ложь - пометка не установлена, Истина - пометка установлена.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Выделить строку списка и подсчитать отдельные пометки
Книга помечена, Ручка не помечена. Текущая строка Ручка не считается автоматически помеченной; кнопка меняет только режим просмотра.
Где и как запускать
Полный модуль собственной обычной формы внешней обработки. Только толстый клиент с обычными формами; действие кнопки — экспортная процедура с первым параметром Элемент, инициировавшим Нажатие.
Подготовка
Создайте отдельную внешнюю обработку с обычной формой. Нужен толстый клиент в режиме обычных форм; рабочая база не используется.
Добавьте обычную кнопку УчебнаяКоманда. ПриОткрытии формы свяжите с одноимённой процедурой из полного модуля; Нажатие кнопки вручную не назначайте.
Кнопка получает собственное Действие в коде. Каждый урок заменяет полный модуль отдельной копии формы; никаких записей документов или настроек нет.
Добавьте реквизит УчебныеТовары (СписокЗначений) и ПолеСписка УчебныйСписок с Данные = УчебныеТовары. Это не ПолеВыбора и не ТабличноеПоле.
Процедура ПриОткрытии()
УчебныеТовары = Новый СписокЗначений;
УчебныеТовары.Добавить("book", "Книга", Истина);
Ручка = УчебныеТовары.Добавить("pen", "Ручка", Ложь);
Поле = ЭтаФорма.ЭлементыФормы.УчебныйСписок;
Поле.ТекущаяСтрока = Ручка;
Поле.ОтображатьПометку = Истина;
Поле.ОтображатьКартинку = Ложь;
Поле.Доступность = Истина;
Поле.ТолькоПросмотр = Ложь;
Поле.Подсказка = "Выделение строки не равнозначно пометке";
Поле.Рамка = Новый Рамка(ТипРамки.Одинарная);
Поле.ЦветРамки = Новый Цвет(160, 176, 192);
Поле.ЦветТекстаПоля = Новый Цвет(24, 40, 60);
Поле.ЦветФонаПоля = Новый Цвет(244, 248, 252);
Кнопка = ЭтаФорма.ЭлементыФормы.УчебнаяКоманда;
Кнопка.Заголовок = "Выполнить учебный шаг";
Кнопка.УстановитьДействие("Нажатие", Новый Действие("ВыполнитьУчебныйШаг"));
КонецПроцедуры
Процедура ВыполнитьУчебныйШаг(Элемент) Экспорт
Поле = ЭтаФорма.ЭлементыФормы.УчебныйСписок;
Выделенная = Поле.ТекущаяСтрока;
Если Выделенная = Неопределено Тогда
Сообщить("Выделите собственную строку");
Иначе
Сообщить(СтрШаблон("Текущая: %1; значение: %2", Выделенная.Представление, Выделенная.Значение));
КонецЕсли;
Помечено = 0;
Для Каждого Товар Из УчебныеТовары Цикл
Если Товар.Пометка Тогда
Помечено = Помечено + 1;
КонецЕсли;
КонецЦикла;
Сообщить(Помечено);
Поле.ТолькоПросмотр = Не Поле.ТолькоПросмотр;
Сообщить(Поле.ТолькоПросмотр);
Сообщить(Поле.Доступность);
КонецПроцедурыРазбор по шагам
Третьим аргументом Добавить устанавливается Пометка. Ручка возвращается как реальный ЭлементСпискаЗначений и назначается ТекущаяСтрока.
ТекущаяСтрока может отсутствовать, поэтому перед чтением её данных проверяется Неопределено.
Цикл считает Пометка независимо от выделенной строки. Первоначально помечена одна Книга.
ТолькоПросмотр ограничивает редактирование, но не выключает элемент целиком. Доступность остаётся Истина.
Повторное нажатие возвращает возможность редактировать свой список; ни один товар конфигурации не используется.
Как проверить результат
Без ручных изменений первое нажатие: Текущая: Ручка; значение: pen, 1, Истина, Истина.
Второе: та же текущая строка, 1, Ложь, Истина. Измените пометки в режиме редактирования и проверьте фактический счётчик.
Ожидаемый результат
Выделение, пометка и режим просмотра списка показаны как три отдельных понятия.
На что обратить внимание
ПолеСписка связано со СписокЗначений; сюда нельзя подставить строку ТаблицаЗначений.
Редактирование списка не является записью номенклатуры.
Не считайте текущую строку автоматически помеченной.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Сумма продажи: доступные значения, подписи выбора и выражение представления
На собственных продажах A01/3/500 и B02/5/700 строим вычисляемое описание суммы и реальные списки1500/3500. Заменяем список на сумму B02, снимаем и восстанавливаем его; отдельно меняем представление на Код85. Независимая модель сохраняет исходный список и формулу.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеЗначенияРасчета85; в1С не запускался.
Подготовка
Только НОВАЯ отдельная пустая база УчебныеЗначенияРасчета85 на платформе8.5.1.1343, не копия рабочей базы. Нет бизнес-объектов, расширений, подписок и фоновых заданий. Здесь база не создаётся и код не запускается.
Создайте вручную общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да; клиентские флаги, Глобальный и Привилегированный=Нет. Вставьте полный основной код целиком в модуль, не внутрь ещё одной процедуры.
Своя внешняя обработка УчебныеЗначенияРасчета85 → управляемая Форма: команда Выполнить, действие Выполнить, кнопка. Отдельный полный модуль формы ниже вставьте только в модуль этой формы. До будущего разрешённого опыта сохраните собственную базу и выполните F7 вне опыта; откройте новый сеанс без расширений.
Все данные готовит код: две строки таблицы, Local-источник, объектный набор Продажи85 и одно поле Сумма85. Ключ внешней структуры и ИмяОбъекта совпадают. Код85 — Строка; Количество85 — Число(1,0), Цена85 — Число(3,0), сумма — Число(6,2), всё числовое неотрицательное. Шесть разрядов ВСЕГО включают два дробных; предел9999.99.
Конструктор создаёт только СписокЗначений; элементы возвращает Добавить. Числовая сумма, её строковая подпись и Булево-пометка задаются явно. Картинка не используется: необязательный аргумент пропущен, его документированное значение — пустая картинка, не Неопределено.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим не нужен";
КонецЕсли;
Стенд = СоздатьСвойРасчетСуммы();
Поле = СвоеПолеСуммы(Стенд);
ПроверитьСвойВыборСуммы(Стенд, "Нет", "");
Поле.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Стенд, "Все"));
ПроверитьСвойВыборСуммы(Стенд, "Все", "");
Копия = СоздатьСвойРасчетСуммы();
ПолеКопии = СвоеПолеСуммы(Копия);
ПолеКопии.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Копия, "Все"));
ПроверитьСвойВыборСуммы(Копия, "Все", "");
Поле.ВыражениеПредставления = "Код85";
ПроверитьСвойВыборСуммы(Стенд, "Все", "Код85");
Поле.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Стенд, "ТолькоB02"));
ПроверитьСвойВыборСуммы(Стенд, "ТолькоB02", "Код85");
ПроверитьСвойВыборСуммы(Копия, "Все", "");
Поле.УстановитьДоступныеЗначения();
ПроверитьСвойВыборСуммы(Стенд, "Нет", "Код85");
ПроверитьСвойВыборСуммы(Копия, "Все", "");
Поле.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Стенд, "Все"));
ПроверитьСвойВыборСуммы(Стенд, "Все", "Код85");
Поле.ВыражениеПредставления = "";
ПроверитьСвойВыборСуммы(Стенд, "Все", "");
Поле.УстановитьДоступныеЗначения();
ПроверитьСвойВыборСуммы(Стенд, "Нет", "");
ПроверитьСвойВыборСуммы(Копия, "Все", "");
Поле.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Стенд, "Все"));
ПроверитьСвойВыборСуммы(Стенд, "Все", "");
ПроверитьСвойВыборСуммы(Копия, "Все", "");
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 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");
Поле.ВыражениеПредставления = "";
Поле.УстановитьДоступныеЗначения();
Возврат Стенд;
КонецФункции
Функция СоздатьСвойСписокСумм(Стенд, Режим)
ПроверитьСвоюОсновуПродаж(Стенд);
Если Режим <> "Все" И Режим <> "ТолькоB02" Тогда
ВызватьИсключение "В своём списке два режима: все продажи или только B02";
КонецЕсли;
Список = Новый СписокЗначений;
Данные = Стенд.ВнешниеДанные.Продажи85;
Для Индекс = 0 По Данные.Количество() - 1 Цикл
СтрокаПродажи = Данные.Получить(Индекс);
Если Режим = "ТолькоB02" И СтрокаПродажи.Код85 <> "B02" Тогда
Продолжить;
КонецЕсли;
Сумма = СтрокаПродажи.Количество85 * СтрокаПродажи.Цена85;
Список.Добавить(Сумма, СтрокаПродажи.Код85 + " — сумма продажи", Ложь);
КонецЦикла;
Возврат Список;
КонецФункции
Процедура ПроверитьСвойСписокСумм(Список, Эталон)
Если ТипЗнч(Список) <> Тип("СписокЗначений") Или ТипЗнч(Эталон) <> Тип("СписокЗначений") Тогда
ВызватьИсключение "Нужны настоящие собственные списки значений";
КонецЕсли;
Если Список.Количество() <> Эталон.Количество() Тогда
ВызватьИсключение "Не совпало полное количество доступных сумм";
КонецЕсли;
Для Индекс = 0 По Эталон.Количество() - 1 Цикл
Элемент = Список.Получить(Индекс);
Ожидаемый = Эталон.Получить(Индекс);
Если ТипЗнч(Элемент) <> Тип("ЭлементСпискаЗначений") Или ТипЗнч(Ожидаемый) <> Тип("ЭлементСпискаЗначений") Тогда
ВызватьИсключение "Нужно читать элементы списка, не непосредственно их значения";
КонецЕсли;
Если ТипЗнч(Элемент.Значение) <> Тип("Число") Или Элемент.Значение <> Ожидаемый.Значение
Или ТипЗнч(Элемент.Представление) <> Тип("Строка") Или Элемент.Представление <> Ожидаемый.Представление
Или ТипЗнч(Элемент.Пометка) <> Тип("Булево") Или Элемент.Пометка <> Ожидаемый.Пометка Тогда
ВызватьИсключение "Не совпали все суммы, строковые подписи, пометки и порядок списка";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьСвойВыборСуммы(Стенд, Режим, Представление)
Если Режим <> "Нет" И Режим <> "Все" И Режим <> "ТолькоB02" Тогда
ВызватьИсключение "Неизвестное собственное состояние доступных сумм";
КонецЕсли;
Если Представление <> "" И Представление <> "Код85" Тогда
ВызватьИсключение "В опыте только пустое представление или настоящее исходное поле Код85";
КонецЕсли;
Поле = СвоеПолеСуммы(Стенд);
Если ТипЗнч(Поле.ВыражениеПредставления) <> Тип("Строка") Или Поле.ВыражениеПредставления <> Представление Тогда
ВызватьИсключение "Не совпало собственное выражение представления суммы";
КонецЕсли;
Доступные = Поле.ПолучитьДоступныеЗначения();
Если Режим = "Нет" Тогда
Если Доступные <> Неопределено Тогда
ВызватьИсключение "После снятия списка без аргумента ожидается Неопределено";
КонецЕсли;
Иначе
Эталон = СоздатьСвойСписокСумм(Стенд, Режим);
ПроверитьСвойСписокСумм(Доступные, Эталон);
КонецЕсли;
КонецПроцедурыУчебныеЗначенияРасчета85.Форма
Своя внешняя обработка УчебныеЗначенияРасчета85 → управляемая Форма → Модуль
Полный отдельный модуль своей формы с серверным вызовом; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственные суммы, списки значений, представление и независимое восстановление проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
СвоеПолеСуммы проверяет обе строки и все типы исходной таблицы/набора, полный путь, заголовок, формулу и числовые квалификаторы единственного расчёта. Получение через Каталог[0] не требует спорного возвращаемого типа Получить вычисляемого каталога.
СоздатьСвойСписокСумм берёт настоящие собственные строки, считает Количество85 * Цена85 обычной арифметикой BSL и добавляет1500/3500 с подписями «A01 — сумма продажи», «B02 — сумма продажи» и пометками Ложь. ТолькоB02 создаёт новый одноэлементный список3500, не фильтрует таблицу.
УстановитьДоступныеЗначения(Список) задаёт доступные значения поля; ПолучитьДоступныеЗначения() возвращает СписокЗначений или Неопределено. Проверка читает количество и каждый ЭлементСпискаЗначений: тип/число, тип/подпись, тип/пометка и порядок. Одинакового количества недостаточно.
Снятие выполняется документированным вызовом УстановитьДоступныеЗначения() без аргумента. После него ожидается Неопределено. Пустой список и явно переданное Неопределено здесь не подставляются: их эквивалентность снятию не заявляется.
Выражение остаётся Количество85 * Цена85, Заголовок — Сумма продажи, ТипЗначения — числовой. ВыражениеПредставления меняется с пустой строки на Код85, реальное исходное поле, затем возвращается. По справке непустое выражение задаёт выводимое представление, пустое использует Выражение. Строковые подписи списка выбора не являются этим выражением.
Девять состояний оригинала: снятый список/пустое представление; все суммы/пустое; все/Код85; толькоB02/Код85; снято/Код85; все/Код85; все/пустое; снято/пустое; восстановлено все/пустое. На каждом состоянии проверяются исходные данные и расчёт, не только список.
Пять сверок копии сохраняют полный список1500/3500 и пустое представление при замене, снятии и восстановлении оригинала. Копия полностью строится заново: другая таблица, схема, источник, набор, поле и заново созданный список; ссылочная идентичность списка getter/setter не предполагается.
Настоящий код КА2 КомпоновкаДанныхСервер.СкопироватьПоляНабораДанных читает ПолучитьДоступныеЗначения, проверяет Неопределено и передаёт список в УстановитьДоступныеЗначения. Там обычное поле набора, не вычисляемое: перенос доступных значений подтверждает паттерн, а точный контракт вычисляемого поля подтверждается только установленной справкой8.5.1.1343. Рабочая процедура не вызывается.
Как проверить результат
Ожидаемый будущий итог: две исходные продажи неизменны; единственное описание Сумма85 сохраняет формулу и Число(6,2,Неотрицательный), представление снова пустое; оригинал и независимая копия имеют1500/A01 и3500/B02, пометки Ложь. Этап снятия должен вернуть Неопределено, а не пустой элемент или список.
Будущий отрицательный контроль только в отдельно разрешённом стенде: заменить значениеB02 в списке3500 на3501, не меняя ожидание. Проверка должна отказать, даже когда количество элементов прежнее. Другие контроли: неправильная подпись или Истина вместо Ложь должны отказать; цена701 вместо700 должна отказать до создания списка. Здесь ничего из этого не запускалось.
runtimeVerifiedScenarios=0. Подтверждён текст контрактов и статическая целостность примера, не выполненный вызов платформы, показ списка в форме или отрисованный результат отчёта. Арифметика BSL не доказывает исполнение строк Выражение/ВыражениеПредставления движком СКД.
Ожидаемый результат
Полный собственный учебный опыт редактора вычисляемого поля: значения и представление разделены, проверены по всему содержимому и восстановлены без общей копии.
На что обратить внимание
Доступные значения не являются правами доступа, проверкой рабочего документа или автоматически установленным отбором. ТолькоB02 не удаляет A01 из исходных данных; количество строк всегда2. Этот урок не обещает видимость/выбор/фильтрацию конкретного интерфейса.
Не изменяйте список, возвращённый ПолучитьДоступныеЗначения, в расчёте на общую ссылку. Документирован контракт значения, не идентичность, глубокое копирование или владение; для каждой установки код строит новый список и сравнивает содержимое.
Не путайте подпись ЭлементСпискаЗначений.Представление с ВыражениеПредставления самого вычисляемого поля и с его Заголовком. Замена представления на Код85 не меняет числовую формулу, тип суммы или исходные данные; реальный вывод и влияние настроек отчёта требуют отдельного разрешённого теста.
Не используйте здесь Сумма85 внутри собственного Выражение: вычисляемый расчёт должен ссылаться на поля набора. Поле Код85 действительно подготовлено в таблице и схеме, неизвестных реквизитов нет.
Не создаются настройки выбора, ресурсы, компоновщик макета или процессор; отчёт не считается готовым к исполнению. Никаких запросов, сети, записи данных или модификации конфигураций пользователя; весь опыт ограничен новой собственной моделью в памяти.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.