Имя: Пароль:
1C
1С v8
Как выборке запроса найти одинаковые записи?
0 vsafonin
 
08.03.13
14:31
Здравствуйте!
Необходимо в выборке из запроса найти записи где
-один и тот же контрагент
-один и тот же договор.

Сам запрос:

ВЫБРАТЬ
   РеализацияТоваровУслуг.Дата,
   РеализацияТоваровУслуг.Проведен,
   РеализацияТоваровУслуг.ПометкаУдаления,
   РеализацияТоваровУслуг.Контрагент,
   РеализацияТоваровУслуг.ДоговорКонтрагента,
   РеализацияТоваровУслуг.СуммаДокумента,
   РеализацияТоваровУслуг.Ссылка
ПОМЕСТИТЬ ДокРеализации
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
   РеализацияТоваровУслуг.Дата >= &ДатаНач
   И РеализацияТоваровУслуг.Дата <= &ДатаОкончания
   И РеализацияТоваровУслуг.Проведен = ИСТИНА
   И РеализацияТоваровУслуг.Услуги.Номенклатура.Код = &Код
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДоговорыКонтрагентов.Владелец КАК Контрагент,
   ДоговорыКонтрагентов.Ссылка КАК Договор,
   ДоговорыКонтрагентов.СуммаНачисления,
   ДоговорыКонтрагентов.СодержаниеУслуги,
   ДокРеализации.СуммаДокумента КАК СуммаРеализации,
   ДокРеализации.Ссылка КАК ДокументРеализации
ИЗ
   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
       ЛЕВОЕ СОЕДИНЕНИЕ ДокРеализации КАК ДокРеализации
       ПО ДоговорыКонтрагентов.Владелец.Наименование = ДокРеализации.Контрагент.Наименование
ГДЕ
   ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ
   И ДоговорыКонтрагентов.Дата <= &ДатаНач
   И ДоговорыКонтрагентов.СрокДействия >= &ДатаОкончания
   И ДоговорыКонтрагентов.СуммаНачисления > 0

Выводит все правильно, но результатом должны быть записи для одного контрагента по одному договору с одним документом реализации, а тут получается что если в этом месяце для одного и того же контрагента делали два документа реализации, то он тоже попадает в результат. Нужно отфильтровать и выдать сообщение об ошибке.

Сам я ничего лучше придумать не могу как при переборе выборки сделать еще один запрос с параметрами контрагент и договор и если количество больше 1 то выдать сообщение об ошибке.

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

Можно ли как то по другому сделать?

Заранее премного благодарен!
1 shuhard
 
08.03.13
14:33
(0) кури группировку и Having
2 vsafonin
 
08.03.13
14:36
Да дело в том что нужно найдя эти документы, выдать сообщение а остальные добавить....вот как с группировкой и имеющие это сделать?

Будет еще одна колонка в которой будет число с количеством записей?
3 mistеr
 
08.03.13
16:31
Я так и не понял, какой документ нужен, если их несколько. Определись.
И ВТ лишняя по-моему.
4 vsafonin
 
08.03.13
20:16
(3) Нужно пострить таблицу вида:
Договор  
Контрагент
СуммаНачислений
Начисленно
Документ начислений

Заполняется таблица за определенный период (месяц указанный пользователем)
Первые 3 заполняются из данных справочника ДоговорыКонтрагентов.

Последние 2 поля берутся из документа реализации, И заполняются только тогда когда они существуют, проведены, и номенклатура в Табличной Части совпадает с константой (в ней хранится определенная номенклатура)

Как сделать без ВТ не понятно мне...

Документы реализации для определенного договора и контрагента должны заполняться РАЗ В МЕСЯЦ.
Вот мне нужно если например в текущем месяце "Ошибочно" Заполнили документ реализации 2 или больше раза..

Эти записи мне не нужны, и для них нужно выдать сообщение об ошибке....
как это сделать ума уже не приложу..
5 vsafonin
 
08.03.13
20:19
То есть после ошибки, нужно продолжить работу и заполнить что есть....

Пока Сделал так, если найден хоть один такой документ, выдаеться сообщение об ошибке..и просьба исправить ситуацию..пока этого не сделано, работать Обработка не будет))

Более гуманный способ есть?
6 Steel_Wheel
 
08.03.13
21:29
(5) Есть.
Все документы сохраняют данные в регистр со струутурой твоей таблицы, обработка подойдет стандартная по остаткам регистра.
Перед записью документа, документ проверяет условие на наличие такого же документа в системе. Если документ есть, то запись текущего документа не производится. Т.е. в регистре всегда актуальные данные, твоя задача -- предотвратить попадание в регистр неактуальных или избыточных данных
7 EugeniaK
 
08.03.13
21:30
(5) Ну вообще-то это правильная схема работы. Нужно исправить ошибочные документы и запустить обработку еще раз.
Только не поняла, зачем перебор выборки.
У тебя пакет запросов. Добавь в него еще один запрос
Количество различных(Документ) сгруппировать по контрагенту и договору. Если в запросе есть данные, выдаем сообщение об ошибке и прекращаем работу.

И, кстати, такое сравнение очень плохое
ДоговорыКонтрагентов.Владелец.Наименование = ДокРеализации.Контрагент.Наименование
Это 2 дополнительных соединения с таблицей контрагентов и плюс условие по строковому полю.
Намного быстрее будет работать связь
ДоговорыКонтрагентов.Владелец = ДокРеализации.Контрагент
8 vsafonin
 
08.03.13
23:46
(6) Конфа типовая, делаю внешнуюю обработку не затрагивая что либо в конфигурации..
(7) Запрос поменял. Спасибо!

В принципе сейчас делаю сначала выгрузку в ТЗ, а уж В ТЗ ищу дубли, которые нашел оттуда удаляю, вывожу сообщение что мол есть докумены их надо исправить и имена и коды этих доков, хотя обработка продолжает работать. Как только буду на 100% уверен что попадание двух или более документов это ОШИБКА, либо будет критично сказываться на производительности - то оставлю только Сообщение об ошибке, и после исправления только работать.
9 sergus_dixi
 
08.03.13
23:57
Не надо сравнивать по наименованию - кури план запроса и увидишь проблемы. агрегатные функции не читал? количество различных > 1 и все прекрасно выводится в СКД или консоли с использованием как вариант ВЫБОР КОГДА....
10 GANR
 
08.03.13
23:58
Сгруппировать запрос по всем полям и добавить агрегатную функцию КОЛИЧЕСТВО(*). Если непонятно - читать СП.
11 GANR
 
08.03.13
23:59
А ещё лучше http://sql-ex.ru/
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс