Сравнить момент объекта и ссылки записанного учебного документа с откатом

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

Только в новой изолированной схеме временно записываем собственный документ в своей транзакции. Момент объекта и его ссылки совпадают; после проверки запись отменяется.

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

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

Подготовка

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

  2. Документы → Добавить: УчебноеДвижение85. Номер: Строка длиной 40, автонумерация выключена. Модули объекта и менеджера оставьте пустыми; не добавляйте обработчики, подписки и обязательные пользовательские реквизиты.

  3. Регистры накопления → Добавить: УчебныеОстатки85. Вид регистра Остатки. Единственное измерение КодТовара: Строка 50, индексировать, проверка заполнения Показывать ошибку. Единственный ресурс Количество: Число 12,3, неотрицательное. Дополнительных реквизитов нет.

  4. В списке регистраторов выберите только собственный документ УчебноеДвижение85. Оставьте модули регистра пустыми, использование итогов включённым. Планы обмена, разделители, историю данных и фоновые задания для урока не создавайте.

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

  6. Первые задачи работают с незаписанными наборами. Только задачи с пометкой «в собственной транзакции» временно записывают два собственных документа и движения, затем обязательно отменяют транзакцию. В рабочей базе этот код не запускайте.

  7. Эта задача содержит временную запись собственного документа. Только новая изолированная УчебныеОстатки85 с пустыми модулями/подписками, не рабочая база и не копия с внешними обработчиками.

  8. Номер учебного документа должен допускать 40 символов, автонумерация выключена. Не добавляйте рассылки, обмены, HTTP-вызовы и фоновые действия в обработчики записи.

Если Метаданные.Документы.Количество() <> 1
    Или Метаданные.РегистрыНакопления.Количество() <> 1
    Или Метаданные.Документы.Найти("УчебноеДвижение85") = Неопределено Тогда
    ВызватьИсключение "Разрешены только собственный учебный документ и регистр";
КонецЕсли;
Описание = Метаданные.РегистрыНакопления.Найти("УчебныеОстатки85");
Если Описание = Неопределено Тогда
    ВызватьИсключение "Сначала создайте собственный учебный регистр";
КонецЕсли;
Если Описание.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки
    Или Описание.Измерения.Количество() <> 1
    Или Описание.Ресурсы.Количество() <> 1
    Или Описание.Реквизиты.Количество() <> 0
    Или Описание.Измерения.Найти("КодТовара") = Неопределено
    Или Описание.Ресурсы.Найти("Количество") = Неопределено Тогда
    ВызватьИсключение "Нужен регистр остатков с КодТовара и Количество";
КонецЕсли;
Менеджер = РегистрыНакопления.УчебныеОстатки85;
Если ТранзакцияАктивна() Тогда
    ВызватьИсключение "Нужен запуск вне чужой транзакции";
КонецЕсли;
СобственнаяСсылка = Неопределено;
НачатьТранзакцию();
Попытка
    Документ = Документы.УчебноеДвижение85.СоздатьДокумент();
    Документ.Номер = "M-" + Строка(Новый УникальныйИдентификатор);
    Документ.Дата = Дата(2024, 2, 5, 10, 0, 0);
    Документ.Записать(РежимЗаписиДокумента.Запись);
    СобственнаяСсылка = Документ.Ссылка;
    ИзОбъекта = Документ.МоментВремени();
    ИзСсылки = СобственнаяСсылка.МоментВремени();
    Сообщить(ИзОбъекта.Дата = Документ.Дата);
    Сообщить(ИзОбъекта.Ссылка = СобственнаяСсылка);
    Сообщить(ИзСсылки.Дата = Документ.Дата);
    Сообщить(ИзСсылки.Ссылка = СобственнаяСсылка);
    Сообщить(ИзОбъекта.Сравнить(ИзСсылки) = 0);
    ОтменитьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;
Сообщить(Не ТранзакцияАктивна());
Сообщить(СобственнаяСсылка.ПолучитьОбъект() = Неопределено);

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

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

  2. Новая транзакция временно сохраняет один документ с собственным случайным номером без проведения. Только после записи вызываем метод у ссылки.

  3. Момент объекта и ссылки содержат одну дату и одну ссылку, поэтому Сравнить возвращает 0.

  4. ОтменитьТранзакцию выполняется и при успехе, и при ошибке. После отката проверяем отсутствие активной транзакции и собственного документа.

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

  1. Все семь логических сообщений дают Истина.

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

  3. ЗафиксироватьТранзакцию в коде отсутствует; в базе не остаётся этот учебный документ.

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

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

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

  1. Откат БД не отменяет внешние HTTP/почтовые/файловые действия обработчиков, поэтому новая схема без них обязательна.

  2. Нельзя вызывать ОтменитьТранзакцию для чужого бизнес-процесса; здесь сначала проверяется её отсутствие.

  3. Запуск в 1С пока не проверен. Перед упражнением сверьте подготовку; не переносите временную запись в рабочую базу.

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

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

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

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

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