1. pentanom 20 24.12.16 11:19 Сейчас в теме

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

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

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

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

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

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

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

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

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

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


так вот все это хочется написать короче и в "прошлое".
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Ведущий инженер - программист 1С
Москва
зарплата от 200 000 руб.
Полный день

Ведущий программист 1С
Нижний Новгород
зарплата от 100 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата до 120 000 руб.
Полный день

Программист 1С
Волгоград
зарплата от 45 000 руб. до 90 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству