ВвестиЗначение: прочитать составной тип из изменённой переменной

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

Синхронный результат — Булево, тогда как введённая цена или код находятся в локальной переменной. Описание типов и проверки смысла выполняются отдельно.

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

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

Подготовка

  1. В отдельной учебной базе платформы 8.5.1.1343 создайте внешнюю обработку УчебнаяФорма85 с пустой управляемой основной формой. Используйте тонкий клиент Windows.

  2. В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте полный модуль урока, включая клиентские и серверные помощники, на уровне модуля.

  3. Не создавайте вручную ЗначениеПримера, ПолеПримера и кнопку: код создаёт их полностью. Каждый урок запускайте в отдельной копии своей формы.

  4. Сохраните свою EPF и откройте её в учебной базе. Собственное количество начинается с 3, цена книги задана в коде как 250; исходный расчёт равен 750.

  5. Связанный реквизит помечен как СохраняемыеДанные для изучения поведения формы. Это признак реквизита формы, а не автоматическая запись книги, файла или документа в базу.

  6. Команда расчёта имеет ИзменяетСохраняемыеДанные = Ложь. Уроки изменяют только свой интерфейс и значения собственной формы, не конфигурацию и не рабочие данные.

  7. Запуск и вид в 1С не проверены. Компоновку, сочетания клавиш и расположение команд осмотрите вручную в указанном клиенте; не переносите настройки на рабочие формы без отдельной проверки.

  8. В этой партии каждое окно ввода запускает собственная кнопка УчебноеДействие. Изучайте один полный модуль за раз; никакие значения ввода не исполняются как код.

  9. Только для синхронного варианта создайте отдельную пустую учебную конфигурацию с техническим именем УчебныеДиалоги85 и заранее разрешённой модальностью. Читайте её режим в конфигураторе; не меняйте рабочую базу ради урока. При ином имени или НеИспользовать пример откажется до диалога.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
    Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита, "", "Количество книг", Истина));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    ЭтаФорма.ЗначениеПримера = 3;
    Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "ЗначениеПримера";
    Поле.Заголовок = "Количество собственных книг";


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

&НаКлиенте
Процедура УчебноеДействие(Команда)
    #Если ВебКлиент Тогда
    Сообщить("Синхронный урок не выполняется в веб-клиенте; используйте обратный вызов");
    Возврат;
    #Иначе
    Если Не РазрешёнСобственныйСинхронныйВвод() Тогда
        Сообщить("Синхронный ввод недоступен для этого собственного стенда; настройки базы не менялись");
        Возврат;
    КонецЕсли;
    ДоВвода = ЗначениеПримера;
    ТипВвода = Новый ОписаниеТипов("Число,Строка", Новый КвалификаторыЧисла(8, 2, ДопустимыйЗнак.Неотрицательный), Новый КвалификаторыСтроки(20));
    Введено = Неопределено;
    Принято = ВвестиЗначение(Введено, "Введите свою цену или код УЧЕБНЫЙ10", ТипВвода);
    Если Не Принято Тогда
        Сообщить("Отмена: собственные данные не менялись");
        Возврат;
    КонецЕсли;
    Если Введено = Неопределено Тогда
        Сообщить("Отмена: собственные данные не менялись");
        Возврат;
    КонецЕсли;
    Если ЗначениеПримера <> ДоВвода Тогда
        Сообщить("Количество изменилось за время диалога. Повторите ввод для актуальной заявки");
        Возврат;
    КонецЕсли;
    ПроверитьСобственноеКоличество();
    Если ТипЗнч(Введено) = Тип("Число") Тогда
        Если Введено <= 0 Или Введено > 1000 Тогда
            ВызватьИсключение "Собственная учебная цена должна быть больше 0 и не выше 1000";
        КонецЕсли;
        Цена = Введено;
        Скидка = 0;
    ИначеЕсли ТипЗнч(Введено) = Тип("Строка") Тогда
        Код = ВРег(СокрЛП(Введено));
        Если Код <> "УЧЕБНЫЙ10" Тогда
            ВызватьИсключение "Урок принимает только собственный код УЧЕБНЫЙ10";
        КонецЕсли;
        Цена = 250;
        Скидка = 10;
    Иначе
        ВызватьИсключение "Ожидалась собственная цена или строковый учебный код";
    КонецЕсли;
    Сумма = Окр(ЗначениеПримера * Цена * (100 - Скидка) / 100, 2);
    Сообщить(ТипЗнч(Сумма) = Тип("Число"));
    Сообщить(Сумма = Окр(ДоВвода * Цена * (100 - Скидка) / 100, 2));
    Сообщить(ЗначениеПримера = ДоВвода);
    Сообщить(СтрШаблон("Собственная цена %1; скидка %2%; количество %3; сумма %4", Цена, Скидка, ЗначениеПримера, Сумма));
    #КонецЕсли

КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСобственноеКоличество()
    Если ТипЗнч(ЗначениеПримера) <> Тип("Число") Тогда
        ВызватьИсключение "Собственное количество должно быть числом";
    КонецЕсли;
    Если ЗначениеПримера < 1 ИЛИ ЗначениеПримера > 10 ИЛИ ЗначениеПримера <> Цел(ЗначениеПримера) Тогда
        ВызватьИсключение "Нужно собственное целое количество от 1 до 10";
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция РазрешёнСобственныйСинхронныйВвод()
    Возврат Метаданные.РежимИспользованияМодальности <> Метаданные.СвойстваОбъектов.РежимИспользованияМодальности.НеИспользовать;
КонецФункции

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

  1. Проверить собственную конфигурацию и её режим до синхронного вызова. На веб-клиенте ветка не выполняется.

  2. Создать составной тип Число/Строка и передать Введено=Неопределено как локальную переменную диалога.

  3. Метод по ссылке меняет Введено, а Принято отвечает только за подтверждение. При отказе не вычислять сумму.

  4. После OK определить тип изменённого значения: цена проверяется по диапазону, строка — по одному явно заданному учебному коду.

  5. Проверить неизменность количества и вычислить собственную сумму. Не использовать Принято как цену или текст скидки.

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

  1. Число 100 даёт 300, строка УЧЕБНЫЙ10 даёт 675, три проверки Истина. Отмена не меняет свои данные.

  2. При запрещённой модальности или другом имени конфигурации метод не вызывается. Альтернативные немодальные уроки не требуют менять этот режим.

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

Полный синхронный составной ввод показывает реальный источник значения и две проверенные смысловые ветви.

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

  1. Тип Неопределено начального значения не означает, что ввод не подготовлен: разрешённые типы переданы ОписаниеТипов.

  2. Метод не вызывается из серверной функции проверки модальности: сервер только возвращает Булево разрешение.

  3. Принято и Введено имеют разные роли. Не проверяйте Цена = ВвестиЗначение(...).

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

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

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

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

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