Каталог решений - Как удалить из выборки дубли по двум полям.

Как удалить из выборки дубли по двум полям.

Как удалить из выборки дубли по двум полям.

В наличии

Как удалить из выборки дубли по двум полям. Искал ответ в сети, ничего найти не смог, пришлось делать самому, возможно кому – то это пригодится.

Категория:

Описание

Искал ответ в сети, ничего найти не смог, пришлось делать самому, возможно кому – то это пригодится.

Контекст задачи: писал обработку для УТ 11.1, которая заполняла вспомогательный периодический независимый регистр сведений по данным из проведенных документов ПоступлениеТоваровУслуг. Измерение регистра – Номенклатура, ресурс – цена. Специфика бизнеса такова, что поставщики в одном приходном документе ставили одну и ту же номенклатуру по разным ценам. Требовалось выбрать из пакета записей по полям «Дата» и «Номенклатура» запись с максимальной ценой. Иначе регистр отказывался воспринимать данные. Заодно нужно было исключить услуги.

Цель работы — быстро однократно получить нужные для задач управленческого учета цифры из «запущеной» и базы. 

Код процедуры исполняющейся на сервере.

Процедура НаСервереЗаполняемРегистрЦеныЗакупа(НашаДата)
// Очищаем регистр.
НаборЗаписей = РегистрыСведений.ЦеныЗакупаАнадо.СоздатьНаборЗаписей();
НаборЗаписей.Записать();

// Заполняем регистр данными

НаборЗаписей = РегистрыСведений.ЦеныЗакупаАнадо.СоздатьНаборЗаписей();
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
| ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
| ПоступлениеТоваровУслугТовары.Цена КАК Цена
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
| ПоступлениеТоваровУслугТовары.Ссылка.Проведен = &Проведен

| И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата

| И ПоступлениеТоваровУслугТовары.Ссылка.Дата | И ПоступлениеТоваровУслугТовары.Номенклатура.ТипНоменклатуры <> &ТипНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Номенклатура,
| Цена УБЫВ»;
Запрос.УстановитьПараметр(«Проведен», Истина);
Запрос.УстановитьПараметр(«Дата», НашаДата);
Запрос.УстановитьПараметр(«ТипНоменклатуры», Перечисления.ТипыНоменклатуры.Услуга);

Результат = Запрос.Выполнить().Выбрать();
// Присваиваем начальные значания проверочным переменным с которыми будем работать в цикле
ДатаДляПроверки = Дата(1,1,1);
НоменклатураДляПроверки = Справочники.Номенклатура.ПустаяСсылка();

Пока Результат.Следующий() Цикл
       Если (Результат.Номенклатура = НоменклатураДляПроверки) И (Результат.Дата = ДатаДляПроверки) Тогда
             Продолжить;
      Иначе
             НоменклатураДляПроверки = Результат.Номенклатура;
             ДатаДляПроверки = Результат.Дата;

             НовЗапись = НаборЗаписей.Добавить();

             НовЗапись.Период = Результат.Дата;
             НовЗапись.Номенклатура = Результат.Номенклатура;
             НовЗапись.Цена = Результат.Цена;
       КонецЕсли;

КонецЦикла;
НаборЗаписей.Записать(Истина);

КонецПроцедуры

Код сам по себе достаточно простой. В запросе я произвожу упорядочивание выборки —  по дате, затем по номенклатуре и по цене. Цена — по убыванию. Дальше используя вспомогательные переменные в теле цикла, произвожу отбрасывание дублей. Все работает, код читаем. 

has been added to your cart:
Оформление заказа