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