Определить минимальное значение в последовательности больше заданного

1. pentanom 25 24.12.16 11:19 Сейчас в теме
Есть регистр сведений, у которого два измерения "Объект" и "Дата".
Нужно найти для заданного объекта запись регистра с ближайшей следующий за заданной датой.
Условие: запрос не использовать.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vadim1011985 99 24.12.16 12:39 Сейчас в теме
Регистр не периодический ?
3. pentanom 25 24.12.16 12:52 Сейчас в теме
(2) Нет.
Это из следующей задачи: Объекты обслуживаются по заданному календарю. Нужно определить следующую дату обслуживания объектов.
4. vadim1011985 99 24.12.16 13:01 Сейчас в теме
Набор = регистрыСвединий. ВашРегистр.создатьНаборЗаписей()

МинДата=неопределено;

Набор.отбор.объект.установить(искомыйОбъект)

Набор.прочитать() ; 

Для каждого запись из набор цикл 
Если запись.дата < =заданнаядата тогда 
Продолжить
КонецЕсли; 

Если МинДата = неопределенно тогда 
МинДата = запись.Дата; 
НужнаяЗапись = запись;
ИначеЕсли МинДата> запись.Дата тогда 
НужнаяЗапись = запись; 
МинДата = запись.Дата; 
КонецЕсли;
КонецЦикла; 
Показать

Как-то так
5. pentanom 25 24.12.16 13:45 Сейчас в теме
(4) К сожалению, это длиннее, чем запросом.
Мне бы нужно было написать в условии, чтобы было короче.
Просто хочется красиво написать функцию определения этой даты, но так, чтобы ее можно было использовать и для получения последней дату обслуживания.

Если интересно, то исходная задача такая.
Есть несколько объектов, которые периодически должны обслуживаться. Для этого в конфигурации имеется справочник "Объекты контрагента". У элемента справочника есть реквизиты, среди которых есть периодичность обслуживания (через заданное количество дней, по дням недели, по календарю - заданным датам), дата последнего и следующего обслуживания и др.По заданной дате собираются задания на обслуживание объектов, которые фиксируются документами. При проведении этих документов даты последнего и следующего обслуживания должны измениться в прямом направлении (в будущее), а при отмене проведения - в обратном.
Сейчас написана следующая функция:

Функция ОпределитьДатуСледующего(ОбъектКонтрагента)
	
	Если ОбъектКонтрагента.ПериодичностьОбслуживания=Перечисления.ПериодичностьОбслуживания.КоличествоДней Тогда
//		Возврат ОбъектКонтрагента.Следующая+ОбъектКонтрагента.ПериодОбслуживания*86400;
	ИначеЕсли ОбъектКонтрагента.ПериодичностьОбслуживания=Перечисления.ПериодичностьОбслуживания.ПоДнямНедели Тогда
		ИскомаяДата=ОбъектКонтрагента.Следующая+86400;
		Рабочий=Ложь;
		Пока Не Рабочий Цикл
			НомерДня=ДеньНедели(ИскомаяДата);
			Если Сред(ОбъектКонтрагента.Выходные,НомерДня,1)="1" Тогда
				Рабочий=Истина;
				Возврат ИскомаяДата;
			КонецЕсли;
			ИскомаяДата=ИскомаяДата+86400;
		КонецЦикла;
		Возврат Следующая;
	ИначеЕсли ОбъектКонтрагента.ПериодичностьОбслуживания=Перечисления.ПериодичностьОбслуживания.ПоКалендарю Тогда
		Запрос=Новый Запрос;
		Запрос.Текст="ВЫБРАТЬ
		             |	ПериодичностьОбслуживанияПоКалендарю.ДатаОбслуживания КАК ДатаОбслуживания
		             |ИЗ
		             |	РегистрСведений.ПериодичностьОбслуживанияПоКалендарю КАК ПериодичностьОбслуживанияПоКалендарю
		             |ГДЕ
		             |	ПериодичностьОбслуживанияПоКалендарю.ОбъектКонтрагента = &ОбъектКонтрагента
		             |	И ПериодичностьОбслуживанияПоКалендарю.ДатаОбслуживания > &ДатаОбслуживания
		             |
		             |УПОРЯДОЧИТЬ ПО
		             |	ДатаОбслуживания";
					 
		Запрос.УстановитьПараметр("ОбъектКонтрагента",ОбъектКонтрагента);
		Запрос.УстановитьПараметр("ДатаОбслуживания",Дата);
		Выборка=Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			Возврат Выборка.ДатаОбслуживания;
		Иначе
			Возврат Дата;
		КонецЕсли;
	КонецЕсли;
	
КонецФункции
Показать


так вот все это хочется написать короче и в "прошлое".
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот