ВвестиДату: использовать дату только после подтверждения в своём стенде

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

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

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

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

Подготовка

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

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

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

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

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

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

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

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

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

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


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

&НаКлиенте
Процедура УчебноеДействие(Команда)
    #Если ВебКлиент Тогда
    Сообщить("Синхронный урок не выполняется в веб-клиенте; используйте обратный вызов");
    Возврат;
    #Иначе
    Если Не РазрешёнСобственныйСинхронныйВвод() Тогда
        Сообщить("Синхронный ввод недоступен для этого собственного стенда; настройки базы не менялись");
        Возврат;
    КонецЕсли;
    ДоВвода = ЗначениеПримера;
    Введено = Дата(2026, 10, 6);
    Принято = ВвестиДату(Введено, "День собственной доставки: с 6 по 12 октября 2026", ЧастиДаты.Дата);
    Если Не Принято Тогда
        Сообщить("Отмена: собственные данные не менялись");
        Возврат;
    КонецЕсли;
    Если Введено = Неопределено Тогда
        Сообщить("Отмена: собственные данные не менялись");
        Возврат;
    КонецЕсли;
    Если ЗначениеПримера <> ДоВвода Тогда
        Сообщить("Количество изменилось за время диалога. Повторите ввод для актуальной заявки");
        Возврат;
    КонецЕсли;
    Если ТипЗнч(Введено) <> Тип("Дата") Тогда
        ВызватьИсключение "Для собственной доставки нужна дата";
    КонецЕсли;
    День = НачалоДня(Введено);
    Если День < Дата(2026, 10, 6) Или День > Дата(2026, 10, 12) Тогда
        ВызватьИсключение "Для урока выберите день с 6 по 12 октября 2026 включительно";
    КонецЕсли;
    ПроверитьСобственноеКоличество();
    Доставка = 0;
    Если День > Дата(2026, 10, 7) Тогда
        Доставка = 100;
    КонецЕсли;
    СуммаКниг = ЗначениеПримера * 250;
    Итого = СуммаКниг + Доставка;
    Сообщить(Итого - Доставка = СуммаКниг);
    Сообщить(ЗначениеПримера = ДоВвода);
    Сообщить(СтрШаблон("Собственный день %1; книги %2; доставка %3; итого %4", Формат(День, "ДФ=yyyy-MM-dd"), СуммаКниг, Доставка, Итого));
    #КонецЕсли

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

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

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

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

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

  2. Присвоить локальной Введено собственную дату 6 октября 2026. Переменная служит одновременно начальным значением и получателем нового значения.

  3. ВвестиДату вызывается с тремя аргументами. При Принято=Ложь выйти до нормализации и расчёта.

  4. После подтверждения проверить дату и свой диапазон 6–12 октября. НачалоДня отделяет прикладной день от времени внутри значения.

  5. Посчитать книги по 250 плюс собственную доставку 0/100. Числовое количество остаётся прежним, ни один документ не записывается.

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

  1. В своей совместимой базе 8 октября при количестве 3 даёт 850 и две Истина; 6 октября — 750. Отмена сохраняет данные.

  2. При НеИспользовать, другом имени конфигурации или веб-клиенте окно не вызывается. Для немодального режима используйте соседний ПоказатьВводДаты.

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

Старый датовый контракт объяснён на реальном собственном расчёте, с защитой среды и подтверждения.

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

  1. Возвращённое Булево не является датой. Дата после OK находится в локальной Введено.

  2. Не вызывайте синхронный ввод на сервере и не меняйте режим рабочего приложения ради примера.

  3. Этот календарный диапазон фиксирован для урока. Не выдавайте его за правило текущих сроков вашей конфигурации.

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

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

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

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

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