Создать, переименовать и удалить только свой пустой календарь

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

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

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

Полный клиентский модуль собственной мобильной управляемой формы. Не вставляйте процедуры внутрь другой процедуры.

Подготовка

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

  2. Первый урок работает только с данными в памяти. Для обращения к календарям вручную разрешите учебному приложению доступ в настройках ОС; доступность API не заменяет разрешение.

  3. Для уроков добавления, изменения и удаления используйте только отдельное учебное устройство/профиль с локальными календарями без синхронизации, приглашений и рабочих событий. Не используйте основной личный/корпоративный календарь.

  4. Код вставляется на уровне модуля собственной управляемой формы. Команды с указанными именами создайте вручную и назначьте им одноимённые обработчики.

  5. Никакой из этих рецептов в настоящем мобильном клиенте не запускался автоматически. Проверяйте разрешения, фактические типы и контрольные результаты на своём учебном устройстве.

&НаКлиенте
Перем КлючМоегоКалендаря;
&НаКлиенте
Перем ИмяМоегоКалендаря;

&НаКлиенте
Процедура СоздатьСвойКалендарь(Команда)
    ПроверитьСобственнуюУчебнуюКонфигурацию();
    Если КлючМоегоКалендаря <> Неопределено Тогда
        ВызватьИсключение "Свой ключ уже сохранён: не создаём дубликат";
    КонецЕсли;
    Если ПодтверждениеУчебногоДействия <> "СОЗДАТЬ МОЙ УЧЕБНЫЙ КАЛЕНДАРЬ" Тогда
        ВызватьИсключение "Подтвердите создание только в отдельном локальном учебном профиле";
    КонецЕсли;
    Менеджер = Новый МенеджерКалендарей;
    Если Не Менеджер.ПоддерживаетсяДобавлениеКалендарей() Тогда
        ВызватьИсключение "Добавление календарей не поддерживается";
    КонецЕсли;
    ЛокальнаяЗапись = Менеджер.ПолучитьЛокальнуюУчетнуюЗаписьКалендарей();
    ИмяМоегоКалендаря = "guide-owned-calendar-" + Строка(Новый УникальныйИдентификатор);
    Данные = Новый ДанныеКалендаря(ИмяМоегоКалендаря);
    Данные.Цвет = Новый Цвет(40, 90, 180);
    ДанныеЗаписи = Новый ДанныеКалендаряУчетнойЗаписи(Данные, ЛокальнаяЗапись, "");
    Сообщить(ДанныеЗаписи.ДанныеКалендаря.Имя = ИмяМоегоКалендаря);
    Сообщить(ДанныеЗаписи.УчетнаяЗапись.Идентификатор = ЛокальнаяЗапись.Идентификатор);
    Сообщить(ПустаяСтрока(ДанныеЗаписи.ГлобальныйКлючКалендаря));
    ПодтверждениеУчебногоДействия = "";
    КлючМоегоКалендаря = Менеджер.ДобавитьКалендарь(ДанныеЗаписи);
    Карточка = ПолучитьИПроверитьСвойКалендарь(Менеджер);
    Сообщить(Карточка.ДанныеКалендаря.Имя = ИмяМоегоКалендаря);
    Сообщить("Создан только собственный календарь: " + ИмяМоегоКалендаря);
КонецПроцедуры

