Модальный диалог: увидеть настоящий Bool и отдельно решить судьбу своего кандидата

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

Самостоятельный учебный процесс с настоящим диалогом платформы, собственными подготовленными данными, независимой проверкой результата и отдельным объяснением отмены. Все изменения только в памяти своей формы.

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

Полный модуль собственной управляемой формы новой пустой файловойCF8.5.1.1343; толстый управляемый Windowsx64 клиент. Модальный вариант только в отдельной CF. ActualUI/1C/БД/файлы/сеть0.

Подготовка

  1. Создайте новую собственную пустую файловую ИБ платформы ровно 8.5.1.1343. Русский встроенный язык, управляемое приложение, совместимость «Не использовать». Рабочие конфигурации, чужие формы, действующие задания и данные не использовать.

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

  3. Используйте только толстый управляемый клиент Windows x64 под своим учебным профилем. Справка у диалогов содержит и другие клиенты, но поля РасписаниеРегламентногоЗадания доступны на сервере, в толстом клиенте и внешнем соединении; их чтение в тонком клиенте здесь не выдумывается.

  4. Для выбора диаграммы и немодального расписания имя корня CF — УчебныеДиалогиДиаграммыИРасписания85. Свойство конфигурации Режим использования модальности — Не использовать. Код проверяет это, а не открывает модальное окно вопреки настройке.

  5. Для ОткрытьМодально создайте ДРУГУЮ новую пустую CF УчебныйМодальныйДиалогРасписания85. Только в ней явно задайте Режим использования модальности — Использовать. Это отдельный учебный вариант, не инструкция менять режим рабочей конфигурации.

  6. Внешняя обработка OwnChartScheduleDialog85: одна управляемая форма. Общие реквизиты ПодтверждаюСвойСтенд85 — Булево, начально Ложь; Занято85 — Булево, начально Ложь и ТолькоПросмотр; Статус85 — Строка неограниченной длины, многострочная, ТолькоПросмотр. Вставьте весь модуль одной карточки; не объединяйте одинаковые обработчики.

  7. Для диаграммы добавьте реквизит Диаграмма85 типа Диаграмма. Перетащите его на форму, создайте элемент вида Поле диаграммы с ПутьКДанным=Диаграмма85. Источник данных и автоматическое транспонирование не задавать. Кнопки: ПодготовитьСвоюДиаграмму85, ВыбратьТипЧерезЖдать85, ВыбратьТипЧерезОповещение85.

  8. Диаграмма заполняется собственными вычислениями: одна серия «Выручка, руб.», утром 3 книги по 250 = 750, вечером 5 по 250 = 1250. После подготовки и смены типа реальные значения перечитываются из двух ячеек, сумма должна быть 2000. Смена оформления не заменяет данные.

  9. У ДоступныеТипыДиаграммы свойство только для чтения: ему нельзя присвоить новый массив. Код получает настоящий массив, очищает его и добавляет Гистограмма/График, затем повторно читает свойство и проверяет ровно эти два типа. Если изменение массива не отразилось, выбор не запускается. Диалог.ТипДиаграммы задает начальное выделение, а не выбранный результат.

  10. Для каждого немодального выбора создается новый собственный UUID-контекст. ОписаниеОповещения действительно связано с экспортным обработчиком завершения из двух параметров: результат и контекст. Ошибка связывается отдельным обработчиком из трех параметров. Не вызывайте эти обработчики вручную с придуманными результатами.

  11. Показать выбора типа документирует Неопределено при отсутствии выбора. Для ВыбратьАсинх справка описывает выбранный тип, но явно не называет результат отмены; код проверяет тип и безопасно обрабатывает Неопределено, не обещая эту ветку как документированный обязательный результат Promise.

  12. Для немодального расписания кнопки: ПодготовитьСвоеРасписание85, ИзменитьЧерезЖдать85, ИзменитьЧерезОповещение85. Рабочий объект и кандидат создаются отдельно настоящим Новый РасписаниеРегламентногоЗадания. Диалог получает только кандидата, поэтому отмена не требует откатывать рабочий объект.

  13. Учебное расписание только в памяти: 10.10.2026, 08:00–10:00, без дней недели, месяцев и детальных расписаний. ПериодПовтораДней=1, остальные специальные ограничения нулевые. В диалоге меняйте только начало на 09:00, остальные поля не трогайте. Получится нормальное часовое окно 09:00–10:00. Все 15 полей проверяются на конкретные собственные значения, а не принимается любой непустой объект.

  14. ТребуетсяВыполнение проверяет конкретные даты, не запускает задание. Перед началом и после конца окна — Ложь, на границах — Истина, на соседних датах — Ложь. Даты предыдущих запусков не передаются: по справке задание считается не запускавшимся, условия повторного запуска этим опытом не доказываются.

  15. Свойство ДиалогРасписанияРегламентногоЗадания.Расписание только для чтения: оно не присваивается. Результат Ждать или оповещения сверяется как настоящее РасписаниеРегламентногоЗадания; Неопределено означает закрытие не по OK. Изменения отдельного кандидата при отмене допускаются, но рабочий объект остается исходным.

  16. В экспорте конструктор диалога назван «По умолчанию», но родная страница HBK говорит «По расписанию» и требует обязательный аргумент Расписание. Код всегда передает реальный собственный объект. Вызов без аргумента запрещен; имя карточки не меняет контракт.

  17. Для модальной формы добавьте ПодтверждаюЗакрытиеЧерезOK85 — Булево, начально Ложь. Кнопки: ПодготовитьСвойМодальныйОпыт85, ОткрытьСвойМодальныйДиалог85, ЯвноПринятьТолькоСвойOK85, ОтброситьМодальногоКандидата85. Новое открытие сбрасывает подтверждение. Значение Bool показывается, но не используется для угадывания OK/Отмена: справка не расшифровывает его значения.

  18. При модальном опыте только после реального нажатия OK вручную подтвердите его и отдельно примите проверенного кандидата. После Отмена не ставьте подтверждение: отдельной командой отбросьте кандидат, даже если его поля изменились во время редактирования. Это ваше явное решение, не автоматически доказанная кнопка закрытия.

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

  20. ActualUI/1C/files/DB/network0: здесь только авторство и статические проверки по установленной справке. Диалоги, задания, база и сеть не запускались и не изменялись. Расписание никуда не записывается, фоновые работы не создаются. Корень проекта только читался; резервные копии и архивы не создавались.

