ВычисляемоеПолеСхемыКомпоновкиДанных.ПутьКДанным

Свойства · DataPath

Тип: Строка. Имя, под которым данное поле будет фигурировать в настройках.

Полное описание, параметры и ограничения

ВычисляемоеПолеСхемыКомпоновкиДанных.ПутьКДанным (DataCompositionSchemaCalculatedField.DataPath)

ВычисляемоеПолеСхемыКомпоновкиДанных (DataCompositionSchemaCalculatedField)

ПутьКДанным (DataPath)

Доступен, начиная с версии 8.1.

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Имя, под которым данное поле будет фигурировать в настройках.
Доступность:

Сервер, толстый клиент, внешнее соединение.

Примечание:
В системе компоновки данных не допускается использовать в качестве пути к данным имена, совпадающие с ключевыми словами:
ВЫБОР (CASE)
ЕСТЬ (IS)
ИНАЧЕ (ELSE)
КОГДА (WHEN)
КОНЕЦ (END)
НЕ (NOT)
ПОДОБНО (LIKE)
РАЗЛИЧНЫЕ (DISTINCT)
СПЕЦСИМВОЛ (ESCAPE)
ТОГДА (THEN)
Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Рассчитать сумму Количество × Цена в списке

Вычисляемое поле принадлежит схеме списка. Для расчёта суммы не добавляем реквизит справочника и не записываем данные.

Где и как запускать

Модуль собственной управляемой формы внешней обработки. Вставляйте готовые процедуры с директивами на уровне модуля; каждый урок — в отдельной копии формы.

Подготовка

  1. В учебной базе 8.5.1.1343 создайте новую внешнюю обработку УчебныйСписок85, пустую управляемую основную форму. Режим совместимости — 8.3.19 или выше. Не переделывайте список рабочей конфигурации.

  2. В реквизитах формы добавьте Список типа ДинамическийСписок. Создайте один элемент ТаблицаФормы с именем ТаблицаТоваров и путём к данным Список. Колонки вручную не добавляйте: их создаёт код. Это не ТаблицаЗначений и не коллекция строк для Добавить().

  3. В событиях формы назначьте ПриСозданииНаСервере одноимённой процедуре из примера. Не используйте одновременно другой обработчик заполнения этого списка.

  4. При открытии код задаёт произвольный запрос из четырёх константных строк. Основная таблица не указана; таблицы базы, файлы и внешние сервисы не используются. Запись данных отсутствует.

  5. Каждый раз открывайте отдельную копию формы. Автоматическое сохранение настроек отключено: старый пользовательский отбор не должен вмешиваться в упражнение.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Список.ПроизвольныйЗапрос = Истина;
    Список.ОсновнаяТаблица = "";
    Список.ДинамическоеСчитываниеДанных = Ложь;
    Список.АвтоЗаполнениеДоступныхПолей = Истина;
    Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
    Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
    КлючевыеПоля = Новый Массив;
    КлючевыеПоля.Добавить("УчебныйНомер");

    Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
    Список.ТекстЗапроса = "ВЫБРАТЬ
|    1 КАК УчебныйНомер,
|    ""Книга"" КАК Наименование,
|    ""Канцелярия"" КАК Категория,
|    3 КАК Количество,
|    250 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 2, ""Ручка"", ""Канцелярия"", 1, 30
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 3, ""Чай"", ""Продукты"", 2, 150
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 4, ""Вода"", ""Продукты"", 0, 70";
    Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
    Сумма = Список.ВычисляемыеПоля.Добавить();
    Сумма.ПутьКДанным = "УчебнаяСумма";
    Сумма.Заголовок = "Сумма, руб.";
    Сумма.Выражение = "Количество * Цена";
    Сумма.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
    Сумма.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=2; ЧН=0");
    Сообщить(Список.ВычисляемыеПоля.Найти("УчебнаяСумма") = Сумма);
    Сообщить(Список.ВычисляемыеПоля.Количество() = 1);
    Контроль = Новый Запрос(Список.ТекстЗапроса);
    Данные = Контроль.Выполнить().Выгрузить();
    Сообщить(Данные.Найти(1, "УчебныйНомер").Количество * Данные.Найти(1, "УчебныйНомер").Цена = 750);

    Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Категория,Количество,Цена,УчебнаяСумма", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Список." + ИмяПоля;
        Колонка.Заголовок = ИмяПоля;
    КонецЦикла;
КонецПроцедуры

