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

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

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

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

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

Подготовка

  1. Будущий опыт выполняйте в своей НОВОЙ пустой учебной конфигурации 8.5.1.1343, в толстом управляемом клиенте. Не в рабочей УТ, КА, УНФ или БП. Создание перечисления — ручная подготовка собственной учебной конфигурации, а код опыта только получает её значения и считает свою учебную покупку.

  2. В Конфигураторе: Конфигурация → Перечисления → добавить УчебныеСпособыПолучения85. В узле Данные создать два значения: Самовывоз85 с синонимом Забрать со склада и Курьер85 с синонимом Привезти на адрес. Имена набрать точно; синоним — подпись для человека, не имя в коде.

  3. Общие → Общие модули → создать УчебныеИменаСпособов85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; Клиент (управляемое приложение)=Нет; Клиент (обычное приложение)=Нет; Внешнее соединение=Нет; Повторное использование возвращаемых значений=Не использовать. Основной блок вставьте ЦЕЛИКОМ в пустой модуль.

  4. Общие → Общие формы → создать управляемую форму ИменаСпособовПолучения85. Добавить реквизит Результат85: Строка неограниченной длины, начальное значение пустое; вывести его многострочным полем только для чтения.

  5. В свойствах собственной формы: АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два разных перечисления, не Булево. Не создавать обработчиков сохранения данных.

  6. Создать команду формы ПроверитьСпособы85, Действие=ПроверитьСпособы85; вывести кнопку. Второй блок вставить ЦЕЛИКОМ в пустой модуль формы. Настоящий объект Команда передаёт платформа при нажатии; обработчик не вызывается вручную.

  7. Общие → Общие команды → создать ОткрытьИменаСпособов85 без параметра, включить её в интерфейс своей учебной подсистемы. Третий блок вставить ЦЕЛИКОМ в её пустой модуль. ОбработкаКоманды получает оба настоящих штатных параметра.

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

  9. Не нужны документы, регистры, запросы, рабочие продажи, отдельная виртуальная машина, новый пользователь или проверки всех метаданных. Код опыта не записывает данные, не обращается к файлам или Интернету. В 1С он пока не запускался; компиляция и успешный отчёт остаются будущей ручной проверкой.

Функция ПолучитьИменаИРасчетДоставки85() Экспорт
    Самовывоз = Перечисления.УчебныеСпособыПолучения85.Самовывоз85;
    Курьер = Перечисления.УчебныеСпособыПолучения85.Курьер85;
    Если ТипЗнч(Самовывоз) <> Тип("ПеречислениеСсылка.УчебныеСпособыПолучения85")
        Или ТипЗнч(Курьер) <> Тип("ПеречислениеСсылка.УчебныеСпособыПолучения85")
        Или Самовывоз = Курьер Тогда
        ВызватьИсключение "Нужны два разных настоящих значения своего перечисления";
    КонецЕсли;
    ПустойСамовывоз = Самовывоз.Пустая();
    ПустойКурьер = Курьер.Пустая();
    Если ТипЗнч(ПустойСамовывоз) <> Тип("Булево") Или ТипЗнч(ПустойКурьер) <> Тип("Булево") Тогда
        ВызватьИсключение "Не получены настоящие признаки пустой ссылки";
    КонецЕсли;
    Если ПустойСамовывоз Или ПустойКурьер Тогда
        ВызватьИсключение "Исходные значения собственного перечисления не должны быть пустыми";
    КонецЕсли;
    ИмяСамовывоза = ПолучитьПолноеИмяПредопределенногоЗначения(Самовывоз);
    ИмяКурьера = ПолучитьПолноеИмяПредопределенногоЗначения(Курьер);
    Если ТипЗнч(ИмяСамовывоза) <> Тип("Строка") Или ТипЗнч(ИмяКурьера) <> Тип("Строка") Тогда
        ВызватьИсключение "Полные имена должны быть настоящими строками";
    КонецЕсли;
    Если ИмяСамовывоза <> "Перечисление.УчебныеСпособыПолучения85.Самовывоз85"
        Или ИмяКурьера <> "Перечисление.УчебныеСпособыПолучения85.Курьер85" Тогда
        ВызватьИсключение "Проверьте настоящие имена перечисления и его значений в своей подготовке";
    КонецЕсли;
    ВосстановленныйСамовывоз = ПредопределенноеЗначение(ИмяСамовывоза);
    ВосстановленныйКурьер = ПредопределенноеЗначение(ИмяКурьера);
    Если ТипЗнч(ВосстановленныйСамовывоз) <> Тип("ПеречислениеСсылка.УчебныеСпособыПолучения85")
        Или ТипЗнч(ВосстановленныйКурьер) <> Тип("ПеречислениеСсылка.УчебныеСпособыПолучения85") Тогда
        ВызватьИсключение "По полученным именам не восстановлены ссылки своего перечисления";
    КонецЕсли;
    ПустойВосстановленныйСамовывоз = ВосстановленныйСамовывоз.Пустая();
    ПустойВосстановленныйКурьер = ВосстановленныйКурьер.Пустая();
    Если ТипЗнч(ПустойВосстановленныйСамовывоз) <> Тип("Булево")
        Или ТипЗнч(ПустойВосстановленныйКурьер) <> Тип("Булево") Тогда
        ВызватьИсключение "Не получены настоящие признаки восстановленных ссылок";
    КонецЕсли;
    Если ПустойВосстановленныйСамовывоз Или ПустойВосстановленныйКурьер Тогда
        ВызватьИсключение "Восстановленные ссылки собственного перечисления не должны быть пустыми";
    КонецЕсли;
    Если ВосстановленныйСамовывоз = Самовывоз Тогда
        ДоставкаСамовывоза = 0;
    Иначе
        ВызватьИсключение "Восстановлен другой способ вместо собственного самовывоза";
    КонецЕсли;
    Если ВосстановленныйКурьер = Курьер Тогда
        ДоставкаКурьера = 250;
    Иначе
        ВызватьИсключение "Восстановлен другой способ вместо собственного курьера";
    КонецЕсли;
    Цена = 300;
    Количество = 6;
    СуммаТоваров = Цена * Количество;
    Если ТипЗнч(СуммаТоваров) <> Тип("Число") Или СуммаТоваров <> 1800 Тогда
        ВызватьИсключение "Не подтверждён собственный расчёт стоимости товаров";
    КонецЕсли;
    ИтогСамовывоза = СуммаТоваров + ДоставкаСамовывоза;
    ИтогКурьера = СуммаТоваров + ДоставкаКурьера;
    Если ТипЗнч(ИтогСамовывоза) <> Тип("Число") Или ТипЗнч(ИтогКурьера) <> Тип("Число") Тогда
        ВызватьИсключение "Итоговые суммы должны быть настоящими числами";
    КонецЕсли;
    Если ИтогСамовывоза <> 1800 Или ИтогКурьера <> 2050 Тогда
        ВызватьИсключение "Стоимость доставки не соответствует восстановленным собственным способам";
    КонецЕсли;
    Отчет = "Самовывоз: " + ИмяСамовывоза + "; доставка " + Строка(ДоставкаСамовывоза)
        + "; итог " + Строка(ИтогСамовывоза) + ". Курьер: " + ИмяКурьера
        + "; доставка " + Строка(ДоставкаКурьера) + "; итог " + Строка(ИтогКурьера) + ".";
    Возврат Отчет;
