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

Методы · Delete

Удаляет объект из базы данных.

Синтаксис

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

ПланВидовРасчетаОбъект.<Имя плана видов расчета>.Удалить (ChartOfCalculationTypesObject.<Chart of calculation types name>.Delete)

ПланВидовРасчетаОбъект.<Имя плана видов расчета> (ChartOfCalculationTypesObject.<Chart of calculation types name>)

Удалить (Delete)

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

Синтаксис:
Удалить()
Описание:

Удаляет объект из базы данных.

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

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

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

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

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

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

Временный вид D: запись, пометка, прямое удаление и контроль отката E

Создаём только собственные новые D/E в своей транзакции. Различаем сохранение, пометку и непосредственное удаление; контрольная E подтверждает смысл отката.

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

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

Подготовка

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

  2. План видов расчёта Уч85Начисления: Код Строка(10), переменная длина, наименование 100, уникальность кода включена. ИспользованиеПериодаДействия=Да, ЗависимостьОтВидовРасчета=ПоПериодуДействия, в базовых планах только сам Уч85Начисления. Собственный реквизит Уч85Ключ Строка(8), Индексировать. Нет предопределённых элементов, общих реквизитов, разделителей, регистров расчёта или расчётных алгоритмов. Модули пустые.

  3. В стандартном списке своего плана вручную создайте ровно три обычных вида: A — код 10, имя Учебный оклад, ключ A, ПериодДействияБазовый=Истина; B — код 20, имя Учебная премия, ключ B, ПериодДействияБазовый=Ложь; C — код 30, имя Учебное отсутствие, ключ C, ПериодДействияБазовый=Ложь. Все без пометки удаления и не предопределённые.

  4. У B вручную заполните три стандартные таблицы: БазовыеВидыРасчета содержит только ссылку A; ВедущиеВидыРасчета только A; ВытесняющиеВидыРасчета только C. У A/C все три таблицы пустые. Сохраните только эту собственную подготовку. Это технический граф связей, не утверждённая методика начисления зарплаты.

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

  6. Создайте собственную обработку УчебныеВиды85 с обычной основной формой Пульт. Кнопка Выполнить, действие ВыполнитьНажатие; отдельный полный модуль формы приведён ниже. F7 и обновление только своего стенда, запуск Пульта в толстом клиенте.

  7. Этот вариант содержит настоящие операции записи/пометки/удаления при БУДУЩЕМ запуске, не только изменение памяти. Использовать лишь свой новый стенд с подготовленными A/B/C, единственную сессию, пустые модули объектов/менеджера, отсутствие подписок, внешних действий, истории, расширений, обменов и регистров расчёта. Не рабочая база и не её копия.

  8. Коды 90/91 и ключи D/E свободны: полный предварительный паспорт допускает только A/B/C. Временные виды создаёт этот модуль, ссылки берутся только после собственных Записать. Фиксации транзакции нет, отмена на успехе и обработанной ошибке. Здесь никаких записей/удалений/транзакций 1С не выполнялось.

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

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

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

КонецПроцедуры

Функция ПолучитьСвоиВиды()
    ПроверитьСвойОсновнойПлан();
    Менеджер = ПланыВидовРасчета.Уч85Начисления;
    A = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "A");
    B = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "B");
    C = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "C");
    Если A.Пустая() Или B.Пустая() Или C.Пустая() Или A = B Или A = C Или B = C Тогда
        ВызватьИсключение "Подготовьте три разные реальные ссылки своего основного плана";
    КонецЕсли;
    Коды = Новый Структура("A,B,C", "10", "20", "30");
    Имена = Новый Структура("A,B,C", "Учебный оклад", "Учебная премия", "Учебное отсутствие");
    Свои = Новый Структура("Менеджер,A,B,C,Коды,Имена", Менеджер, A, B, C, Коды, Имена);
    Ключи = Новый Массив;
    Выборка = Менеджер.Выбрать(, "Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.Уч85Ключ;
        ОжидаемыйКод = Неопределено;
        ОжидаемоеИмя = Неопределено;
        Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя) Тогда
            ВызватьИсключение "В основной выборке есть лишний учебный вид";
        КонецЕсли;
        Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя
            Или Выборка.ПометкаУдаления Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> ""
            Или Выборка.Ссылка <> Свои[Ключ] Тогда
            ВызватьИсключение "Поля собственного вида не совпали с подготовкой";
        КонецЕсли;
        ПроверитьСвоиСвязи(Выборка, Ключ, Свои);
        Ключи.Добавить(Ключ);
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "A,B,C" Тогда
        ВызватьИсключение "Основной план должен содержать ровно A,B,C в порядке кода";
    КонецЕсли;
    Возврат Свои;