&НаКлиенте
Перем СвоеРасписание85;

&НаКлиенте
Перем СвойМодальныйКандидат85;

&НаКлиенте
Процедура ПодготовитьСвойМодальныйОпыт85(Команда)
    ПроверитьСвоегоКлиента85();
    Если Занято85 Тогда
        ВызватьИсключение "Сначала закройте свой модальный диалог";
    КонецЕсли;
    СвоеРасписание85 = СоздатьСвоеРасписание85();
    СвойМодальныйКандидат85 = Неопределено;
    ПодтверждаюЗакрытиеЧерезOK85 = Ложь;
    Статус85 = "Отдельная собственная CF с разрешенной модальностью. Рабочее расписание в памяти 08:00–10:00";
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСвойМодальныйДиалог85(Команда)
    ПроверитьСвоегоКлиента85();
    Если Занято85 Или СвоеРасписание85 = Неопределено Или СвойМодальныйКандидат85 <> Неопределено Тогда
        ВызватьИсключение "Нужна отдельная подготовка, не поверх предыдущего кандидата";
    КонецЕсли;
    ПроверитьСвоеРасписание85(СвоеРасписание85, 8);
    ПодтверждаюЗакрытиеЧерезOK85 = Ложь;
    Кандидат = СоздатьСвоеРасписание85();
    Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Кандидат);
    ПроверитьСвоеРасписание85(Диалог.Расписание, 8);
    Занято85 = Истина;
    Статус85 = "В своем модальном кандидате измените только08:00 на09:00; запомните, какую кнопку закрытия нажали";
    Попытка
        ВозвращенныйBool = Диалог.ОткрытьМодально();
        Если ТипЗнч(ВозвращенныйBool) <> Тип("Булево") Тогда
            ВызватьИсключение "Native обещаетBool, не Расписание/Неопределено как вAsync/Show";
        КонецЕсли;
        ПроверитьСвоеРасписание85(СвоеРасписание85, 8);
        СвойМодальныйКандидат85 = Диалог.Расписание;
        Статус85 = "Модальный вызов вернулBool=" + Строка(ВозвращенныйBool)
            + ". Рабочий объект 08:00–10:00 не заменен. Значение Bool само по себе не доказывает документированный OK/Отмена; подтвердите вручную только реальную кнопку OK";
    Исключение
        Статус85 = "Модальный вызов/тип не подтверждены; кандидат не используется для автоматического изменения";
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ЯвноПринятьТолькоСвойOK85(Команда)
    ПроверитьСвоегоКлиента85();
    Если Занято85 Или Не ПодтверждаюЗакрытиеЧерезOK85 Или СвойМодальныйКандидат85 = Неопределено Тогда
        ВызватьИсключение "Принятие требует ВАШЕГО фактическогоOK и реального собственного кандидата";
    КонецЕсли;
    ПроверитьСвоеРасписание85(СвоеРасписание85, 8);
    ПроверитьСвоеРасписание85(СвойМодальныйКандидат85, 9);
    СвоеРасписание85 = СвойМодальныйКандидат85;
    ПроверитьСвоеРасписание85(СвоеРасписание85, 9);
    СвойМодальныйКандидат85 = Неопределено;
    ПодтверждаюЗакрытиеЧерезOK85 = Ложь;
    Статус85 = "После вашего явного OK принято только собственное 09:00–10:00 в памяти; регламентных заданий, записей и запусков нет";
