ПланСчетовОбъект.<Имя плана счетов>.УстановитьПометкуУдаления

Методы · SetDeletionMark

Устанавливает/снимет пометку на удаление. Объект при этом не удаляется из базы данных. Окончательное удаление помеченных счетов происходит при удалении помеченных объектов.

Синтаксис

УстановитьПометкуУдаления(<ПометкаУдаления>, <ВключаяПодчиненные>)

Примеры платформы

Объект.УстановитьПометкуУдаления(Истина,Истина);
Полное описание, параметры и ограничения

ПланСчетовОбъект.<Имя плана счетов>.УстановитьПометкуУдаления (ChartOfAccountsObject.<Chart of accounts name>.SetDeletionMark)

ПланСчетовОбъект.<Имя плана счетов> (ChartOfAccountsObject.<Chart of accounts name>)

УстановитьПометкуУдаления (SetDeletionMark)

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

Синтаксис:
УстановитьПометкуУдаления(<ПометкаУдаления>, <ВключаяПодчиненные>)
Параметры:

<ПометкаУдаления> (обязательный)
Тип: Булево.
Признак установки / снятие пометки на удаление.
Истина - пометка будет установлена; Ложь - пометка будет снята.

<ВключаяПодчиненные> (необязательный)
Тип: Булево.
Если параметр установлен в Истина, то будут помечены на удаление, кроме данного элемента, все его подчиненные элементы в данном счете и во всех подчиненных счетах.
Если параметр установлен в Ложь, то будет помечен на удаление только данный элемент.
Значение по умолчанию: Истина.
Описание:

Устанавливает/снимет пометку на удаление. Объект при этом не удаляется из базы данных. Окончательное удаление помеченных счетов происходит при удалении помеченных объектов.

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

Сервер, толстый клиент, внешнее соединение.

Примечание:
Применение метода влечет инициирование события ПередЗаписью, т.к. происходит сохранение измененного свойства ПометкаУдаления.
Если объект модифицирован, то выполнение метода вызывает исключение.
Пример:

Объект.УстановитьПометкуУдаления(Истина,Истина);

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

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

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

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

Родительский счёт P и дочерний Q: пометка, каскадное удаление и откат

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

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

Полный обычный клиентский общий модуль УчебныеМенеджерыПланов85 → УчебныеМенеджеры85. Будущие записи только собственных P/Q/R с обязательным откатом; не выполнялся.

