УдалениеОбъекта.Записать

Методы · Write

Удаляет объект базы данных, на который "указывает" ссылка, содержащаяся в данном объекте.

Синтаксис

Записать()
Полное описание, параметры и ограничения

УдалениеОбъекта.Записать (ObjectDeletion.Write)

УдалениеОбъекта (ObjectDeletion)

Записать (Write)

Доступен, начиная с версии 8.0.

Синтаксис:
Записать()
Описание:

Удаляет объект базы данных, на который "указывает" ссылка, содержащаяся в данном объекте.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

УдалениеОбъекта: применить удаление только своей новой тестовой записи

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

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

Тонкий управляемый клиент своей новой File ИБ 8.5.1.1343; каталог, параметры обмена и реальное удаление только на сервере собственной формы/объекта.

Подготовка

  1. Это будущая новая одноразовая Windows VM и новая пустая File ИБ C:\1c-labs\OwnObjectDeletion5_f46c2033-195e-4f18-ae43-0a85e785edab\IB. Сейчас база, CF и записи не создавались, 1С не запускалась. Никакие рабочие УТ/КА/УНФ/БП, чужие ссылки или ранее существовавшие записи не допускаются.

  2. В новой CF: Имя = УчебноеУдаление85; Версия = OwnObjectDeletion5_5f7ee7e0-a82a-4b98-a9db-2c3bc169da95; платформа 8.5.1.1343; основной режим — управляемое приложение; русский встроенный язык; совместимость — НеИспользовать. Единственный свой пользователь, одна связь с базой и одна роль УчебноеУдаление85Администратор с чтением, добавлением и удалением собственного справочника и доступом к собственной форме. Без других каталогов, расширений, заданий, подписок, общих реквизитов, обменных узлов и внешних соединений.

  3. Справочники → УчебныеУдаления85: неиерархический, без владельцев, предопределенных элементов, дополнительных реквизитов и табличных частей. Код — Строка, длина 9, автоматическая нумерация включена; Наименование — Строка, длина 100. Справочник пустой; две записи создаст сам код, вручную их не добавлять.

  4. УчебныеУдаления85 → Открыть модуль объекта: вставьте целиком отдельный блок «УчебныеУдаления85: модуль объекта» ниже. ПередУдалением — штатная процедура с одним параметром Отказ, без &НаКлиенте. Она не должна разрешать уже запрещенное удаление. Не вызывайте ее вручную из кода.

  5. Общие → Общие формы → УчебноеУдаление85: своя управляемая форма. Реквизиты только Согласие85 / Булево / исходно Ложь, Протокол85 / неограниченная Строка, Остановка85 / Булево / исходно Ложь. Согласие85 — флажок с подписью «Разрешаю необратимо удалить одну собственную тестовую запись»; Протокол85 — многострочное поле только просмотра; Остановка85 скрыт. В свойствах формы вручную задайте СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать — значения перечислений, не Булево.

  6. Добавьте одну команду ВыполнитьУчебноеУдаление85, действие с тем же именем, и настоящую кнопку. В модуль формы вставьте основной код целиком; свяжите ПриСозданииНаСервере с одноименной процедурой, сохранив Отказ и СтандартнаяОбработка. Создайте штатный обработчик команды, сохранив Команда.

  7. Конфигурация → Открыть модуль управляемого приложения: вставьте полностью отдельный блок «УправляемоеПриложение» ниже. В будущем проверьте собственную конфигурацию, обновите свою новую базу и запустите тонкий клиент. Первое открытие лишь показывает предупреждение; ничего не записывает.

  8. После проверки, что это именно ваша новая пустая лаборатория, прочитайте предупреждение, установите Согласие85 и один раз нажмите команду. Сервер после проверки согласия и пустого каталога сбрасывает согласие и останавливает текущую форму до создания объектов и первой записи. Будут записаны УдалитьТолькоЭтуЗапись85 и СохранитьЭтуЗапись85. Только первая запись будет действительно удалена, а не помечена на удаление. Отмена/восстановление в уроке отсутствуют.

  9. Ожидается отчет 0 → 2 → 1 и фактическое имя СохранитьЭтуЗапись85. Исходный флаг Загрузка читается фактически, его значение по умолчанию не обещано; перед удалением подтверждается Истина. Документация говорит, что эти параметры используются при удалении, но передача конкретного флага в обработчик здесь не проверена запуском: если обработчик увидит неверный флаг, он откажет, а итоговая проверка остановит урок.

  10. Успех и любая ошибка останавливают текущую форму. Согласие расходуется до первой записи; повторный вход через эту же форму должен дать отказ, а не новую попытку. Это не гарантия атомарности или защиты от одновременных вызовов. После ошибки собственная лаборатория может содержать частичные записи или уже выполненное удаление; повтор, очистка в обработчике ошибки и автоматический откат не предусмотрены. Для повторного учебного опыта нужна отдельно заранее подготовленная новая одноразовая лаборатория, не обход Остановка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");
    #Иначе
        ВызватьИсключение "Запускайте собственную лабораторию в тонком управляемом клиенте";
    #КонецЕсли
КонецПроцедуры

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

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

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

  3. Получить через СоздатьЭлемент и Записать два собственных объекта и их действительные различные ссылки. Свежей выборкой проверить обе записи до удаления.

  4. Создать УдалениеОбъекта на основании только удержанной ссылки первой записи; прочитать readonly Ссылка/ОбменДанными. Установить и проверить настоящий флаг Загрузка до единственного вызова Записать.

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

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

  1. При открытии нет записей; до первой записи требуется Согласие85. Будущий отчет должен показать реальные количества 0, 2, 1, а не заранее напечатанные числа.

  2. Перед удалением две ссылки непустые, различные и равны ссылкам двух фактических собственных строк. Удаление.Ссылка равна только ссылке УдалитьТолькоЭтуЗапись85.

  3. ОбменДанными — настоящий ПараметрыОбменаДанными; саму readonly ссылку на параметры не заменяют. Загрузка имеет фактический тип Булево и Истина до Записать. Нельзя предполагать, что она отключает все обработчики или проверки.

  4. Новая выборка содержит ровно СохранитьЭтуЗапись85 с прежней удержанной ссылкой; удаляемая ссылка отсутствует. Не читать удаленную ссылку как существующий объект и не подменять выборку старым снимком.

  5. При желании в будущей собственной лаборатории поставьте точку останова в ПередУдалением и посмотрите фактические Наименование, ОбменДанными.Загрузка, Отказ. Если реальный флаг неверен или был отказ, успех не объявлять. Сейчас это не наблюдалось в 1С.

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

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

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

  1. Записать у УдалениеОбъекта действительно удаляет объект базы данных. Это не запись описания, не регистрация-only, не установка пометки и не обратимая операция.

  2. Конструктор с названием По умолчанию требует один параметр — настоящую ссылку. Нет примера Новый УдалениеОбъекта() или конструктора ПараметрыОбменаДанными; пустая/чужая ссылка запрещена.

  3. Загрузка = Истина означает минимум проверок при обмене, не безопасность и не универсальное разрешение удаления. Параметры используются при удалении по контракту, но фактическая передача в callback остается будущей проверкой; неверный флаг должен дать отказ.

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

  5. Имена, версия, путь и пустой каталог — проверки конкретной подготовки, не доказательство владения. Ее вручную выполняет владелец новой одноразовой лаборатории; ошибка может оставить частичные записи или удаление, автоматического rollback/retry/cleanup нет.

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

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

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

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

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