Получить два настоящих значения собственного перечисления, узнать их полные имена и восстановить значения по именно этим возвращённым строкам. Проверить ссылки и использовать восстановленные способы в расчёте самовывоза и курьерской доставки своей учебной покупки.
Где и как запускать
Сервер; неглобальный непривилегированный общий модуль УчебныеИменаСпособов85. Своему клиенту формы возвращается только строковый отчёт.
Подготовка
Будущий опыт выполняйте в своей НОВОЙ пустой учебной конфигурации 8.5.1.1343, в толстом управляемом клиенте. Не в рабочей УТ, КА, УНФ или БП. Создание перечисления — ручная подготовка собственной учебной конфигурации, а код опыта только получает её значения и считает свою учебную покупку.
В Конфигураторе: Конфигурация → Перечисления → добавить УчебныеСпособыПолучения85. В узле Данные создать два значения: Самовывоз85 с синонимом Забрать со склада и Курьер85 с синонимом Привезти на адрес. Имена набрать точно; синоним — подпись для человека, не имя в коде.
Общие → Общие модули → создать УчебныеИменаСпособов85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; Клиент (управляемое приложение)=Нет; Клиент (обычное приложение)=Нет; Внешнее соединение=Нет; Повторное использование возвращаемых значений=Не использовать. Основной блок вставьте ЦЕЛИКОМ в пустой модуль.
Общие → Общие формы → создать управляемую форму ИменаСпособовПолучения85. Добавить реквизит Результат85: Строка неограниченной длины, начальное значение пустое; вывести его многострочным полем только для чтения.
В свойствах собственной формы: АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два разных перечисления, не Булево. Не создавать обработчиков сохранения данных.
Создать команду формы ПроверитьСпособы85, Действие=ПроверитьСпособы85; вывести кнопку. Второй блок вставить ЦЕЛИКОМ в пустой модуль формы. Настоящий объект Команда передаёт платформа при нажатии; обработчик не вызывается вручную.
Общие → Общие команды → создать ОткрытьИменаСпособов85 без параметра, включить её в интерфейс своей учебной подсистемы. Третий блок вставить ЦЕЛИКОМ в её пустой модуль. ОбработкаКоманды получает оба настоящих штатных параметра.
Обновить конфигурацию своей учебной базы, запустить толстый управляемый клиент, открыть собственную форму общей командой и нажать ПроверитьСпособы85. Получение значений перечисления, полных имён и расчёт находятся на сервере; клиент получает только строковый отчёт.
Не нужны документы, регистры, запросы, рабочие продажи, отдельная виртуальная машина, новый пользователь или проверки всех метаданных. Код опыта не записывает данные, не обращается к файлам или Интернету. В 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");
#Иначе
ВызватьИсключение "Учебная общая команда открывается в толстом управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Самовывоз85 и Курьер85 берутся из настоящего менеджера собственного перечисления. Это реальные значения типа ПеречислениеСсылка.УчебныеСпособыПолучения85, а не строки, номера или ссылки, созданные из произвольного UUID.
Проверки подтверждают типы, различие двух значений и настоящие признаки непустой ссылки. Сам факт наличия названия переменной ещё ничего не доказывает.
ПолучитьПолноеИмяПредопределенногоЗначения вызывается для каждого фактического значения. Результаты должны быть настоящими строками с подготовленными именами. Начало пути — Перечисление в единственном числе; Перечисления — имя свойства, через которое получили менеджер.
ПредопределенноеЗначение получает именно возвращённые методом строки. Ожидаемые строки в проверке только ловят ошибку подготовки: они не заменяют настоящий результат и не подставляются в обратный вызов.
Восстановленные ссылки снова проверяются по конкретному типу и непустоте. Совпадение с исходным самовывозом разрешает стоимость доставки 0; совпадение с исходным курьером — 250. Несовпадение останавливает опыт, а не выбирает запасной способ.
Цена 300 и количество 6 — наши учебные числа. Стоимость товаров действительно считается умножением. К ней прибавляется доставка, разрешённая именно восстановленным значением; итоговые числа проверяются как 1800 и 2050.
Отчёт использует оба настоящих полных имени и вычисленные суммы. Клиент заранее очищает старый результат и показывает только новую полностью проверенную строку; при исключении не объявляет успешный расчёт.
Как проверить результат
Первый будущий запуск: проверить два полных имени Перечисление.УчебныеСпособыПолучения85.Самовывоз85 и Перечисление.УчебныеСпособыПолучения85.Курьер85. Самовывоз даёт доставку 0 и итог 1800; курьер — доставку 250 и итог 2050.
В своём учебном отладчике остановиться после получения значений и после обратных вызовов. Все четыре ссылки имеют конкретный тип своего перечисления; исходные и соответствующие восстановленные значения равны, признаков пустой ссылки нет.
Проследить аргументы двух ПредопределенноеЗначение: это ИмяСамовывоза и ИмяКурьера, действительно полученные предыдущими вызовами, а не заранее написанные литералы.
Только в своей учебной конфигурации изменить синонимы, не имена, обновить конфигурацию и повторить. Синонимы не используются как машинные пути. Фактический результат такой будущей проверки здесь ещё не подтверждён.
Переименование настоящего имени перечисления или значения потребует согласованного изменения кода и проверок. С неизменённым примером ожидается ошибка компиляции или проверок, а не тихая замена имени. Не делайте этот опыт в рабочей конфигурации.
Только в своём учебном отладчике заменить полученную строку на неверный путь или восстановленное значение на другое. Дальнейший успешный расчёт запрещён; не засчитывайте ошибку поиска как положительное применение метода.
Нажать кнопку повторно и проверить новую строку; данные опыта не сохраняются. При серверной ошибке прежний результат не остаётся новым успехом. Не обещайте воспроизведение конкретного отказа до реального испытания.
Ожидаемый результат
Только после всех проверок: два настоящих полных имени и совпадение восстановленных ссылок с исходными значениями своего перечисления. Восстановленный самовывоз даёт доставку 0 и вычисленный итог 1800; восстановленный курьер — доставку 250 и вычисленный итог 2050. Клиент показывает фактический строковый отчёт.
На что обратить внимание
Полное имя — путь с настоящими именами метаданных и значений. Синоним и Строка(значение перечисления) являются представлениями для человека и не заменяют этот путь.
ПредопределенноеЗначение поддерживает прикладные перечисления, но native описание возврата даёт общий вид ссылки. Поэтому конкретный фактический тип, непустота и равенство собственной исходной ссылке проверяются явно.
Имена не являются UUID, вечным идентификатором или гарантией переноса в другую конфигурацию. После переименования объекта/значения прежний путь может стать непригодным.
ПредопределенноеЗначение выполняет обращение к серверу; результат кэшируется до изменения конфигурации или версии платформы. Урок не обещает поиск без серверного обращения или новое некэшированное чтение каждый раз.
Сам метод получения полного имени доступен в том числе тонкому и веб-клиенту, но свойство Перечисления и доступ к менеджеру прикладного перечисления там не доступны. Поэтому всю цепочку выполняем на сервере и не передаём клиенту ссылки или менеджер.
Строка(Число) использует национальные установки. Существенны проверенные числовые итоги 1800 и 2050, а не точная форма пробелов или разделителей в их текстовом представлении.
Подготовка меняет только свою новую учебную конфигурацию. Код опыта не создаёт/не меняет перечисление, не записывает рабочие данные, не пользуется их индексами, чужими предопределёнными элементами, файлами или сетью.
Компилятор, 1С, настоящая форма и получение значений во время написания справочника не запускались. Статическая сверка установленных API не заменяет ручную проверку; исключение не является успешным учебным опытом.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.