&НаКлиенте
Процедура ПереименоватьСвойКалендарь(Команда)
    ПроверитьСобственнуюУчебнуюКонфигурацию();
    Если ПодтверждениеУчебногоДействия <> "ПЕРЕИМЕНОВАТЬ МОЙ УЧЕБНЫЙ КАЛЕНДАРЬ" Тогда
        ВызватьИсключение "Нужно подтверждение переименования собственного календаря";
    КонецЕсли;
    Менеджер = Новый МенеджерКалендарей;
    Карточка = ПолучитьИПроверитьСвойКалендарь(Менеджер);
    Если Не Менеджер.ПоддерживаетсяИзменениеКалендаря(КлючМоегоКалендаря) Тогда
        ВызватьИсключение "Изменение собственного календаря не поддерживается";
    КонецЕсли;
    НовоеИмя = ИмяМоегоКалендаря + "-переименован";
    НовыеДанные = Новый ДанныеКалендаря(НовоеИмя);
    НовыеДанные.Цвет = Карточка.ДанныеКалендаря.Цвет;
    НоваяКарточка = Новый ДанныеКалендаряУчетнойЗаписи(НовыеДанные, Карточка.УчетнаяЗапись, Карточка.ГлобальныйКлючКалендаря);
    ПодтверждениеУчебногоДействия = "";
    Менеджер.ИзменитьКалендарь(Карточка, НоваяКарточка);
    ИмяМоегоКалендаря = НовоеИмя;
    ПровереннаяКарточка = ПолучитьИПроверитьСвойКалендарь(Менеджер);
    Сообщить(ПровереннаяКарточка.ДанныеКалендаря.Имя = НовоеИмя);
    Сообщить("Новое собственное имя: " + ИмяМоегоКалендаря);
КонецПроцедуры

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

&НаКлиенте
Функция ПолучитьИПроверитьСвойКалендарь(Менеджер)
    Если КлючМоегоКалендаря = Неопределено Или ПустаяСтрока(ИмяМоегоКалендаря) Тогда
        ВызватьИсключение "Нет ключа календаря, созданного именно этой формой";
    КонецЕсли;
    Карточка = Менеджер.ПолучитьКалендарь(КлючМоегоКалендаря);
    Если Карточка.ДанныеКалендаря.Имя <> ИмяМоегоКалендаря Тогда
        ВызватьИсключение "Имя собственного календаря изменилось; автоматическое изменение запрещено";
    КонецЕсли;
    ЛокальнаяЗапись = Менеджер.ПолучитьЛокальнуюУчетнуюЗаписьКалендарей();
    Если Карточка.УчетнаяЗапись.Идентификатор <> ЛокальнаяЗапись.Идентификатор
        Или Карточка.УчетнаяЗапись.ИсточникУчетнойЗаписи <> ЛокальнаяЗапись.ИсточникУчетнойЗаписи Тогда
        ВызватьИсключение "Календарь не относится к локальной учебной записи";
    КонецЕсли;
    Возврат Карточка;
КонецФункции

&НаСервереБезКонтекста
Процедура ПроверитьСобственнуюУчебнуюКонфигурацию()
КонецПроцедуры

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

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

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

  3. ДанныеКалендаряУчетнойЗаписи объединяет данные, реальную локальную запись и строковый глобальный ключ. Для нового локального календаря глобальный ключ пуст; ключ результата ДобавитьКалендарь хранится отдельно.

  4. Первый параметр ИзменитьКалендарь — полученные ДанныеКалендаряУчетнойЗаписи, не локальный ключ. Второй — новые данные той же записи.

  5. Переименование разрешено только ключу, полученному собственным созданием, после совпадения имени и локальной записи. Ошибки не перехватываются и не превращаются в успех.

  6. Перед удалением пустой ОтборКомпоновкиДанных читает события только собственного календаря. Любое событие запрещает удаление; другие календари не перебираются.

  7. Закройте форму только после проверки и удаления своего пустого календаря: ключ хранится в памяти формы. Если ключ потерян, не ищите календарь по префиксу для автоматического удаления.

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

  1. Создание: четыре проверки Истина и уникальное собственное имя. Переименование: Истина и новое имя; вручную сверяйте оба этапа в ОС.

  2. Повторное создание в той же форме запрещено. Удаление календаря с любым событием запрещено. После удаления пустого собственного календаря проверка отсутствия по точному имени Истина.

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

Полный жизненный цикл только собственного локального пустого календаря с сохранением выданного ОС ключа.

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

  1. Это реальная запись/удаление календаря при ручном запуске, не обратимая транзакция 1С. Рецепт не выполнялся инструментами.

  2. Между проверкой пустоты и удалением может появиться событие: отдельный изолированный учебный профиль обязателен; код не блокирует ОС.

  3. Если ОС выполнила операцию, но вернула ошибку, не повторяйте её вслепую: сначала вручную проверьте собственный календарь.

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

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

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

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

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

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