Имя: Пароль:
1C
1С v8
Найти первую неоплаченную накладную одним запросом УТ 10.3
0 Alexprimer
 
01.02.13
08:49
Подскажите, можно ли одним запросом найти первую не оплаченную накладную(дату).
У меня пока идея: Взять остатки обороты и после обходом в цикле вычислить не оплаченную накладную.
1 Cube
 
01.02.13
08:51
Можно
2 Alexprimer
 
01.02.13
09:47
Кто сделал по другому?
ВЫБРАТЬ
   НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период, ДЕНЬ) КАК Дата,
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
   СУММА(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК Долг
ПОМЕСТИТЬ Взаиморасчеты
ИЗ
   РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , Регистратор, , ДоговорКонтрагента = &Договор) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

СГРУППИРОВАТЬ ПО
   НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период, ДЕНЬ),
   ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Дата,
   ВложенныйЗапрос.Договор
ПОМЕСТИТЬ Переплата
ИЗ
   (ВЫБРАТЬ
       МАКСИМУМ(Взаиморасчеты.Дата) КАК Дата,
       Взаиморасчеты.Договор КАК Договор
   ИЗ
       Взаиморасчеты КАК Взаиморасчеты
   ГДЕ
       Взаиморасчеты.Долг <= 0
   
   СГРУППИРОВАТЬ ПО
       Взаиморасчеты.Договор) КАК ВложенныйЗапрос
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   МИНИМУМ(ВложенныйЗапрос.ДатаДолга) КАК ДатаДолга
ИЗ
   (
   ВЫБРАТЬ
       ВложенныйЗапрос.ДатаДолга КАК ДатаДолга
   ИЗ
       (ВЫБРАТЬ
           Долги.Дата КАК ДатаДолга,
           ЕСТЬNULL(Переплата.Дата, &ПустаяДата) КАК ДатаПереплаты
       ИЗ
           (ВЫБРАТЬ
               Взаиморасчеты.Дата КАК Дата,
               Взаиморасчеты.Договор КАК Договор
           ИЗ
               Взаиморасчеты КАК Взаиморасчеты
           ГДЕ
               Взаиморасчеты.Долг > 0) КАК Долги
               ЛЕВОЕ СОЕДИНЕНИЕ Переплата КАК Переплата
               ПО Долги.Договор = Переплата.Договор) КАК ВложенныйЗапрос
   ГДЕ
       ВложенныйЗапрос.ДатаПереплаты < ВложенныйЗапрос.ДатаДолга
       ) КАК ВложенныйЗапрос
3 Alexprimer
 
01.02.13
09:51
Кто сделал красивей? Поделитесь плиз?
4 teapot123
 
01.02.13
09:53
остатки по РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов
5 pessok
 
01.02.13
10:09
+(4) притом ПЕРВЫЕ 1 и порядок по дате
6 ВалераОшкин
 
01.02.13
10:13
(0) Сравни СуммуДокумента с ОстаткомЗадолженности по документу. Если суммы равны - значит ни разу не платили
7 Alexprimer
 
01.02.13
10:21
Так?
ВЫБРАТЬ
   МИНИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Дата) КАК ДокументРасчетовСКонтрагентомДата
ИЗ
   РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&Дата, ДоговорКонтрагента = &Договор) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
ГДЕ
   ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
8 pessok
 
01.02.13
10:23
(7) ВЫБРАТЬ ПЕРВЫЕ 1
УПОРЯДОЧИТЬ ПО ДокументРасчетовСКонтрагентомДата.Дата ВОЗР
9 pessok
 
01.02.13
10:24
(7) с минимумом, скорее всего, работать будет дольше
10 Alexprimer
 
01.02.13
10:25
наоборот
11 pessok
 
01.02.13
10:29
(10) с минимумом 0.03 сек, с упорядочивание 0.02 сек. решай сам
12 Alexprimer
 
01.02.13
11:49
когда таблица не большая разницы нет, но когда она побольше быстрей отрабатывает группировка
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший