Помогите, пожалуйста, разобраться в давней (для меня) проблеме.
В статье "Эх... МоментВремени() !" (https://infostart.ru/1c/articles/84177/) предпринята попытка ответа на вопрос: "Два документа записаны с одинаковой датой . Какой из документов будет левее (раньше) на временной оси ?"
В самом общем виде выводы статьи относительно этого объекта, в частности, сводятся к тому, что "Механизм генерации ссылок (на документ) обеспечивает только их уникальность. Возрастающая последовательность при их генерации не обеспечивается." (приводятся слова Нуралиева).
Между тем, у типа МоментВремени есть метод Сравнить(), возвращающий результаты:
Тип: Число.
-1 - если момент времени меньше другого момента времени, 0 - если момент времени равен другому моменту времени, 1 - если момент времени больше другого момента времени.
А теперь вопрос (ы):
1. В каком смысле трактовать понятие Больше/Меньше для МоментаВремени?
2. Какой практический смысл (например, контроль остатков в регистре) имеет это сравнение?
1. Точно так же как и для Даты.
2. Например, Партионный учет, ГТД, расчет по документам и т.д. Регистры тут вообще при чем? В регистрах нет момента времени.
(2) Раз моменты времени с одинаковой датой /временем располагаются не обязательно в порядке их записи движений при проведении, то и состояние остатков в регистрах накопления нее определяется этим порядком. Это так?
(5) Напомню, момент времени - это комбинация даты-времени, с точностью до секунды и ссылки на документ. Если дата-время одинаковы, то какой документ ">"? Вопрос именно в этом. Если это просто порядковый номер внутри секунды, то какой документ - первый, какой - dторой и т.д?
(13) начните с понятия гуид, guid, ну и в терминах 1С УникальныйИдентификатор. Он имеет представление из набора групп 16 чисел разделенных символом "-".
Вот тупо строковое сравнение, что больше...
(6) Что такое гуид я знаю. Также знаю, что сравнение на больше-меньше в гуиде отсутствует. Если это понимается в смысле сравнения символьных представлений - приведите это определение.
(14)
(16) я вам дал направление. Если надо, то сами ищите определения.
Могу дать направление: начните с анализа плана выполнения запроса, в котором есть сортировка по МоментВремени или по Ссылка.
Ну и посмотрите как Ссылка хранится в таблицах базы данных.
(6) Спасибо за направление. Но, похоже, оно не туда ведет. Могу отправить к первоисточнику.
(17) (https://infostart.ru/1c/articles/84177/). Почитайте. Удивитесь, я Вам гарантирую.
(19) 1. Первоисточником моего поста, так точнее.
(19) 2. В этой статье говорится, что "документы проведенные в одну и ту же секунду располагаются в произвольном порядке, а не в порядке их физического создания".
Поэтому расчет на то, что по гуиду и каким-либо представлениям на его основе может быть основой для упорядочения в пределах секунды - неверен в общем случае. На это не стоит полагаться. Это может сработать в частном случае, но возможность такая - недокументирована. Поэтому я и просил у Вас определения в документации 1С. А иначе все может слететь с приходом очередного обновления платформы.
Таким образом, на оператор Сравнить(), имхо, полагаться не стоит.
(20) а теперь где я что-то говорил об обратном?
"все просто. Сравнение по дате и ссылке. Это все. Ничего более."
"У которого гуид будет больше"
Где мной было сказано, как они формируются?
Перечитали? Удивились?
Функция КрайнийИзМоментовВремени(МассивДокументов, Направление, ОпорныйДокумент = Неопределено)
//Направление 1 - вперед во времени, -1 назад во времени
//Проверять дату опорного документа надо отдельно
ЛучшийМомент = Неопределено;
ЛучшийДокумент = Неопределено;
//Если есть опорный документ, его момент и считаем лучшим, остальные должны быть лучше его
Если ОпорныйДокумент <> Неопределено Тогда
ЛучшийМомент = ОпорныйДокумент.МоментВремени();
КонецЕсли;
Для Каждого Документ ИЗ МассивДокументов Цикл
МоментВремени = Документ.МоментВремени();
Если ЛучшийМомент = Неопределено Тогда
ЛучшийМомент = МоментВремени;
ЛучшийДокумент = Документ;
Иначе
Если Направление = 1 И МоментВремени.Сравнить(ЛучшийМомент) = 1 Тогда
ЛучшийМомент = МоментВремени;
ЛучшийДокумент = Документ;
ИначеЕсли Направление = -1 И МоментВремени.Сравнить(ЛучшийМомент) = -1 Тогда
ЛучшийМомент = МоментВремени;
ЛучшийДокумент = Документ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ЛучшийДокумент;
КонецФункции