Подготовка

  1. Используйте НОВУЮ собственную файловую базу 8.5.1.1343 с именем конфигурации УчебныеМенеджерыПланов85, совместимость НеИспользовать, обычное приложение и толстый клиент. Нет расширений, разделителей, общих реквизитов, обработчиков, фоновых прикладных заданий и других сеансов, меняющих записи. Рабочие БП/КА2/УТ запрещены. Стенд и код здесь не запускались: runtimeVerifiedScenarios=0.

  2. Планы счетов → УчебныеСчета85: многоуровневый план, код Строка(10), маска пустая, наименование 100, уникальность кода включена, без предопределённых счетов, видов субконто и признаков учёта. Собственный реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать. Модули пустые.

  3. Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов, код Строка(10), наименование 100, тип характеристик только Строка(30), без предопределённых элементов. Реквизит УчебныйКлюч85: Строка(10), Индексировать, применяется к группам и элементам. Модули пустые.

  4. В обоих планах вручную подготовьте ровно четыре записи: G — код 01, наименование Учебный родитель, ключ G, пустой родитель; A — код 10, наименование Учебный верхний A, ключ A, пустой родитель; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, пустой родитель. Все записи обычные, не предопределённые, без пометки удаления. У характеристик G — группа, остальные элементы. У счетов G — родительский счёт, а не группа.

  5. В собственных счетах заранее вручную задайте Вид: G и A — Активный, B — Пассивный, C — АктивноПассивный. Забалансовый=Ложь, строк видов субконто нет. Сначала сохраните эту собственную подготовку. Код урока счёт не записывает и не проводит бухгалтерских операций.

  6. Общий модуль УчебныеМенеджеры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, остальные клиентские флаги=Нет. Вставьте полный основной модуль одного выбранного урока. Обработка УчебныеМенеджеры85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие. Полный модуль этой формы приведён отдельно.

  7. Для этого варианта разрешены БУДУЩИЕ реальные записи и удаление только своих новых P/Q/R. Все модули объектов/менеджеров пустые, в том числе ОбработкаЗаполнения из других уроков. Нет истории данных, подписок, расширений, обмена, регистров, внешних действий или других сеансов. Не рабочая база и не её копия.

  8. Перед запуском ровно G/A/B/C из подготовки; коды 90/91/92 и ключи P/Q/R свободны. Общий модуль заменяется целиком выбранным уроком. Создаваемые записи существуют лишь внутри своей транзакции, которая отменяется на успехе и обработанной ошибке. Здесь 1С не запускалась.

  9. Все три создаются СоздатьСчет. P — обычный родительский счёт, а не группа справочника; свойства ЭтоГруппа у него нет. Счета активные, балансовые, без субконто, проводок и регистров бухгалтерии.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвоюПодготовку();
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Не запускайте урок внутри чужой транзакции";
    КонецЕсли;
    СозданныеСсылки = Новый Массив;
    НачатьТранзакцию();
    Попытка
        Менеджер = ПланыСчетов.УчебныеСчета85;
        Для Номер = 0 По 2 Цикл
            Если Номер = 0 Тогда
                НовыйОбъект = Менеджер.СоздатьСчет();
            Иначе
                НовыйОбъект = Менеджер.СоздатьСчет();
            КонецЕсли;
            НовыйОбъект.Код = Строка(90 + Номер);
            Если Номер = 0 Тогда
                НовыйОбъект.УчебныйКлюч85 = "P";
                НовыйОбъект.Наименование = "Учебный временный родитель P";
            ИначеЕсли Номер = 1 Тогда
                НовыйОбъект.УчебныйКлюч85 = "Q";
                НовыйОбъект.Наименование = "Учебный временный ребёнок Q";
                НовыйОбъект.Родитель = СозданныеСсылки[0];
            Иначе
                НовыйОбъект.УчебныйКлюч85 = "R";
                НовыйОбъект.Наименование = "Учебный контроль отката R";
            КонецЕсли;
            НовыйОбъект.Вид = ВидСчета.Активный;
            НовыйОбъект.Забалансовый = Ложь;
            Если НовыйОбъект.ВидыСубконто.Количество() <> 0 Тогда
                ВызватьИсключение "Временные счета создаются без субконто";
            КонецЕсли;
            НовыйОбъект.Записать();
            Если НовыйОбъект.Ссылка.Пустая() Или НовыйОбъект.ЭтоНовый() Тогда
                ВызватьИсключение "Нужна настоящая собственная запись внутри своей транзакции";
            КонецЕсли;
            СозданныеСсылки.Добавить(НовыйОбъект.Ссылка);
        КонецЦикла;
        СвояP = СозданныеСсылки[0];
        СвояQ = СозданныеСсылки[1];
        СвояR = СозданныеСсылки[2];
        ПустойРодитель = Менеджер.ПустаяСсылка();
        РодительP = ПрочитатьСвойОбъект(СвояP, "P", ПустойРодитель, Ложь);
        ПрочитатьСвойОбъект(СвояQ, "Q", СвояP, Ложь);
        ПрочитатьСвойОбъект(СвояR, "R", ПустойРодитель, Ложь);
        РодительP.УстановитьПометкуУдаления(Истина, Ложь);
        РодительP = ПрочитатьСвойОбъект(СвояP, "P", ПустойРодитель, Истина);
        ПрочитатьСвойОбъект(СвояQ, "Q", СвояP, Ложь);
        Сообщить("Помечен только P; его собственный ребёнок Q не помечен и существует.");
        РодительP.УстановитьПометкуУдаления(Истина, Истина);
        РодительP = ПрочитатьСвойОбъект(СвояP, "P", ПустойРодитель, Истина);
        ПрочитатьСвойОбъект(СвояQ, "Q", СвояP, Истина);
        Сообщить("Теперь помечены P и Q; обе записи всё ещё существуют.");
        РодительP.УстановитьПометкуУдаления(Ложь, Истина);
        РодительP = ПрочитатьСвойОбъект(СвояP, "P", ПустойРодитель, Ложь);
        ПрочитатьСвойОбъект(СвояQ, "Q", СвояP, Ложь);
        РодительP.Удалить();
        Если СвояP.ПолучитьОбъект() <> Неопределено Или СвояQ.ПолучитьОбъект() <> Неопределено Тогда
            ВызватьИсключение "Прямое удаление собственного P должно удалить и собственного Q";
        КонецЕсли;
        ПрочитатьСвойОбъект(СвояR, "R", ПустойРодитель, Ложь);
        Сообщить("P и Q удалены напрямую. Корневой контроль R ещё существует до отмены транзакции.");
        ОтменитьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    Сообщить(Не ТранзакцияАктивна());
    Для Каждого СозданнаяСсылка Из СозданныеСсылки Цикл
        Сообщить(СозданнаяСсылка.ПолучитьОбъект() = Неопределено);
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Своя транзакция должна быть отменена";
    КонецЕсли;
    Для Каждого СозданнаяСсылка Из СозданныеСсылки Цикл
        Если СозданнаяСсылка.ПолучитьОбъект() <> Неопределено Тогда
            ВызватьИсключение "После отмены своих P/Q/R не должно быть в базе";
        КонецЕсли;
    КонецЦикла;
    ПроверитьСвоюПодготовку();
    Сообщить("Исходные G/A/B/C не изменены. Контрольная R исчезла именно после отката.");
