Имя: Пароль:
1C
 
Как в запросе сравнить табличные части двух документов ?
0 Родной
 
24.11.10
10:36
Есть два дока одного вида. Как в результате запроса получить просто Истина или Ложь ? Тоесть равны табл. части или нет. Можно и не запросом, главное быстро. Спасибо.
1 mikecool
 
24.11.10
10:37
ОБЪЕДИНИТЬ + доп поле с 1 + СГРУППИРОВАТЬ + ИМЕЮЩИЕ допполе > 1 - вот тут и будут неравные
2 Cube
 
24.11.10
10:37
(0) А что для тебя значит выражение "равны табл. части"?
3 el-gamberro
 
24.11.10
10:38
О... это есть великое колдунство!
4 el-gamberro
 
24.11.10
10:40
Выгрузить обе ТЧ в ТЗ, далее
Если ТЗ1 = ТЗ2 Тогда
Возврат Истина;
Иначе
Возврат ЛОжь;
КонецЕсли
5 Виталий
 
24.11.10
10:40
Как вариант:
ТабЧасть1 = Док1Ссылка.ТабЧасть.Выгрузить();
ТабЧасть2 = Док2Ссылка.ТабЧасть.Выгрузить();
Для Каждого Строка Из ТабЧасть1 Цикл
   Строка.Количество = - Строка.Количество;
   Строка.Сумма = - Строка.Сумма;

