Рано или поздно, каждый из нас сталкивается с большими объемами данных. Пока объем данных невелик, таблицы значений можно сопоставлять перебором, при большом объеме перебор может длится часами. Однажды мне стало необходимо сопоставить загруженную из Excel табличку на 500 тыс. строк с другой такой же на 7 тыс. строк. И тут на помощь пришел запрос.
Я также активно использую запросы к ТЗ при работе с mysql, я перегружаю таблицы сайта в ТЗ, а потом с помощью запросов их уже обрабатываю.
Рассмотрим на примере, как можно обратиться к таблице значений с помощью запроса.
//Создаем новую таблицу значений
ТЗОстатки = Новый ТаблицаЗначений;
//Описываем первую колонку "Номенклатура" с типом данных "строка"
КС = Новый КвалификаторыСтроки(40);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
ТЗОстатки.Колонки.Добавить("Номенклатура", ОписаниеТиповС);
Массив.Очистить();
//Описываем вторую и третью колонки "НомерПоКаталогу"
//и "Остаток" с типом данных "число"
КЧ = Новый КвалификаторыЧисла(10,0);
Массив = Новый Массив;
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , КЧ);
ТЗОстатки.Колонки.Добавить("НомерПоКаталогу", ОписаниеТиповЧ);
ТЗОстатки.Колонки.Добавить("Остаток", ОписаниеТиповЧ);
//Заполним ТЗОстатки
Пока ВыборкаОстатки.Следующий() Цикл
НоваяСтрока = ТЗОстатки.Добавить();
НоваяСтрока.Номенклатура = ВыборкаОстатки.Номенклатула;
НоваяСтрока.НомерПоКаталогу = ВыборкаОстатки.НомерПоКаталогу;
НоваяСтрока.Остаток = ВыборкаОстатки.Остаток;
КонецЦикла;
Массив.Очистить();
//Создаем и заполняем вторую таблицу значений
ТЗЦены = Новый ТаблицаЗначений;
КЧ = Новый КвалификаторыЧисла(15,2);
Массив = Новый Массив;
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , КЧ);
ТЗЦены.Колонки.Добавить("НомерПоКаталогу", ОписаниеТиповЧ);
ТЗЦены.Колонки.Добавить("Цена", ОписаниеТиповЧ);
Пока ВыборкаЦены.Следующий() Цикл
НоваяСтрока = ТЗЦены.Добавить();
НоваяСтрока.НомерПоКаталогу = ВыборкаЦены.НомерПоКаталогу;
НоваяСтрока.Цена = ВыборкаЦены.Цена;
КонецЦикла;
Массив.Очистить();
Запрос = Новый Запрос;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст =
//Перегружаем ТЗОстатки во временную таблицу ВТТЗОстатки
"ВЫБРАТЬ
| Таб1.Номенклатура КАК Номенклатура,
| ВЫРАЗИТЬ(Таб1.НомерПоКаталогу КАК ЧИСЛО(10, 0)) КАК НомерПоКаталогу,
| Таб1.Остаток КАК Остаток
|ПОМЕСТИТЬ ВТТЗОстатки
|ИЗ
| &Остатки КАК Таб1
|;
|
|/////////////////////////////////////////////////////////////////////////
//Перегружаем ТЗЦены во временную таблицу ВТТЗЦены
|ВЫБРАТЬ
| ВЫРАЗИТЬ(Таб2.НомерПоКаталогу КАК ЧИСЛО(10, 0)) КАК НомерПоКаталогу,
| Таб2.Цена КАК Цена
|ПОМЕСТИТЬ ВТТЗЦены
|ИЗ
| &Цены КАК Таб2
|ГДЕ
| ЕСТЬNULL(Таб2.НомерПоКаталогу, 0) > 0
|;
|
|/////////////////////////////////////////////////////////////////////////
//Сопоставляем таблицы по полю НомерПоКаталогу
|ВЫБРАТЬ
| ВрТабОстатки.Номенклатура,
| ВрТабОстатки.НомерПоКаталогу,
| ВрТабОстатки.Остаток,
| ВрТабЦены.Цена
|ИЗ
| ВТТЗОстатки КАК ВрТабОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ ВТТЗЦены КАК ВрТабЦены
| ПО ВрТабОстатки.НомерПоКаталогу = ВрТабЦены.НомерПоКаталогу";
Запрос.УстановитьПараметр("Остатки",ТЗОстатки);
Запрос.УстановитьПараметр("Цены",ТЗЦены);
Результат = Запрос.Выполнить();
За основу была взята статья help1c.com | Запрос к Таблице Значений
Комментариев нет:
Отправить комментарий