КонецПроцедуры

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

    Возврат Объект;
КонецФункции

Процедура ПроверитьСвоюПодготовку()
    ПроверитьСвойКонтекст();
    Менеджер = ПланыСчетов.УчебныеСчета85;
    Родитель = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "G");
    Если Родитель.Пустая() Тогда
        ВызватьИсключение "Не подготовлен собственный родитель G";
    КонецЕсли;
    Коды = Новый Структура("G,A,B,C", "01", "10", "30", "20");
    Имена = Новый Структура("G,A,B,C", "Учебный родитель", "Учебный верхний A", "Учебный дочерний B", "Учебный верхний C");
    Ключи = Новый Массив;
    НачальныйУровень = Неопределено;
    Выборка = Менеджер.ВыбратьИерархически(,,"Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.УчебныйКлюч85;
        ОжидаемыйКод = Неопределено;
        ОжидаемоеИмя = Неопределено;
        Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя)
            Или Ключи.Найти(Ключ) <> Неопределено Тогда
            ВызватьИсключение "Лишняя запись или повтор своего учебного ключа";
        КонецЕсли;
        Ключи.Добавить(Ключ);
        Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя Тогда
            ВызватьИсключение "Не совпали код или имя собственной подготовки";
        КонецЕсли;
        Если Выборка.Ссылка.Пустая() Или Выборка.Ссылка <> Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", Ключ) Тогда
            ВызватьИсключение "Выборка должна указывать на ту же собственную записанную ссылку";
        КонецЕсли;
        ОжидаемыйРодитель = Менеджер.ПустаяСсылка();
        Если Ключ = "B" Тогда
            ОжидаемыйРодитель = Родитель;
        КонецЕсли;
        Если Выборка.Родитель <> ОжидаемыйРодитель Или Выборка.ПометкаУдаления
            Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> "" Тогда
            ВызватьИсключение "Нужны собственные обычные записи с подготовленной иерархией";
        КонецЕсли;
        ВерсияДо = Выборка.ВерсияДанных;
        Если ТипЗнч(ВерсияДо) <> Тип("Строка") Тогда
            ВызватьИсключение "ВерсияДанных выборки должна быть строкой, а не датой или бинарными данными";
        КонецЕсли;
        Уровень = Выборка.УровеньВВыборке();
        Если НачальныйУровень = Неопределено Тогда
            НачальныйУровень = Уровень;
        КонецЕсли;
        ОжидаемаяРазница = 0;
        Если Ключ = "B" Тогда
            ОжидаемаяРазница = 1;
        КонецЕсли;
        Если Уровень - НачальныйУровень <> ОжидаемаяРазница Тогда
            ВызватьИсключение "B должен быть на один уровень глубже корневых G/A/C";
        КонецЕсли;
        Виды = Новый Структура("G,A,B,C", ВидСчета.Активный, ВидСчета.Активный, ВидСчета.Пассивный, ВидСчета.АктивноПассивный);
        Если Выборка.Вид <> Виды[Ключ] Или Выборка.Забалансовый Тогда
            ВызватьИсключение "Не совпали подготовленные вид счёта или балансовый признак";
        КонецЕсли;
        Если Выборка.ВидыСубконто.Количество() <> 0 Тогда
            ВызватьИсключение "Этот план подготовлен без строк видов субконто";
        КонецЕсли;
        Если ТипЗнч(Выборка.Порядок) <> Тип("Строка") Тогда
            ВызватьИсключение "Порядок — служебная строка, не числовой индекс выборки";
        КонецЕсли;
        Если НачальныйУровень <> 0 Тогда
            ВызватьИсключение "В полной иерархической выборке счетов верхний уровень начинается с нуля";
        КонецЕсли;
        Сообщить("Вид: " + Строка(Выборка.Вид) + "; порядок: " + Выборка.Порядок + "; субконто: 0; забалансовый: нет");
        Объект = Выборка.ПолучитьОбъект();
        Если Объект = Неопределено Тогда
            ВызватьИсключение "ПолучитьОбъект может вернуть Неопределено для исчезнувшей записи";
        КонецЕсли;
        Если Объект.Наименование <> ОжидаемоеИмя Тогда
            ВызватьИсключение "Имя прочитанного объекта не совпало с подготовкой";
        КонецЕсли;
        Объект.Наименование = "Локальный черновик " + Ключ;
        Если Объект.Наименование = Выборка.Наименование Тогда
            ВызватьИсключение "Локальное изменение объекта не должно менять поле читаемой выборки";
        КонецЕсли;
        Повторная = Менеджер.Выбрать(,Новый Структура("УчебныйКлюч85", Ключ));
        Если Не Повторная.Следующий() Тогда
            ВызватьИсключение "Собственная запись исчезла при повторном чтении";
        КонецЕсли;
        Если Повторная.Наименование <> ОжидаемоеИмя Или Повторная.ВерсияДанных <> ВерсияДо Тогда
            ВызватьИсключение "Новое чтение не подтвердило отсутствие изменения собственной записи";
        КонецЕсли;
        Объект.Наименование = ОжидаемоеИмя;
        Сообщить(Ключ + ": " + Выборка.Код + " — " + Выборка.Наименование
            + "; уровень " + Строка(Уровень) + "; версия " + ВерсияДо + "; локальная правка не записана");
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "G,B,A,C" Тогда
        ВызватьИсключение "Нужен полный иерархический обход G,B,A,C";
    КонецЕсли;
    Дети = Менеджер.ВыбратьИерархически(Родитель,,"Код Возр");
    ЧислоДетей = 0;
    Пока Дети.Следующий() Цикл
        Если Дети.УчебныйКлюч85 <> "B" Или Дети.УровеньВВыборке() <> 0 Тогда
            ВызватьИсключение "В выборке внутри G единственный B находится на относительном уровне ноль";
        КонецЕсли;
        ЧислоДетей = ЧислоДетей + 1;
    КонецЦикла;
    Если ЧислоДетей <> 1 Тогда
        ВызватьИсключение "Внутри G должен быть ровно один собственный B";
    КонецЕсли;
    Сообщить("Все четыре паспорта проверены. Записать не вызывался; изменение объекта осталось в памяти.");
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры
УчебныеМенеджеры85.Пульт