КонецЦикла
ЗагрузитьВТаблицуЗначений(Таб
6 Родной
 
24.11.10
10:40
(1)а можешь пример ? пост в голове расшифровать немогу...
7 Виталий
 
24.11.10
10:41
Как вариант:
ТабЧасть1 = Док1Ссылка.ТабЧасть.Выгрузить();
ТабЧасть2 = Док2Ссылка.ТабЧасть.Выгрузить();
Для Каждого Строка Из ТабЧасть1 Цикл
   Строка.Количество = - Строка.Количество;
   Строка.Сумма = - Строка.Сумма;
   ...
КонецЦикла
ЗагрузитьВТаблицуЗначений(ТабЧасть1, ТабЧасть2);
ТабЧасть2.Свернуть("...");
8 Родной
 
24.11.10
10:41
(4)хм, незнал что их так можно сравнить... спасибо
9 dimoff
 
24.11.10
10:42
В (4) бред написан, имхо
10 Родной
 
24.11.10
10:43
Не. непрокатит мне в ТЗ сравнивать. Нужно именно в запросе...
11 dimoff
 
24.11.10
10:43
Сравнить в запросе легко. Выбрать различные из запроса с объединением таб. частей и сравнить количество записей с количеством строк в документах.
12 МихаилМ
 
24.11.10
10:43
таб1 LEFT JOIN tab2
ON таб1.поле1 = таб2.поле2
...
ON таб1.полеN = таб2.полеN

WHERE tab2.ссылка is not NULL
13 mikecool
 
24.11.10
10:46
(6)
Выбрать Количество(*) Как Результат
ИЗ
(выбрать * , 1 Как ДопПоле
из Документ
где Документ.Ссылка = &Ссылка1
ОБЪЕДИНИТЬ
выбрать *, -1
из Документ
где Документ.Ссылка = &Ссылка2) как ВлЗапрос
Сгруппировать По *
Имеющие Не Сумма(ДопПоле) = 0

* заменяем на список полей
14 Grusswelle
 
24.11.10
10:47
(4) мдя...
15 Виталий
 
24.11.10
10:51
(12) Не прокатит, нужно полное соединение:

ВЫБРАТЬ
   ВЫБОР
       КОГДА Таб1.Ссылка IS NULL ИЛИ Таб1.Ссылка IS NULL
       ТОГДА Ложь
       ИНАЧЕ Истина
   КОНЕЦ
ИЗ
   Док1.Таб КАК Таб1
ПОЛНОЕ СОЕДИНЕНИЕ
   Док2.Таб КАК Таб2
       ПО <все поля>
16 dimoff
 
24.11.10
10:54
Запрос = "ВЫБРАТЬ
            |    Подсчет.НомерСтроки КАК НомерСтроки,
            |    Подсчет.Номенклатура,
            |    Подсчет.Количество,
            |    Подсчет.Цена,
            |    Подсчет.Сумма,
            |    СУММА(Подсчет.Счетчик) КАК Счетчик
            |ИЗ
            |    (ВЫБРАТЬ
            |        ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
            |        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
            |        ПоступлениеТоваровУслугТовары.Количество КАК Количество,
            |        ПоступлениеТоваровУслугТовары.Цена КАК Цена,
            |        ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
            |        0.5 КАК Счетчик
            |    ИЗ
            |        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            |    ГДЕ
            |        ПоступлениеТоваровУслугТовары.Ссылка = &Док1
            |    
            |    ОБЪЕДИНИТЬ ВСЕ
            |    
            |    ВЫБРАТЬ
            |        ПоступлениеТоваровУслугТовары.НомерСтроки,
            |        ПоступлениеТоваровУслугТовары.Номенклатура,
            |        ПоступлениеТоваровУслугТовары.Количество,
            |        ПоступлениеТоваровУслугТовары.Цена,
            |        ПоступлениеТоваровУслугТовары.Сумма,
            |        0.5
            |    ИЗ
            |        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            |    ГДЕ
            |        ПоступлениеТоваровУслугТовары.Ссылка = &Док2) КАК Подсчет
            |
            |СГРУППИРОВАТЬ ПО
            |    Подсчет.НомерСтроки,
            |    Подсчет.Номенклатура,
            |    Подсчет.Количество,
            |    Подсчет.Цена,
            |    Подсчет.Сумма
            |ИТОГИ
            |    МАКСИМУМ(НомерСтроки),
            |    СУММА(Счетчик)
            |ПО
            |    ОБЩИЕ"
           
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();

ТЧРавны = (Выборка.НомерСтроки = Выборка.Счетчик)
17 el-gamberro
 
24.11.10
10:56
(16) неправильно. а вот в (11) правильная идея.
18 Crosby
 
24.11.10
10:58
Если не в запросе:

Почти как в (4), только сравнение другое:

Выгрузить обе ТЧ в две ТЗ

СтараяТЗ = ДокОбъект1.МойДокумент.Выгрузить();
НоваяТЗ  = ДокОбъект2.МойДокумент.Выгрузить();
Если ЗначениеВСтрокуВнутр(СтараяТЗ) = ЗначениеВСтрокуВнутр(НоваяТЗ) Тогда
    Возврат Истина;
Иначе
    Возврат Ложь;
КонецЕсли;
19 Crosby
 
24.11.10
11:00
+(18) как раз полная идентичность. Даже совпадение порядка строк.
20 dimoff
 
24.11.10
11:20
(17) В 16 реализация 11
21 dimoff
 
24.11.10
11:20
+20 На всякий случай сейчас проверю 16.
22 el-gamberro
 
24.11.10
11:27
(21) Если цена или кол-во отличаются а кол-во строк совпадает, то твой запрос выдаст истину. а вот если по 11 сделать, то выдаст ложь.
23 dimoff
 
24.11.10
11:51
В 16 неточность, вот проверенно работающий запрос

Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    Подсчет.НомерСтроки КАК НомерСтроки,
                  |    Подсчет.Номенклатура,
                  |    Подсчет.Количество,
                  |    Подсчет.Цена,
                  |    Подсчет.Сумма,
                  |    СУММА(Подсчет.Счетчик) КАК СчетчикМин,
                  |    СУММА(Подсчет.Счетчик) КАК СчетчикМакс
                  |ИЗ
                  |    (ВЫБРАТЬ
                  |        ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
                  |        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
                  |        ПоступлениеТоваровУслугТовары.Количество КАК Количество,
                  |        ПоступлениеТоваровУслугТовары.Цена КАК Цена,
                  |        ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
                  |        0.5 КАК Счетчик
                  |    ИЗ
                  |        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                  |    ГДЕ
                  |        ПоступлениеТоваровУслугТовары.Ссылка = &Док1
                  |    
                  |    ОБЪЕДИНИТЬ ВСЕ
                  |    
                  |    ВЫБРАТЬ
                  |        ПоступлениеТоваровУслугТовары.НомерСтроки,
                  |        ПоступлениеТоваровУслугТовары.Номенклатура,
                  |        ПоступлениеТоваровУслугТовары.Количество,
                  |        ПоступлениеТоваровУслугТовары.Цена,
                  |        ПоступлениеТоваровУслугТовары.Сумма,
                  |        0.5
                  |    ИЗ
                  |        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                  |    ГДЕ
                  |        ПоступлениеТоваровУслугТовары.Ссылка = &Док2) КАК Подсчет
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Подсчет.НомерСтроки,
                  |    Подсчет.Номенклатура,
                  |    Подсчет.Количество,
                  |    Подсчет.Цена,
                  |    Подсчет.Сумма
                  |ИТОГИ
                  |    МИНИМУМ(СчетчикМин),
                  |    МАКСИМУМ(СчетчикМакс)
                  |ПО
                  |    ОБЩИЕ";
           
            Запрос.УстановитьПараметр("Док1", Док1);
            Запрос.УстановитьПараметр("Док2", Док2);
           
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();

ТЧРавны = (Выборка.СчетчикМин = Выборка.СчетчикМакс И Выборка.СчетчикМин = 1);
Сообщить(ТЧРавны);
24 el-gamberro
 
24.11.10
12:15
(23) явно перемудрил))
25 dimoff
 
24.11.10
12:18
(24) Ничего перемудреного нет, счетчик для каждой строки должен показать 1 если ввсе строки идентичны, соответственно минимум должен быть равен 1 и максимум 1, всё предельно просто.
26 artbear
 
24.11.10
12:41
1. Что означает "таблица равны"? Сначала нужно определиться с терминами! Равны по каким-то ключевым полям или количество строк одинаково или еще что?
Номер/порядок строки имеет значение?
2. Нужно определиться со списком ключевых полей, по которым идет сравнение.
.
В (23) неявно выделены ключевые поля + к ним добавлен номер строки, но ИМХО решение все равно слишком хитрое.
27 dimoff
 
24.11.10
13:19
Да, оно жутко хитрое, я большой хитрец
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан