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