УчебныеМенеджерыПланов85 → Обработки → УчебныеМенеджеры85 → Пульт → Модуль

Полный модуль своей обычной формы; не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеМенеджеры85.ВыполнитьПример();
КонецПроцедуры

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

  1. Полный паспорт исходных G/A/B/C проверяется до транзакции: все ключи, имена, родители и специфичные свойства должны совпасть. Guard проверяет собственную конфигурацию/версию и отсутствие чужой транзакции; внутри своей транзакции он не вызывается.

  2. Цикл создаёт только P/Q/R с кодами 90/91/92. Q получает настоящую ссылку уже записанного P. Ссылки сохраняем после Записать и проверяем непустоту/ЭтоНовый; плановый UUID не создаётся.

  3. Все три создаются СоздатьСчет. P — обычный родительский счёт, а не группа справочника; свойства ЭтоГруппа у него нет. Счета активные, балансовые, без субконто, проводок и регистров бухгалтерии.

  4. ПрочитатьСвойОбъект — местный проверяющий помощник для собственных сохранённых ссылок. Он проверяет nullable результат, конкретный тип, ключ, родителя, пометку и чистое состояние. Это не getter неизвестного ИсходныйОбъект.

  5. УстановитьПометкуУдаления(Истина, Ложь) сам записывает пометку P и вызывает ПередЗаписью; Q остаётся непомеченным. Оба реально перечитываются по собственным ссылкам. Метод требует немодифицированный объект.

  6. Второй параметр Истина распространяет пометку на подчинённые записи. Вызов (Истина, Истина) даёт пометку и P, и Q; (Ложь, Истина) снимает обе. На каждом шаге используются новые чистые объекты, проверка не ограничивается изменённой переменной в памяти.

  7. Пометка не удаляет записи. Прямое Удалить на свежем собственном P удаляет P и его собственный Q, даже после снятия пометок. Обе ссылки после этого должны давать Неопределено. Исходный G с ребёнком B не затрагивается.

  8. R — отдельная собственная корневая запись: она не входит в удаляемую ветку и проверяется существующей до отмены. Поэтому её последующее исчезновение доказывает смысл отката создания, а не лишь прямого удаления P/Q.

  9. На успехе и обработанной ошибке отменяем только свою транзакцию; фиксации нет. После успеха активной транзакции быть не должно, P/Q/R отсутствуют, полный паспорт исходных четырёх записей совпадает.

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

  1. Будущий ручной тест: F7, собственная новая база и Пульт обычного толстого клиента. Только заранее подготовленные G/A/B/C; этот урок и база здесь не запускались.

  2. Первый шаг: P=True, Q=False. Второй: P=True, Q=True. Третий: обе пометки False. На всех трёх шагах P/Q ещё существуют и читаются из базы внутри своей транзакции.

  3. После прямого удаления P/Q отсутствуют; R до отмены существует. После отмены отсутствуют все три, исходные G/A/B/C неизменны и собственной активной транзакции нет.

  4. Любая ошибка чтения, записи, пометки, удаления или отмены означает неуспешный опыт. Если отмена дала ошибку, нельзя объявлять данные восстановленными.

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

Будущий результат: видна разница пометки и удаления иерархии, собственная R подтверждает отмену создания; итоговый состав G/A/B/C прежний. Runtime-проверка не выполнялась.

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

  1. Прямое удаление действует сразу, каскадно и без проверки ссылочной целостности. Это не руководство по очистке рабочей базы; удалить можно только новую ветку этого собственного опыта.

  2. Откат не делает рабочую базу безопасной песочницей и не отменяет внешние действия/служебные следы. Поэтому обработчиков, истории, обмена и внешних эффектов в стенде заранее нет.

  3. ВключаяПодчиненные по умолчанию Истина; в уроке оба значения переданы явно. Не путайте изменение ПометкаУдаления в памяти с методом, который сохраняет его.

  4. Исходные G/A/B/C никогда не являются адресатами Записать/Удалить/пометки. После завершения для всех своих временных ссылок выполняются утверждения, а не только сообщения.

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

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

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

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

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