КонецФункции
Целый модуль собственной управляемой формы ИменаСпособовПолучения85

Общие → Общие формы → ИменаСпособовПолучения85 → пустой модуль формы. Вставить ЦЕЛИКОМ; Результат85 — строковое поле только для чтения; команда ПроверитьСпособы85 связана через Действие.

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

&НаКлиенте
Процедура ПроверитьСпособы85(Команда)
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПроверитьСпособы85" Тогда
        ВызватьИсключение "Нужна настоящая собственная команда формы";
    КонецЕсли;
    Результат85 = "";
    Попытка
        Получено = ПолучитьИменаНаСервере85();
        Если ТипЗнч(Получено) <> Тип("Строка") Или Получено = "" Тогда
            ВызватьИсключение "Сервер не вернул полный строковый отчёт";
        КонецЕсли;
        Результат85 = Получено;
    Исключение
        Результат85 = "Имена и расчёт НЕ проверены. Опыт остановлен.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервере
Функция ПолучитьИменаНаСервере85()
    Если ИмяФормы <> "ОбщаяФорма.ИменаСпособовПолучения85"
        Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
        Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
        ВызватьИсключение "Нужна собственная форма с отключённым сохранением данных";
    КонецЕсли;
    Отчет = УчебныеИменаСпособов85.ПолучитьИменаИРасчетДоставки85();
    Если ТипЗнч(Отчет) <> Тип("Строка") Или Отчет = "" Тогда
        ВызватьИсключение "Не получен полный строковый результат собственного модуля";
    КонецЕсли;
    Возврат Отчет;
КонецФункции
Целый модуль собственной общей команды ОткрытьИменаСпособов85

Общие → Общие команды → ОткрытьИменаСпособов85 → пустой модуль команды. Вставить ЦЕЛИКОМ; без параметра, включить команду в свой учебный командный интерфейс.

Толстый управляемый клиент; настоящее событие ОбработкаКоманды с обоими штатными параметрами.

Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Если ПараметрКоманды <> Неопределено
            Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
            ВызватьИсключение "Откройте свою учебную форму штатной общей командой без параметра";
        КонецЕсли;
        ОткрытьФорму("ОбщаяФорма.ИменаСпособовПолучения85");
    #Иначе
        ВызватьИсключение "Учебная общая команда открывается в толстом управляемом клиенте";
    #КонецЕсли
