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