Имя: Пароль:
1C
1С v8
Сравнение таблиц значений.
,
0 Vovka_Jetta
 
21.09.11
16:09
Доброго времени суток!
Помогите победить проблему :(

Есть две таблицы значений.
ТЗ#1, колонки: Код, Код1, Товар
заполняется из эксель-файла
ТЗ#2, колонки: Код, Товар
заполняется из результата запроса.

Необходимо сравнить их по колонке "Код" и вывести два результата:
1. что есть в ТЗ#1, чего нет в ТЗ#2
2. что есть в ТЗ#2, чего нет в ТЗ#1

"Код1" появился только что. До этого колонки были одинаковы и я сделал это сравнение через массивы и их сравнение в циклах. Долго, но работает :)

Сейчас пытаюсь сравнить таблицы значений, но пока что ни к чему толковому не пришел :(
1 Axel2009
 
21.09.11
16:10
отсортируй по коду и пройдись по счетчику количеству строк
2 cViper
 
21.09.11
16:20
Можно сделать запросом, с помощью временных таблиц. Получишь 2 результата выборки, в одном будет те что только в левой ТЗ , в другом - в правой ТЗ
3 Vovka_Jetta
 
21.09.11
16:22
Именно так и делал в случае с массивами.
4 Vovka_Jetta
 
21.09.11
16:22
Блин.... Как тут ответить выбранному пользователю?

Про Запросы я читал, но я не умею такие составлять :((
5 cViper
 
21.09.11
16:23
(4)Скобочки () и номер сообщения.
6 Axel2009
 
21.09.11
16:23
(3) не так сделал. если циклов куча.
7 Vovka_Jetta
 
21.09.11
16:24
Тест
З.Ы. (5)  Спасибо :)
8 cViper
 
21.09.11
16:24
(4) Вот так ты можешь передать данные из ТЗ в запрос.
ВЫБРАТЬ
ВТ.*
ПОМЕСТИТЬ втДанные
ИЗ
&Вт КАК ВТ;
/////////
ВЫБРАТЬ
*
ИЗ
втДанные
9 cViper
 
21.09.11
16:25
+(8) Только необходимо вместо звезды прописывать названия колонок.
10 Vovka_Jetta
 
21.09.11
16:26
(3) Вот какой был код:

   Для Каждого КодСайта из КодыСт Цикл
       КодСайта = СокрЛП(КодСайта);
       ТекущийИндекс = КодыПр.ВГраница();
       Пока ТекущийИндекс >= 0 Цикл
           КодПрайса = СокрЛП(КодыПр[ТекущийИндекс]);
           Если КодПрайса = КодСайта Тогда
               КодыПр.Удалить(ТекущийИндекс);
               Прервать;            
           КонецЕсли;
           ТекущийИндекс = ТекущийИндекс - 1;
       КонецЦикла;
   КонецЦикла;
11 Vovka_Jetta
 
21.09.11
16:26
Код - ответ для (6)
12 Vovka_Jetta
 
21.09.11
16:27
(8) Попробую сейчас переварить
13 cViper
 
21.09.11
16:29
(12) Делаешь в одном запросе 2 таких куска (для обеих ТЗ). Потом джоинишь их по разному, как надо тебе. И при выполнении запроса выполняешь пакетный запрос. В результате имеешь 2 выборки с разными элементами.
14 Axel2009
 
21.09.11
16:29
(11) плохой код. тут 2 вложенных цикла. обходов n*m. нужно делать через 1 цикл, ну или не обходить кучу раз все массивы
15 aple313
 
21.09.11
16:30
(12)Только не забудь что в ТЗ колонки должны быть типизированы.
16 Axel2009
 
21.09.11
16:32
(12) сколько записей то в табличках?
17 Vovka_Jetta
 
21.09.11
16:37
(16) Таблицы постоянно меняются, но в целом:
ТЗ#1 не вылезает за 700 записей
ТЗ#2 не вылезает за 1000 записей
18 Vovka_Jetta
 
21.09.11
16:41
(13) Что-то похожее на (13) из v8: пересечение массивов - алгоритм ?
19 Vovka_Jetta
 
22.09.11
13:40
В итоге, общими усилиями, получилось следующее:

Процедура Сравнить2ТЗ();
       ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(200));
       СтТЗ = Новый ТаблицаЗначений;
       ПрТЗ = Новый ТаблицаЗначений;
       РцТЗ = Новый ТаблицаЗначений;

   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    СтТЗ.КодУТ,
   |    СтТЗ.КодКт,
   |    СтТЗ.Номенклатура
   |ПОМЕСТИТЬ ВТ_СтТЗ
   |ИЗ
   |    &СтТЗ КАК СтТЗ
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ПрТЗ.КодУТ,
   |    ПрТЗ.Номенклатура
   |ПОМЕСТИТЬ ВТ_ПрТЗ
   |ИЗ
   |    &ПрТЗ КАК ПрТЗ
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА ВТ_ПрТЗ.КодУТ ЕСТЬ NULL
   |            ТОГДА ""СтТЗ""
   |        ИНАЧЕ ""ПрТЗ""
   |    КОНЕЦ КАК ИмяТаблицы,
   |   ВТ_СтТЗ.КодКт КАК КодКт,
   |    ЕСТЬNULL(ВТ_СтТЗ.КодУТ, ВТ_ПрТЗ.КодУТ) КАК КодУТ,
   |    ЕСТЬNULL(ВТ_СтТЗ.Номенклатура, ВТ_ПрТЗ.Номенклатура) КАК Номенклатура
   |ИЗ
   |    ВТ_СтТЗ КАК ВТ_СтТЗ
   |        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ПрТЗ КАК ВТ_ПрТЗ
   |        ПО ВТ_СтТЗ.КодУТ = ВТ_ПрТЗ.КодУТ
   |ГДЕ
   |    (ВТ_СтТЗ.КодУТ ЕСТЬ NULL
   |            ИЛИ ВТ_ПрТЗ.КодУТ ЕСТЬ NULL )
   |ИТОГИ ПО
   |    ИмяТаблицы";
   
   Запрос.УстановитьПараметр("СтТЗ", СтТЗ);
   Запрос.УстановитьПараметр("ПрТЗ", ПрТЗ);
   
   Результат = Запрос.Выполнить();
   
   ВыборкаТаблица = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   Пока ВыборкаТаблица.Следующий() Цикл
       Сообщить("Таблица "+ВыборкаТаблица.ИмяТаблицы);
       ВыборкаСтроки = ВыборкаТаблица.Выбрать();
       Пока ВыборкаСтроки.Следующий() Цикл
           Если ВыборкаТаблица.ИмяТаблицы = "ПрТЗ" Тогда
               Сообщить(Символ(9) + ВыборкаСтроки.КодУТ + Символ(9) + ВыборкаСтроки.Номенклатура);
           ИначеЕсли ВыборкаТаблица.ИмяТаблицы = "СтТЗ" Тогда
               Сообщить(Символ(9) + ВыборкаСтроки.КодКт + Символ(9) + ВыборкаСтроки.КодУТ + Символ(9) + ВыборкаСтроки.Номенклатура);
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;    
КонецПроцедуры

Всем спасибо!
20 Serginio1
 
22.09.11
15:28
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший