В своей будущей новой пустой базе создать две специальные записи каталога, получить их настоящие ссылки и удалить ровно одну через УдалениеОбъекта. Параметры обмена и штатный отказ проверяются, а новая выборка подтверждает сохранение второй записи.
Где и как запускать
Тонкий управляемый клиент своей новой File ИБ 8.5.1.1343; каталог, параметры обмена и реальное удаление только на сервере собственной формы/объекта.
Подготовка
Это будущая новая одноразовая Windows VM и новая пустая File ИБ C:\1c-labs\OwnObjectDeletion5_f46c2033-195e-4f18-ae43-0a85e785edab\IB. Сейчас база, CF и записи не создавались, 1С не запускалась. Никакие рабочие УТ/КА/УНФ/БП, чужие ссылки или ранее существовавшие записи не допускаются.
В новой CF: Имя = УчебноеУдаление85; Версия = OwnObjectDeletion5_5f7ee7e0-a82a-4b98-a9db-2c3bc169da95; платформа 8.5.1.1343; основной режим — управляемое приложение; русский встроенный язык; совместимость — НеИспользовать. Единственный свой пользователь, одна связь с базой и одна роль УчебноеУдаление85Администратор с чтением, добавлением и удалением собственного справочника и доступом к собственной форме. Без других каталогов, расширений, заданий, подписок, общих реквизитов, обменных узлов и внешних соединений.
Справочники → УчебныеУдаления85: неиерархический, без владельцев, предопределенных элементов, дополнительных реквизитов и табличных частей. Код — Строка, длина 9, автоматическая нумерация включена; Наименование — Строка, длина 100. Справочник пустой; две записи создаст сам код, вручную их не добавлять.
УчебныеУдаления85 → Открыть модуль объекта: вставьте целиком отдельный блок «УчебныеУдаления85: модуль объекта» ниже. ПередУдалением — штатная процедура с одним параметром Отказ, без &НаКлиенте. Она не должна разрешать уже запрещенное удаление. Не вызывайте ее вручную из кода.
Общие → Общие формы → УчебноеУдаление85: своя управляемая форма. Реквизиты только Согласие85 / Булево / исходно Ложь, Протокол85 / неограниченная Строка, Остановка85 / Булево / исходно Ложь. Согласие85 — флажок с подписью «Разрешаю необратимо удалить одну собственную тестовую запись»; Протокол85 — многострочное поле только просмотра; Остановка85 скрыт. В свойствах формы вручную задайте СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать — значения перечислений, не Булево.
Добавьте одну команду ВыполнитьУчебноеУдаление85, действие с тем же именем, и настоящую кнопку. В модуль формы вставьте основной код целиком; свяжите ПриСозданииНаСервере с одноименной процедурой, сохранив Отказ и СтандартнаяОбработка. Создайте штатный обработчик команды, сохранив Команда.
Конфигурация → Открыть модуль управляемого приложения: вставьте полностью отдельный блок «УправляемоеПриложение» ниже. В будущем проверьте собственную конфигурацию, обновите свою новую базу и запустите тонкий клиент. Первое открытие лишь показывает предупреждение; ничего не записывает.
После проверки, что это именно ваша новая пустая лаборатория, прочитайте предупреждение, установите Согласие85 и один раз нажмите команду. Сервер после проверки согласия и пустого каталога сбрасывает согласие и останавливает текущую форму до создания объектов и первой записи. Будут записаны УдалитьТолькоЭтуЗапись85 и СохранитьЭтуЗапись85. Только первая запись будет действительно удалена, а не помечена на удаление. Отмена/восстановление в уроке отсутствуют.
Ожидается отчет 0 → 2 → 1 и фактическое имя СохранитьЭтуЗапись85. Исходный флаг Загрузка читается фактически, его значение по умолчанию не обещано; перед удалением подтверждается Истина. Документация говорит, что эти параметры используются при удалении, но передача конкретного флага в обработчик здесь не проверена запуском: если обработчик увидит неверный флаг, он откажет, а итоговая проверка остановит урок.
Успех и любая ошибка останавливают текущую форму. Согласие расходуется до первой записи; повторный вход через эту же форму должен дать отказ, а не новую попытку. Это не гарантия атомарности или защиты от одновременных вызовов. После ошибки собственная лаборатория может содержать частичные записи или уже выполненное удаление; повтор, очистка в обработчике ошибки и автоматический откат не предусмотрены. Для повторного учебного опыта нужна отдельно заранее подготовленная новая одноразовая лаборатория, не обход Остановка85.
&НаСервере
Процедура ПроверитьСтенд85()
Система = Новый СистемнаяИнформация;
Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Тогда
ВызватьИсключение "Нужна собственная лаборатория на платформе 8.5.1.1343";
КонецЕсли;
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnObjectDeletion5_f46c2033-195e-4f18-ae43-0a85e785edab\IB"";" Или ИмяФормы <> "ОбщаяФорма.УчебноеУдаление85" Тогда
ВызватьИсключение "Запрещена работа вне своей новой одноразовой базы и формы";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Справочники.Найти("УчебныеУдаления85") = Неопределено
Или ТипЗнч(Согласие85) <> Тип("Булево") Или ТипЗнч(Остановка85) <> Тип("Булево") Или ТипЗнч(Протокол85) <> Тип("Строка") Тогда
ВызватьИсключение "Неверна собственная подготовка каталога или формы";
КонецЕсли;
Если Остановка85 Тогда
ВызватьИсключение "Текущая форма остановлена; повтор операции запрещен";
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПрочитатьСвойКаталог85()
Менеджер = Справочники.УчебныеУдаления85;
Если ТипЗнч(Менеджер) <> Тип("СправочникМенеджер.УчебныеУдаления85") Тогда
ВызватьИсключение "Не получен менеджер собственного справочника";
КонецЕсли;
Выборка = Менеджер.Выбрать();
Если ТипЗнч(Выборка) <> Тип("СправочникВыборка.УчебныеУдаления85") Тогда
ВызватьИсключение "Не получена собственная выборка";
КонецЕсли;
Снимок = Новый Структура("Количество,Удаляемая,Сохраняемая,ИмяСохраняемой", 0, Неопределено, Неопределено, "");
Пока Выборка.Следующий() Цикл
Если Снимок.Количество >= 2 Тогда
ВызватьИсключение "В своем каталоге больше двух учебных записей";
КонецЕсли;
Имя = Выборка.Наименование;
Ссылка = Выборка.Ссылка;
Если ТипЗнч(Имя) <> Тип("Строка") Или ТипЗнч(Ссылка) <> Тип("СправочникСсылка.УчебныеУдаления85") Тогда
ВызватьИсключение "Неверные типы фактической записи";
КонецЕсли;
Если Ссылка.Пустая() Тогда
ВызватьИсключение "В выборке получена пустая ссылка";
КонецЕсли;
Если Имя = "УдалитьТолькоЭтуЗапись85" И Снимок.Удаляемая = Неопределено Тогда
Снимок.Удаляемая = Ссылка;
ИначеЕсли Имя = "СохранитьЭтуЗапись85" И Снимок.Сохраняемая = Неопределено Тогда
Снимок.Сохраняемая = Ссылка;
Снимок.ИмяСохраняемой = Имя;
Иначе
ВызватьИсключение "Обнаружена лишняя или повторяющаяся собственная запись";
КонецЕсли;
Снимок.Количество = Снимок.Количество + 1;
КонецЦикла;
Возврат Снимок;
КонецФункции
&НаСервере
Функция ВыполнитьУдалениеНаСервере85()
ПроверитьСтенд85();
Если Не Согласие85 Тогда
ВызватьИсключение "Сначала подтвердите необратимое удаление своей тестовой записи";
КонецЕсли;
ДоСоздания = ПрочитатьСвойКаталог85();
Если ДоСоздания.Количество <> 0 Тогда
ВызватьИсключение "Только пустой собственный каталог; повтор и удаление старых данных запрещены";
КонецЕсли;
Согласие85 = Ложь;
Остановка85 = Истина;
Удаляемый = Справочники.УчебныеУдаления85.СоздатьЭлемент();
Сохраняемый = Справочники.УчебныеУдаления85.СоздатьЭлемент();
Если ТипЗнч(Удаляемый) <> Тип("СправочникОбъект.УчебныеУдаления85") Или ТипЗнч(Сохраняемый) <> Тип("СправочникОбъект.УчебныеУдаления85") Тогда
ВызватьИсключение "Не получены два собственных новых объекта";
КонецЕсли;
Удаляемый.Наименование = "УдалитьТолькоЭтуЗапись85";
Сохраняемый.Наименование = "СохранитьЭтуЗапись85";
Удаляемый.Записать();
СсылкаУдаляемого = Удаляемый.Ссылка;
Сохраняемый.Записать();
СсылкаСохраняемого = Сохраняемый.Ссылка;
Если ТипЗнч(СсылкаУдаляемого) <> Тип("СправочникСсылка.УчебныеУдаления85") Или ТипЗнч(СсылкаСохраняемого) <> Тип("СправочникСсылка.УчебныеУдаления85") Тогда
ВызватьИсключение "Не получены собственные ссылки после записи";
КонецЕсли;
Если СсылкаУдаляемого.Пустая() Или СсылкаСохраняемого.Пустая() Или СсылкаУдаляемого = СсылкаСохраняемого Тогда
ВызватьИсключение "Нужны две различные непустые реальные ссылки";
КонецЕсли;
ПередУдалением = ПрочитатьСвойКаталог85();
Если ПередУдалением.Количество <> 2 Или ПередУдалением.Удаляемая <> СсылкаУдаляемого Или ПередУдалением.Сохраняемая <> СсылкаСохраняемого Тогда
ВызватьИсключение "Фактические две записи не совпали с только что созданными";
КонецЕсли;
Удаление = Новый УдалениеОбъекта(СсылкаУдаляемого);
Если ТипЗнч(Удаление) <> Тип("УдалениеОбъекта") Или ТипЗнч(Удаление.Ссылка) <> Тип("СправочникСсылка.УчебныеУдаления85") Или Удаление.Ссылка <> СсылкаУдаляемого Тогда
ВызватьИсключение "Удаление должно указывать только на свою только что созданную запись";
КонецЕсли;
Параметры = Удаление.ОбменДанными;
Если ТипЗнч(Параметры) <> Тип("ПараметрыОбменаДанными") Или ТипЗнч(Параметры.Загрузка) <> Тип("Булево") Тогда
ВызватьИсключение "Не получены настоящие параметры удаления";
КонецЕсли;
ИсходнаяЗагрузка = Параметры.Загрузка;
Параметры.Загрузка = Истина;
ФактическаяЗагрузка = Удаление.ОбменДанными.Загрузка;
Если ТипЗнч(ФактическаяЗагрузка) <> Тип("Булево") Или Не ФактическаяЗагрузка Тогда
ВызватьИсключение "Флаг Загрузка не подтвержден до удаления";
КонецЕсли;
Удаление.Записать();
ПослеУдаления = ПрочитатьСвойКаталог85();
Если ПослеУдаления.Количество <> 1 Или ПослеУдаления.Удаляемая <> Неопределено Или ПослеУдаления.Сохраняемая <> СсылкаСохраняемого
Или ПослеУдаления.ИмяСохраняемой <> "СохранитьЭтуЗапись85" Тогда
ВызватьИсключение "Удаление не подтверждено новой выборкой собственного каталога";
КонецЕсли;
Возврат "До создания: " + Строка(ДоСоздания.Количество) + "; перед удалением: " + Строка(ПередУдалением.Количество)
+ "; после удаления: " + Строка(ПослеУдаления.Количество) + Символы.ПС + "Сохранилось: " + ПослеУдаления.ИмяСохраняемой
+ Символы.ПС + "Загрузка до операции: " + Строка(ИсходнаяЗагрузка) + " → " + Строка(ФактическаяЗагрузка);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТипЗнч(Отказ) <> Тип("Булево") Или ТипЗнч(СтандартнаяОбработка) <> Тип("Булево") Тогда
ВызватьИсключение "Неверные штатные параметры создания формы";
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
Попытка
ПроверитьСтенд85();
Протокол85 = "Операция необратима: будут созданы две собственные тестовые записи, одна будет удалена. Подтвердите согласие только в новой одноразовой лаборатории.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьУчебноеУдаление85(Команда)
Если ТипЗнч(Остановка85) <> Тип("Булево") Или Остановка85 Тогда
ВызватьИсключение "Повтор операции в текущей форме запрещен";
КонецЕсли;
Попытка
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ВыполнитьУчебноеУдаление85" Или Команда.Действие <> "ВыполнитьУчебноеУдаление85" Тогда
ВызватьИсключение "Нужна настоящая собственная команда формы";
КонецЕсли;
Протокол = ВыполнитьУдалениеНаСервере85();
Если ТипЗнч(Протокол) <> Тип("Строка") Тогда
ВызватьИсключение "Не получен проверенный строковый результат";
КонецЕсли;
Протокол85 = Протокол;
Остановка85 = Истина;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыШтатный отказ перед удалением собственной записи
Справочники → УчебныеУдаления85 → Открыть модуль объекта
Сервер; модуль объекта своего каталога
Процедура ПередУдалением(Отказ)
Если ТипЗнч(Отказ) <> Тип("Булево") Тогда
ВызватьИсключение "Неверный штатный параметр отказа";
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnObjectDeletion5_f46c2033-195e-4f18-ae43-0a85e785edab\IB"";" Или Наименование <> "УдалитьТолькоЭтуЗапись85" Или ТипЗнч(Ссылка) <> Тип("СправочникСсылка.УчебныеУдаления85") Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Если ТипЗнч(ОбменДанными) <> Тип("ПараметрыОбменаДанными") Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Если ТипЗнч(ОбменДанными.Загрузка) <> Тип("Булево") Или Не ОбменДанными.Загрузка Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедурыПроверка версии и штатное открытие собственной формы
Конфигурация → Открыть модуль управляемого приложения
Тонкий управляемый клиент
Процедура ПриНачалеРаботыСистемы()
Система = Новый СистемнаяИнформация;
Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Тогда
ВызватьИсключение "Нужна платформа 8.5.1.1343";
КонецЕсли;
#Если ТонкийКлиент Тогда
ОткрытьФорму("ОбщаяФорма.УчебноеУдаление85");
#Иначе
ВызватьИсключение "Запускайте собственную лабораторию в тонком управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовить только свою новую лабораторию, пустой собственный каталог, роль, форму и все три полных модуля. Не применять пример к рабочим ссылкам.
В настоящем открытии формы прочитать необратимое предупреждение; явно дать согласие до первой записи и нажать свою команду один раз.
Получить через СоздатьЭлемент и Записать два собственных объекта и их действительные различные ссылки. Свежей выборкой проверить обе записи до удаления.
Создать УдалениеОбъекта на основании только удержанной ссылки первой записи; прочитать readonly Ссылка/ОбменДанными. Установить и проверить настоящий флаг Загрузка до единственного вызова Записать.
Штатный ПередУдалением должен сохранять предыдущий отказ и проверять собственное имя/контекст/флаг. После вызова получить новую выборку и показать фактическое сохранение второй записи.
Как проверить результат
При открытии нет записей; до первой записи требуется Согласие85. Будущий отчет должен показать реальные количества 0, 2, 1, а не заранее напечатанные числа.
Перед удалением две ссылки непустые, различные и равны ссылкам двух фактических собственных строк. Удаление.Ссылка равна только ссылке УдалитьТолькоЭтуЗапись85.
ОбменДанными — настоящий ПараметрыОбменаДанными; саму readonly ссылку на параметры не заменяют. Загрузка имеет фактический тип Булево и Истина до Записать. Нельзя предполагать, что она отключает все обработчики или проверки.
Новая выборка содержит ровно СохранитьЭтуЗапись85 с прежней удержанной ссылкой; удаляемая ссылка отсутствует. Не читать удаленную ссылку как существующий объект и не подменять выборку старым снимком.
При желании в будущей собственной лаборатории поставьте точку останова в ПередУдалением и посмотрите фактические Наименование, ОбменДанными.Загрузка, Отказ. Если реальный флаг неверен или был отказ, успех не объявлять. Сейчас это не наблюдалось в 1С.
Ожидаемый результат
Ожидаемый будущий результат: только в новой своей лаборатории записаны две учебные записи, одна действительно удалена; новая выборка подтверждает вторую по реальной ссылке и имени. Протокол содержит фактические количества и значение флага до удаления.
На что обратить внимание
Записать у УдалениеОбъекта действительно удаляет объект базы данных. Это не запись описания, не регистрация-only, не установка пометки и не обратимая операция.
Конструктор с названием По умолчанию требует один параметр — настоящую ссылку. Нет примера Новый УдалениеОбъекта() или конструктора ПараметрыОбменаДанными; пустая/чужая ссылка запрещена.
Загрузка = Истина означает минимум проверок при обмене, не безопасность и не универсальное разрешение удаления. Параметры используются при удалении по контракту, но фактическая передача в callback остается будущей проверкой; неверный флаг должен дать отказ.
Справка предупреждает: безопасный режим на время ПередУдалением отключен, с отдельной оговоркой для обработчиков расширения. Собственный обработчик не выполняет произвольный код, сеть, привилегированные действия или работу с чужими данными.
Имена, версия, путь и пустой каталог — проверки конкретной подготовки, не доказательство владения. Ее вручную выполняет владелец новой одноразовой лаборатории; ошибка может оставить частичные записи или удаление, автоматического rollback/retry/cleanup нет.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.