Управлять выделением двух собственных дат

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

Показываем изменяемую коллекцию ВыделенныеДаты: добавление, проверку наличия, получение и два варианта удаления.

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

Полный модуль собственной обычной формы внешней обработки. Только толстый клиент с обычными формами.

Подготовка

  1. Создайте отдельную внешнюю обработку с обычной формой в учебной базе. Только толстый клиент с обычными формами: не управляемая форма и не веб-клиент.

  2. Создайте реквизит УчебныйСтатус (Строка 20) и элемент ПолеСтатуса именно вида ПолеВыбора, свяжите его Данные с этим реквизитом. Добавьте самостоятельное ПолеКалендаря с именем УчебныйКалендарь и обычную кнопку УчебнаяКоманда.

  3. Свяжите ПриОткрытии формы и действие кнопки с одноимёнными процедурами из полного модуля. Каждый урок заменяет модуль только своей копии формы.

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

Процедура ПриОткрытии()
    УчебныйСтатус = "draft";
    Поле = ЭтаФорма.ЭлементыФормы.ПолеСтатуса;
    Варианты = Новый СписокЗначений;
    Варианты.Добавить("draft", "Черновик");
    Варианты.Добавить("published", "Опубликован");
    Поле.СписокВыбора = Варианты;
    Календарь = ЭтаФорма.ЭлементыФормы.УчебныйКалендарь;
    Календарь.НачалоПериодаОтображения = Дата(2026, 10, 1);
    Календарь.КонецПериодаОтображения = Дата(2026, 10, 31);
    Календарь.ТекущаяДата = Дата(2026, 10, 4);
    Календарь.РежимВыделения = РежимВыделенияДаты.Множественный;
КонецПроцедуры

Процедура УчебнаяКоманда(Кнопка)
    Календарь = ЭтаФорма.ЭлементыФормы.УчебныйКалендарь;
    Даты = Календарь.ВыделенныеДаты;
    Даты.Очистить();
    Даты.Добавить(Дата(2026, 10, 5));
    Даты.Добавить(Дата(2026, 10, 6));
    Сообщить(Даты.Количество() = 2);
    Сообщить(Даты.Содержит(Дата(2026, 10, 5)));
    Сообщить(Даты.Содержит(Дата(2026, 10, 6)));
    Если Даты.Количество() <> 2 Тогда
        ВызватьИсключение "Не выделены собственные 5 и 6 октября";
    КонецЕсли;
    ПерваяДата = Даты.Получить(0);
    Сообщить(ПерваяДата = Дата(2026, 10, 5) Или ПерваяДата = Дата(2026, 10, 6));
    Даты.Удалить(Дата(2026, 10, 5));
    Сообщить(Не Даты.Содержит(Дата(2026, 10, 5)) И Даты.Содержит(Дата(2026, 10, 6)));
    Если Даты.Количество() <> 1 Тогда
        ВызватьИсключение "Перед удалением по индексу ожидалась одна дата";
    КонецЕсли;
    Даты.Удалить(0);
    Сообщить(Даты.Количество() = 0);
    Даты.Добавить(Дата(2026, 10, 6));
    Сообщить(Даты.Количество() = 1 И Даты.Содержит(Дата(2026, 10, 6)));
КонецПроцедуры

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

  1. Режим выделения Множественный разрешает несколько дат.

  2. Само свойство ВыделенныеДаты readonly: ссылка на коллекцию читается, вся коллекция не присваивается обратно.

  3. Очистить удаляет выделение только этого собственного календаря, не документы с такими датами.

  4. Получить(0) вызывается после проверки количества; порядок добавления не объявлен бизнес-порядком.

  5. Удалить(Дата) и Удалить(Число) — разные перегрузки: сначала удаляем 5 октября по значению, затем единственный оставшийся элемент по индексу 0.

  6. В конце выделяется только 6 октября, повторный запуск воспроизводит тот же цикл.

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

  1. Семь сообщений Истина.

  2. Количество выделенных дат 0→2→1→0→1; в конце выделено только 06.10.2026.

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

Все методы коллекции выделенных дат показаны на двух реальных учебных датах.

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

  1. Не используйте номер дня месяца вместо индекса коллекции.

  2. Удаление выделения не удаляет данные базы и не меняет производственный календарь.

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

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

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

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

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