КонецПроцедуры

&НаКлиенте
Процедура ОтброситьМодальногоКандидата85(Команда)
    ПроверитьСвоегоКлиента85();
    Если Занято85 Или СвойМодальныйКандидат85 = Неопределено Тогда
        ВызватьИсключение "Нужен свой закрытый диалог, не ожидающий/чужой объект";
    КонецЕсли;
    ПроверитьСвоеРасписание85(СвоеРасписание85, 8);
    СвойМодальныйКандидат85 = Неопределено;
    ПодтверждаюЗакрытиеЧерезOK85 = Ложь;
    Статус85 = "Собственный кандидат явно отброшен. Рабочий объект 08:00–10:00 подтвержден; кнопка отмены не выведена из Bool";
КонецПроцедуры

&НаКлиенте
Функция СоздатьСвоеРасписание85()
    Расписание = Новый РасписаниеРегламентногоЗадания;
    Расписание.ДатаНачала = Дата(2026, 10, 10);
    Расписание.ДатаКонца = Дата(2026, 10, 10);
    Расписание.ВремяНачала = Дата(1, 1, 1, 8, 0, 0);
    Расписание.ВремяКонца = Дата(1, 1, 1, 10, 0, 0);
    Расписание.ВремяЗавершения = Дата(1, 1, 1);
    Расписание.ДеньВМесяце = 0;
    Расписание.ДеньНеделиВМесяце = 0;
    Расписание.ИнтервалЗавершения = 0;
    Расписание.ПаузаПовтора = 0;
    Расписание.ПериодНедель = 0;
    Расписание.ПериодПовтораВТечениеДня = 0;
    Расписание.ПериодПовтораДней = 1;
    Расписание.ДетальныеРасписанияДня = Новый Массив;
    Расписание.ДниНедели = Новый Массив;
    Расписание.Месяцы = Новый Массив;
    ПроверитьСвоеРасписание85(Расписание, 8);
    Возврат Расписание;
КонецФункции

&НаКлиенте
Процедура ПроверитьСвоеРасписание85(Расписание, ЧасНачала)
    Если ТипЗнч(Расписание) <> Тип("РасписаниеРегламентногоЗадания") Тогда
        ВызватьИсключение "Нужен настоящий объект своего расписания в памяти, не строка/Структура";
    КонецЕсли;
    Если ЧасНачала <> 8 И ЧасНачала <> 9 Тогда
        ВызватьИсключение "Свой опыт рассматривает только окно 08:00–10:00 либо 09:00–10:00";
    КонецЕсли;
    Если Расписание.ДатаНачала <> Дата(2026, 10, 10) Или Расписание.ДатаКонца <> Дата(2026, 10, 10)
        Или Расписание.ВремяНачала <> Дата(1, 1, 1, ЧасНачала, 0, 0)
        Или Расписание.ВремяКонца <> Дата(1, 1, 1, 10, 0, 0)
        Или Расписание.ВремяЗавершения <> Дата(1, 1, 1)
        Или Расписание.ДеньВМесяце <> 0 Или Расписание.ДеньНеделиВМесяце <> 0
        Или Расписание.ИнтервалЗавершения <> 0 Или Расписание.ПаузаПовтора <> 0
        Или Расписание.ПериодНедель <> 0 Или Расписание.ПериодПовтораВТечениеДня <> 0
        Или Расписание.ПериодПовтораДней <> 1 Или Расписание.ДетальныеРасписанияДня.Количество() <> 0
        Или Расписание.ДниНедели.Количество() <> 0 Или Расписание.Месяцы.Количество() <> 0 Тогда
        ВызватьИсключение "Свой кандидат должен отличаться только часомначала; неизвестные ограничения не принимаем";
    КонецЕсли;
    Если Расписание.ТребуетсяВыполнение(Дата(2026, 10, 10, ЧасНачала - 1, 59, 59))
        Или Не Расписание.ТребуетсяВыполнение(Дата(2026, 10, 10, ЧасНачала, 0, 0))
        Или Не Расписание.ТребуетсяВыполнение(Дата(2026, 10, 10, 10, 0, 0))
        Или Расписание.ТребуетсяВыполнение(Дата(2026, 10, 10, 10, 0, 1))
        Или Расписание.ТребуетсяВыполнение(Дата(2026, 10, 9, ЧасНачала, 0, 0))
        Или Расписание.ТребуетсяВыполнение(Дата(2026, 10, 11, ЧасНачала, 0, 0)) Тогда
        ВызватьИсключение "Конкретные positive/negative даты должны подтвердить только собственное окно";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоегоКлиента85()
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Система = Новый СистемнаяИнформация;
        Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Или Не ПодтверждаюСвойСтенд85 Тогда
            ВызватьИсключение "Подтвердите только свою новую пустую ИБ, толстый управляемый Windowsx64 клиент8.5.1.1343";
        КонецЕсли;
        ПроверитьНаСервере85();
    #Иначе
        ВызватьИсключение "Этот самостоятельный маршрут не заявляет другие клиенты проверенными";
    #КонецЕсли
КонецПроцедуры

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

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

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

  1. Создайте отдельную новую пустую CF с явно разрешенной модальностью; в немодальной CF этот урок должен отказать до показа.

  2. Подготовьте свое исходное расписание 08:00–10:00. Откройте модальный диалог с отдельным кандидатом и измените начало на 09:00.

  3. После закрытия ОткрытьМодально дает настоящий Bool. Код показывает его и сохраняет кандидата, но не выводит смыслOK/Отмена из недокументированных значений.

  4. Если вы реально нажали OK, вручную подтвердите это и отдельно нажмите ЯвноПринятьТолькоСвойOK85. Проверяются тип, 15 полей и конкретные даты перед принятием только в память.

  5. В независимом опыте нажмите Отмена, не подтверждайте OK и явно отбросьте кандидата. Исходный рабочий объект должен остаться 08:00–10:00.

  6. Bool, факт открытия или измененный объект сами по себе не являются доказательством согласия пользователя. Это не автоматический rollback и не создание регламентного задания.

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

  1. Реальные собственные данные подготовлены до открытия; результат не заменяется неизвестной строкой, структурой или объектом из рабочей базы.

  2. Аргументы конструкторов и методов, результаты Promise/Bool, экспортные callbacks и доступность совпадают с установленной справкой8.5.1.1343.

  3. Readonly свойства не присваиваются; повторное чтение подтверждает изменение настоящего массива/кандидата либо выбранного оформления.

  4. Отмена, ошибка и согласие пользователя не смешиваются. Рабочий объект не передается редактируемым кандидатом; повторный одновременный диалог запрещен.

  5. Нет регламентных заданий, записи расписания, файлов, сети, actualUI/1C или обещания атомарности; только авторство и статические проверки.

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

Ожидаемый ручной результат: выбранный тип применяется без изменения750/1250/2000; либо только свой проверенный объект расписания меняется08:00→09:00. Отмена не заменяет рабочие данные. Диалоги фактически здесь не запускались.

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

  1. Имя экспортированной карточки конструктора «По умолчанию» не означает ноль аргументов: диалогу расписания обязательно нужен настоящий объект.

  2. Показать/ОткрытьАсинх расписания документируют Неопределено при закрытии не поOK; модальный метод дает Bool без расшифровки его значений. Нельзя подменять один контракт другим.

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

  4. ТребуетсяВыполнение отвечает на вопрос о дате и не запускает задание. Этот пример не доказывает поведение планировщика, предыдущих запусков, фоновой очереди или доставки отчета.

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

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

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

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

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