Различить два документа, намеченные на одну секунду

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

Одинаковые даты не гарантируют равенство моментов: в сравнении участвуют ссылки. Используем два новых UUID собственных несохранённых документов.

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

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

Подготовка

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

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

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

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

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

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

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

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

  1. Строгая подготовка использует только собственные УчебноеДвижение85 и УчебныеОстатки85. ПолучитьСсылку по UUID не записывает документ.

  2. Два момента имеют одинаковую дату, но разные ссылки. Третий повторяет и дату, и первую ссылку.

  3. Для разных ссылок проверяем, что сравнение не нулевое и обратный порядок имеет противоположный знак. Какой случайный UUID окажется первым, не зашиваем в результат.

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

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

  1. Все восемь логических сообщений дают Истина для двух новых UUID в собственной учебной базе.

  2. Одинаковые даты сопровождаются различными моментами, а повтор одного момента равен ему.

  3. Сообщение порядка содержит −1 либо 1; при новом запуске конкретный знак может измениться.

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

Показано, почему секунды недостаточно для однозначной границы по нескольким документам.

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

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

  2. Не вызывайте МоментВремени у плановой ссылки на отсутствующий документ: в этом упражнении момент создаётся явно из даты и ссылки.

  3. Непустой момент/ссылка не создают запись в базе.

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

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

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

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

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