КонецФункции

Процедура ПроверитьСвоиСвязи(Выборка, Ключ, Свои)
    Если ТипЗнч(Выборка.ПериодДействияБазовый) <> Тип("Булево") Или Выборка.ПериодДействияБазовый <> (Ключ = "A") Тогда
        ВызватьИсключение "Только собственный A имеет подготовленный признак базового периода";
    КонецЕсли;
    Если Ключ = "B" Тогда
        Если Выборка.БазовыеВидыРасчета.Количество() <> 1 Или Выборка.ВедущиеВидыРасчета.Количество() <> 1
            Или Выборка.ВытесняющиеВидыРасчета.Количество() <> 1 Тогда
            ВызватьИсключение "У B нужны три реальные подготовленные строки зависимостей";
        КонецЕсли;
        Если Выборка.БазовыеВидыРасчета.Получить(0).ВидРасчета <> Свои.A
            Или Выборка.ВедущиеВидыРасчета.Получить(0).ВидРасчета <> Свои.A
            Или Выборка.ВытесняющиеВидыРасчета.Получить(0).ВидРасчета <> Свои.C Тогда
            ВызватьИсключение "У B базовый/ведущий A и вытесняющий C, не плановые случайные ссылки";
        КонецЕсли;
    Иначе
        Если Выборка.БазовыеВидыРасчета.Количество() <> 0 Или Выборка.ВедущиеВидыРасчета.Количество() <> 0
            Или Выборка.ВытесняющиеВидыРасчета.Количество() <> 0 Тогда
            ВызватьИсключение "У A/C таблицы зависимостей должны быть пустыми";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
УчебныеВиды85.Пульт

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

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

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

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

  1. ПроверитьСвойКонтекст и полный паспорт A/B/C вызываются ДО начала своей транзакции. Они не допускают чужую транзакцию или лишнюю подготовку. Во время транзакции запрет ТранзакцияАктивна из общего guard повторно не вызывается.

  2. СоздатьВидРасчета создаёт новый D в памяти, Записать сохраняет его внутри своей транзакции. Ссылка берётся после записи; это не плановый UUID. Зависимости D пусты, A/B/C не меняются.

  3. Создаём второй собственный E: он остаётся в базе внутри транзакции до её отмены. Без такого контрольного объекта отсутствие уже удалённой D после отката не показывало бы, что откат действительно отменяет создание.

  4. Для УстановитьПометкуУдаления берём заново прочитанную чистую D. Метод сам сохраняет пометку и вызывает ПередЗаписью; он не является простым присвоением поля. Модифицированный объект по native-примечанию вызывает исключение.

  5. После True запись ещё существует и пометка реально читается. На свежем чистом объекте ставим False и снова читаем запись. Это пометка, а не непосредственное удаление.

  6. Удалить вызывается только для новой D, созданной этим модулем и не являющейся частью исходных зависимостей. После него D отсутствует, E всё ещё существует в текущей транзакции.

  7. ОтменитьТранзакцию вызывается при успешном завершении и на ошибочном пути, если собственная транзакция ещё активна. Фиксации нет. После отмены GetObject обеих своих ссылок должен вернуть Неопределено, паспорт исходных A/B/C остаётся прежним.

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

  1. Будущий ручной опыт: F7, свой Пульт толстого клиента, одна сессия. Вначале ровно A/B/C. Никакой рабочий объект в процедуру не передавать.

  2. Внутри опыта D/E реально сохранены; после True D существует с пометкой; после False существует без неё; после Удалить D нет, но E ещё есть до отмены.

  3. После успешной отмены D/E отсутствуют, транзакция не активна, собственные A/B/C и их граф A/A/C неизменны. Здесь эти результаты не получены: runtimeVerifiedScenarios=0.

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

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

Будущий опыт создаёт и изменяет только свои временные D/E, затем отменяет собственную транзакцию. В итоговой базе прежние A/B/C; запуск в 1С не выполнялся.

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

  1. Этот код содержит реальные будущие записи и прямое удаление, а не беззаписное упражнение. Откат не оправдывает выполнение в рабочей базе.

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

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

  4. История и внешние обработчики выключены; откат не гарантирует исчезновение внешних эффектов или служебных следов/выданных номеров. Утверждается только проверяемый состав собственных записей.

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

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

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

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

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