Записать учебный товар внутри транзакции и намеренно отменить

Учебные задачи

В новой пустой учебной базе проверяем, что отмена транзакции убирает созданную запись. Никаких существующих товаров не удаляем.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

  2. Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

  5. Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.

  6. Это единственный фрагмент данной группы, который вызывает Записать. Выполняйте строго в новой пустой базе Учебная85 с пустым модулем справочника; транзакция намеренно отменяется.

  7. Не запускайте в рабочей конфигурации: её обработчики записи могут иметь внешние побочные действия, которые откат базы не отменяет.


Если Метаданные.Справочники.Найти("УчебныеТовары") = Неопределено Тогда
    ВызватьИсключение "Сначала создайте учебный справочник по подготовке";
КонецЕсли;

Товар = Справочники.УчебныеТовары.СоздатьЭлемент();
Товар.Наименование = "Учебный товар с отменой";
Товар.Артикул = "ROLLBACK-ONLY";
Товар.Цена = 250;
Ссылка = Справочники.УчебныеТовары.ПолучитьСсылку(Новый УникальныйИдентификатор);
Товар.УстановитьСсылкуНового(Ссылка);
Если ТранзакцияАктивна() Тогда
    ВызватьИсключение "Запустите упражнение вне существующей транзакции";
КонецЕсли;
НачатьТранзакцию();
Попытка
    Товар.Записать();
    Внутри = Ссылка.ПолучитьОбъект();
    Сообщить(Внутри <> Неопределено);
    Сообщить(Не Товар.ЭтоНовый());
    ОтменитьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Сообщить(Не ТранзакцияАктивна());
Сообщить(Ссылка.ПолучитьОбъект() = Неопределено);

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

  1. До начала проверяем, что чужая транзакция не активна. Не отменяем транзакцию вызывающего кода.

  2. Записываем только собственный новый объект с новым UUID и читаем его внутри этой транзакции.

  3. ОтменитьТранзакцию откатывает запись, после чего снова проверяем существование через ссылку.

  4. В случае ошибки отменяем только ещё активную транзакцию данного упражнения и передаём исключение дальше.

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

  1. Внутри транзакции объект получен; после записи ЭтоНовый=Ложь.

  2. После отмены транзакция не активна и ПолучитьОбъект возвращает Неопределено.

  3. В списке УчебныеТовары нет нового учебного товара после завершения упражнения.

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

Запись собственной учебной строки была отменена без удаления существующих объектов.

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

  1. Отмена транзакции не откатывает HTTP-запросы, отправленные письма и внешние файлы. Поэтому база и обработчики специально изолированы.

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

  3. Записать может вызывать код объекта и подписки; в подготовке их намеренно нет.

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

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

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

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

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