Разбор по шагам

  1. У вычисляемого поля задаём уникальный путь УчебнаяСумма. Это имя понадобится в ПутьКДанным колонки формы.

  2. Выражение использует поля запроса, не переменные модуля формы. Количество и Цена числовые в собственном запросе.

  3. Формат меняет отображение, а не арифметику. Дополнительная проверка исходных данных подтверждает сумму Книги 750.

Как проверить результат

  1. Три проверки дают Истина.

  2. В новой колонке суммы: Книга 750,00; Ручка 30,00; Чай 300,00; Вода 0,00.

  3. В исходном запросе нет колонки УчебнаяСумма: вычисление относится к схеме списка.

Ожидаемый результат

Наглядная расчётная колонка без изменения структуры базы.

На что обратить внимание

  1. ВыражениеПредставления вычисляемого поля не поддерживается в динамическом списке.

  2. Не складывайте строки количества/цены как числа без определения их типа; здесь типы заданы самим запросом.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Сумма продажи: доступные значения, подписи выбора и выражение представления

На собственных продажах A01/3/500 и B02/5/700 строим вычисляемое описание суммы и реальные списки1500/3500. Заменяем список на сумму B02, снимаем и восстанавливаем его; отдельно меняем представление на Код85. Независимая модель сохраняет исходный список и формулу.

Где и как запускать

Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеЗначенияРасчета85; в1С не запускался.

Подготовка

  1. Только НОВАЯ отдельная пустая база УчебныеЗначенияРасчета85 на платформе8.5.1.1343, не копия рабочей базы. Нет бизнес-объектов, расширений, подписок и фоновых заданий. Здесь база не создаётся и код не запускается.

  2. Создайте вручную общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да; клиентские флаги, Глобальный и Привилегированный=Нет. Вставьте полный основной код целиком в модуль, не внутрь ещё одной процедуры.

  3. Своя внешняя обработка УчебныеЗначенияРасчета85 → управляемая Форма: команда Выполнить, действие Выполнить, кнопка. Отдельный полный модуль формы ниже вставьте только в модуль этой формы. До будущего разрешённого опыта сохраните собственную базу и выполните F7 вне опыта; откройте новый сеанс без расширений.

  4. Все данные готовит код: две строки таблицы, Local-источник, объектный набор Продажи85 и одно поле Сумма85. Ключ внешней структуры и ИмяОбъекта совпадают. Код85 — Строка; Количество85 — Число(1,0), Цена85 — Число(3,0), сумма — Число(6,2), всё числовое неотрицательное. Шесть разрядов ВСЕГО включают два дробных; предел9999.99.

  5. Конструктор создаёт только СписокЗначений; элементы возвращает Добавить. Числовая сумма, её строковая подпись и Булево-пометка задаются явно. Картинка не используется: необязательный аргумент пропущен, его документированное значение — пустая картинка, не Неопределено.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Привилегированный режим не нужен";
    КонецЕсли;
    Стенд = СоздатьСвойРасчетСуммы();
    Поле = СвоеПолеСуммы(Стенд);
    ПроверитьСвойВыборСуммы(Стенд, "Нет", "");
    Поле.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Стенд, "Все"));
    ПроверитьСвойВыборСуммы(Стенд, "Все", "");
    Копия = СоздатьСвойРасчетСуммы();
    ПолеКопии = СвоеПолеСуммы(Копия);
    ПолеКопии.УстановитьДоступныеЗначения(СоздатьСвойСписокСумм(Копия, "Все"));
    ПроверитьСвойВыборСуммы(Копия, "Все", "");
    Поле.ВыражениеПредставления = "Код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 → управляемая Форма → Модуль

