helpf.pro
Регистрация

v8: Помогите пожалуйста составить запрос

Onotoley
21.09.2011 19:43Прочитано: 3532
Доброго времени суток!
Помогите победить проблему )

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

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

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

Сейчас пытаюсь сравнить таблицы значений, но пока что ни к чему толковому не пришел )
Yandex
Возможно, вас также заинтересует
Реклама на портале
Dosipheja
21.09.2011 23:46Ответ № 1
(0) Onotoley,

Могу предложить следующий вариант
Сравнить таблицы с помощью запроса.
А именно сделать полное соединение этих таблиц по коду
И добавить условие - отбирать только те строки для которых не нашлось пары
во второй таблице.
(Думаю, это понятно - если пары не нашлось, значит такой строчки во другой таблице нет)

Добавить также в запрос вспомогательное поле ИмяТаблицы, по которому будет выводить итоги.
После выполнения запроса сделаем иерархический обход результата запроса в цикле.
Во внешнем цикле будет выводится информация о таблице, а во внутреннем о строках этой таблице

Например,

возьмем такие таблицы для тестирования

ТЗ#1
Код Код1 Товар
---------------------
001 А01 Товар001
002 А02 Товар002
003 А03 Товар003

ТЗ#2
Код Товар
--------------
003 Товар003
004 Товар004

Для приведенного примера, если правильно Вас поняла, мы должны получить
для ТЗ1: строки с кодом 001, 002
для ТЗ2: строки с кодом 004
строка с кодом 003 выпадает, она есть в обеих таблицах.

Мой алгоритм работает так
Делаем полное соединение по коду, получаем

ТЗ#1 ТЗ#2
Код Код1 Товар Код Товар
---------------------------------------
001 А01 Товар001 NULL
002 А02 Товар002 NULL
003 А03 Товар003 003 Товар003
NULL 004 Товар004

Оставлем только те строки, у которых нет пары
ТЗ#1 ТЗ#2
Код Код1 Товар Код Товар
---------------------------------------
001 А01 Товар001 NULL
002 А02 Товар002 NULL
NULL 004 Товар004

Остается только правильно вывести результат
Для этого и нужно дополнительное поле Имя таблицы и ИТОГИ в запросе по этому полю


У меня получился такой код

Код 1C v 8.х
 

//Опишу таблицы из моего примера
//Для простоты считаю что все колнки строкового типа
ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(20));

ТЗ1 = Новый ТаблицаЗначений;
ТЗ1.Колонки.Добавить("Код", ТипСтрока);
ТЗ1.Колонки.Добавить("Код1",ТипСтрока);
ТЗ1.Колонки.Добавить("Товар",ТипСтрока);

ТЗ2 = Новый ТаблицаЗначений;
ТЗ2.Колонки.Добавить("Код",ТипСтрока);
ТЗ2.Колонки.Добавить("Товар",ТипСтрока);

НоваяСтрока = ТЗ1.Добавить();
НоваяСтрока.Код = "001";
НоваяСтрока.Код1 = "АБВ";
НоваяСтрока.Товар = "Товар001";

НоваяСтрока = ТЗ1.Добавить();
НоваяСтрока.Код = "002";
НоваяСтрока.Код1 = "АБВ";
НоваяСтрока.Товар = "Товар002";

НоваяСтрока = ТЗ1.Добавить();
НоваяСтрока.Код = "003";
НоваяСтрока.Код1 = "АБВ";
НоваяСтрока.Товар = "Товар003";

НоваяСтрока = ТЗ2.Добавить();
НоваяСтрока.Код = "003";
НоваяСтрока.Товар = "Товар003";

НоваяСтрока = ТЗ2.Добавить();
НоваяСтрока.Код = "004";
НоваяСтрока.Товар = "Товар004";

//Запрос

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ1.Код,
| ТЗ1.Код1,
| ТЗ1.Товар
|ПОМЕСТИТЬ ВТ_ТЗ1
|ИЗ
| &ТЗ1 КАК ТЗ1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЗ2.Код,
| ТЗ2.Товар
|ПОМЕСТИТЬ ВТ_ТЗ2
|ИЗ
| &ТЗ2 КАК ТЗ2
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ВТ_ТЗ2.Код ЕСТЬ NULL
| ТОГДА ""ТЗ1""
| ИНАЧЕ ""ТЗ2""
| КОНЕЦ КАК ИмяТаблицы,
| ЕСТЬNULL(ВТ_ТЗ1.Код, ВТ_ТЗ2.Код) КАК Код,
| ЕСТЬNULL(ВТ_ТЗ1.Товар, ВТ_ТЗ2.Товар) КАК Товар
|ИЗ
| ВТ_ТЗ1 КАК ВТ_ТЗ1
| ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ТЗ2 КАК ВТ_ТЗ2
| ПО ВТ_ТЗ1.Код = ВТ_ТЗ2.Код
|ГДЕ
| (ВТ_ТЗ1.Код ЕСТЬ NULL
| ИЛИ ВТ_ТЗ2.Код ЕСТЬ NULL )
|ИТОГИ ПО
| ИмяТаблицы";

Запрос.УстановитьПараметр("ТЗ1", ТЗ1);
Запрос.УстановитьПараметр("ТЗ2", ТЗ2);

Результат = Запрос.Выполнить();

ВыборкаТаблица = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаТаблица.Следующий() Цикл
Сообщить("Таблица "+ВыборкаТаблица.ИмяТаблицы);
ВыборкаСтроки = ВыборкаТаблица.Выбрать();
Пока ВыборкаСтроки.Следующий() Цикл
Сообщить(" "+ВыборкаСтроки.Код+" "+ВыборкаСтроки.Товар);
КонецЦикла;
КонецЦикла;



В результате выполнения этого кода получилось след.
Таблица ТЗ1
001 Товар001
002 Товар002
Таблица ТЗ2
004 Товар004
Onotoley
22.09.2011 12:56Ответ № 2
Да, решение - просто супер! И работает очень быстро. Спасибо!!!
Только на выходе нужно получить еще и Код1. Сейчас пробую сам это сделать.
Где-бы посмотреть описание функций языка запросов 1С? А то немного запутался...
Dosipheja
22.09.2011 13:16Ответ № 3
Смотри в Конфигураторе
меню Справка - Содержание справки - Встроенный язык - Работа с запросами - Синтаксис языка запросов
Onotoley
22.09.2011 13:20Ответ № 4
Всё, разобрался и доделал как нужно. Еще раз большое Вам спасибо за помощь! )
Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.