КонецПроцедуры

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

  1. Самовывоз85 и Курьер85 берутся из настоящего менеджера собственного перечисления. Это реальные значения типа ПеречислениеСсылка.УчебныеСпособыПолучения85, а не строки, номера или ссылки, созданные из произвольного UUID.

  2. Проверки подтверждают типы, различие двух значений и настоящие признаки непустой ссылки. Сам факт наличия названия переменной ещё ничего не доказывает.

  3. ПолучитьПолноеИмяПредопределенногоЗначения вызывается для каждого фактического значения. Результаты должны быть настоящими строками с подготовленными именами. Начало пути — Перечисление в единственном числе; Перечисления — имя свойства, через которое получили менеджер.

  4. ПредопределенноеЗначение получает именно возвращённые методом строки. Ожидаемые строки в проверке только ловят ошибку подготовки: они не заменяют настоящий результат и не подставляются в обратный вызов.

  5. Восстановленные ссылки снова проверяются по конкретному типу и непустоте. Совпадение с исходным самовывозом разрешает стоимость доставки 0; совпадение с исходным курьером — 250. Несовпадение останавливает опыт, а не выбирает запасной способ.

  6. Цена 300 и количество 6 — наши учебные числа. Стоимость товаров действительно считается умножением. К ней прибавляется доставка, разрешённая именно восстановленным значением; итоговые числа проверяются как 1800 и 2050.

  7. Отчёт использует оба настоящих полных имени и вычисленные суммы. Клиент заранее очищает старый результат и показывает только новую полностью проверенную строку; при исключении не объявляет успешный расчёт.

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

  1. Первый будущий запуск: проверить два полных имени Перечисление.УчебныеСпособыПолучения85.Самовывоз85 и Перечисление.УчебныеСпособыПолучения85.Курьер85. Самовывоз даёт доставку 0 и итог 1800; курьер — доставку 250 и итог 2050.

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

  3. Проследить аргументы двух ПредопределенноеЗначение: это ИмяСамовывоза и ИмяКурьера, действительно полученные предыдущими вызовами, а не заранее написанные литералы.

  4. Только в своей учебной конфигурации изменить синонимы, не имена, обновить конфигурацию и повторить. Синонимы не используются как машинные пути. Фактический результат такой будущей проверки здесь ещё не подтверждён.

  5. Переименование настоящего имени перечисления или значения потребует согласованного изменения кода и проверок. С неизменённым примером ожидается ошибка компиляции или проверок, а не тихая замена имени. Не делайте этот опыт в рабочей конфигурации.

  6. Только в своём учебном отладчике заменить полученную строку на неверный путь или восстановленное значение на другое. Дальнейший успешный расчёт запрещён; не засчитывайте ошибку поиска как положительное применение метода.

  7. Нажать кнопку повторно и проверить новую строку; данные опыта не сохраняются. При серверной ошибке прежний результат не остаётся новым успехом. Не обещайте воспроизведение конкретного отказа до реального испытания.

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

Только после всех проверок: два настоящих полных имени и совпадение восстановленных ссылок с исходными значениями своего перечисления. Восстановленный самовывоз даёт доставку 0 и вычисленный итог 1800; восстановленный курьер — доставку 250 и вычисленный итог 2050. Клиент показывает фактический строковый отчёт.

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

  1. Полное имя — путь с настоящими именами метаданных и значений. Синоним и Строка(значение перечисления) являются представлениями для человека и не заменяют этот путь.

  2. ПредопределенноеЗначение поддерживает прикладные перечисления, но native описание возврата даёт общий вид ссылки. Поэтому конкретный фактический тип, непустота и равенство собственной исходной ссылке проверяются явно.

  3. Имена не являются UUID, вечным идентификатором или гарантией переноса в другую конфигурацию. После переименования объекта/значения прежний путь может стать непригодным.

  4. ПредопределенноеЗначение выполняет обращение к серверу; результат кэшируется до изменения конфигурации или версии платформы. Урок не обещает поиск без серверного обращения или новое некэшированное чтение каждый раз.

  5. Сам метод получения полного имени доступен в том числе тонкому и веб-клиенту, но свойство Перечисления и доступ к менеджеру прикладного перечисления там не доступны. Поэтому всю цепочку выполняем на сервере и не передаём клиенту ссылки или менеджер.

  6. Строка(Число) использует национальные установки. Существенны проверенные числовые итоги 1800 и 2050, а не точная форма пробелов или разделителей в их текстовом представлении.

  7. Подготовка меняет только свою новую учебную конфигурацию. Код опыта не создаёт/не меняет перечисление, не записывает рабочие данные, не пользуется их индексами, чужими предопределёнными элементами, файлами или сетью.

  8. Компилятор, 1С, настоящая форма и получение значений во время написания справочника не запускались. Статическая сверка установленных API не заменяет ручную проверку; исключение не является успешным учебным опытом.

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

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

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

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

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