Полный отдельный модуль своей формы с серверным вызовом; здесь не запускался.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственные суммы, списки значений, представление и независимое восстановление проверены");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеЗадачи.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. СвоеПолеСуммы проверяет обе строки и все типы исходной таблицы/набора, полный путь, заголовок, формулу и числовые квалификаторы единственного расчёта. Получение через Каталог[0] не требует спорного возвращаемого типа Получить вычисляемого каталога.

  2. СоздатьСвойСписокСумм берёт настоящие собственные строки, считает Количество85 * Цена85 обычной арифметикой BSL и добавляет1500/3500 с подписями «A01 — сумма продажи», «B02 — сумма продажи» и пометками Ложь. ТолькоB02 создаёт новый одноэлементный список3500, не фильтрует таблицу.

  3. УстановитьДоступныеЗначения(Список) задаёт доступные значения поля; ПолучитьДоступныеЗначения() возвращает СписокЗначений или Неопределено. Проверка читает количество и каждый ЭлементСпискаЗначений: тип/число, тип/подпись, тип/пометка и порядок. Одинакового количества недостаточно.

  4. Снятие выполняется документированным вызовом УстановитьДоступныеЗначения() без аргумента. После него ожидается Неопределено. Пустой список и явно переданное Неопределено здесь не подставляются: их эквивалентность снятию не заявляется.

  5. Выражение остаётся Количество85 * Цена85, Заголовок — Сумма продажи, ТипЗначения — числовой. ВыражениеПредставления меняется с пустой строки на Код85, реальное исходное поле, затем возвращается. По справке непустое выражение задаёт выводимое представление, пустое использует Выражение. Строковые подписи списка выбора не являются этим выражением.

  6. Девять состояний оригинала: снятый список/пустое представление; все суммы/пустое; все/Код85; толькоB02/Код85; снято/Код85; все/Код85; все/пустое; снято/пустое; восстановлено все/пустое. На каждом состоянии проверяются исходные данные и расчёт, не только список.

  7. Пять сверок копии сохраняют полный список1500/3500 и пустое представление при замене, снятии и восстановлении оригинала. Копия полностью строится заново: другая таблица, схема, источник, набор, поле и заново созданный список; ссылочная идентичность списка getter/setter не предполагается.

  8. Настоящий код КА2 КомпоновкаДанныхСервер.СкопироватьПоляНабораДанных читает ПолучитьДоступныеЗначения, проверяет Неопределено и передаёт список в УстановитьДоступныеЗначения. Там обычное поле набора, не вычисляемое: перенос доступных значений подтверждает паттерн, а точный контракт вычисляемого поля подтверждается только установленной справкой8.5.1.1343. Рабочая процедура не вызывается.

Как проверить результат

  1. Ожидаемый будущий итог: две исходные продажи неизменны; единственное описание Сумма85 сохраняет формулу и Число(6,2,Неотрицательный), представление снова пустое; оригинал и независимая копия имеют1500/A01 и3500/B02, пометки Ложь. Этап снятия должен вернуть Неопределено, а не пустой элемент или список.

  2. Будущий отрицательный контроль только в отдельно разрешённом стенде: заменить значениеB02 в списке3500 на3501, не меняя ожидание. Проверка должна отказать, даже когда количество элементов прежнее. Другие контроли: неправильная подпись или Истина вместо Ложь должны отказать; цена701 вместо700 должна отказать до создания списка. Здесь ничего из этого не запускалось.

  3. runtimeVerifiedScenarios=0. Подтверждён текст контрактов и статическая целостность примера, не выполненный вызов платформы, показ списка в форме или отрисованный результат отчёта. Арифметика BSL не доказывает исполнение строк Выражение/ВыражениеПредставления движком СКД.

Ожидаемый результат

Полный собственный учебный опыт редактора вычисляемого поля: значения и представление разделены, проверены по всему содержимому и восстановлены без общей копии.

На что обратить внимание

  1. Доступные значения не являются правами доступа, проверкой рабочего документа или автоматически установленным отбором. ТолькоB02 не удаляет A01 из исходных данных; количество строк всегда2. Этот урок не обещает видимость/выбор/фильтрацию конкретного интерфейса.

  2. Не изменяйте список, возвращённый ПолучитьДоступныеЗначения, в расчёте на общую ссылку. Документирован контракт значения, не идентичность, глубокое копирование или владение; для каждой установки код строит новый список и сравнивает содержимое.

  3. Не путайте подпись ЭлементСпискаЗначений.Представление с ВыражениеПредставления самого вычисляемого поля и с его Заголовком. Замена представления на Код85 не меняет числовую формулу, тип суммы или исходные данные; реальный вывод и влияние настроек отчёта требуют отдельного разрешённого теста.

  4. Не используйте здесь Сумма85 внутри собственного Выражение: вычисляемый расчёт должен ссылаться на поля набора. Поле Код85 действительно подготовлено в таблице и схеме, неизвестных реквизитов нет.

  5. Не создаются настройки выбора, ресурсы, компоновщик макета или процессор; отчёт не считается готовым к исполнению. Никаких запросов, сети, записи данных или модификации конфигураций пользователя; весь опыт ограничен новой собственной моделью в памяти.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.