gifts2017

Функции работы с Таблицей значений(объединить, сравнить, соединить)

Опубликовал Sergey (Sergey K) в раздел Программирование - Теория программирования

Часто встречаются задачи по работе с двумя ТЗ.
В файлике приведены 3 функции для:  Объединения, соединения и сравнения двух ТЗ по ключевому полю..  
м.б. кому-нибудь пригодится

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
-
.1215136295 6,84Kb
25.09.09
637
.1215136295 6,84Kb 637 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. kitt al;dskjf;ldasjkf (kitt) 04.07.08 09:19
Конечно пригодиться, спс
2. Евгений Мартыненков (JohnyDeath) 04.07.08 09:26
Посмотрите и погоняйте ИндексированнуюТаблицу. http://www.1cpp.ru/docum/icpp/html/IndexedTable.html
Теперь там есть даже:
ВнутреннееСоединение / InnerJoin
ЛевоеСоединение / LeftJoin
ПравоеСоединение / RightJoin
ПолноеСоединение / FullJoin
;)
lomok; n; vip; +3 Ответить 2
3. Герман (German) 04.07.08 09:37
а временные таблицы?.. конечно не очень производительно ...но все же
4. Sergey (Sergey K) 04.07.08 12:20
(2)
а "ИндексированнаяТаблица" не для 1с7.7?
как создать "ИндексированнаяТаблица"? - по Вашей ссылке только описание ее возможностей..
5. Евгений Мартыненков (JohnyDeath) 04.07.08 13:58
(4) Да, извиняюсь, это только для 7.7
6. Аркадий Кучер (Abadonna) 04.07.08 14:01
(2) Жень, да забудь ты про эту семерку со всеми к ней доделками: один фиг - это тюнигованные Жигули.
Как Жигули ни тюнингуй, все равно получишь... 7.7
7. vip (vip) 04.07.08 14:12
(6) Давай, давай забывай.
А меня 7.7 поит, кормит, с девками ложит.
И до-о-о-лго еще будет.
И тебя тоже, любитель прогресса ;))
8. Аркадий Кучер (Abadonna) 04.07.08 14:39
Меня, Андрей, кормит работодатель, и мне что ... подтаскивать, что.... оттаскивать... мне ваще 1С противна.... но раз платят.
Збянтэжаны Саўка; +1 Ответить
9. Аркадий Кучер (Abadonna) 04.07.08 14:42
Есть, конечно, и в бухгалтерии ничего себе так термины:
про водку, акт с Веркой ;)
Збянтэжаны Саўка; German; Romanius; +3 Ответить
10. newreactive (newreactive) 09.07.08 09:39
11. aga_aga (Збянтэжаны Саўка) 17.04.09 17:41
Спасибо, я пока учусь на Ваших примерах профи
Сорри, за маленькие замечания новичка если они не в тему:
(мои дополнения отмечены комментами: //aga)

В ф-ии СоединениеДвухТЗПоПолю:

Функция СоединениеДвухТЗПоПолю(ТЗПриемник, ТЗИсточник,
СтрПоляПриемника,
СтрПоляИсточника,
стрПолеСоединенияП,
стрПолеСоединенияИ = Неопределено) Экспорт

Если стрПолеСоединенияИ=Неопределено Тогда
стрПолеСоединенияИ = стрПолеСоединенияП;
КонецЕсли;

//Удаляем колонки, с типом NULL, т.к. в запросе с ВТ нельзя использовать такие поля
МассивПустыхКолонок = Новый Массив;
//aga+ здесь я бы хотел иметь возможность передавать свою строку полей приемника, и проверку включить, только если не передан список полей
Если НЕ ЗначениеЗаполнено(стрПоляПриемника) Тогда //aga+
ОписаниеТиповNULL = Новый ОписаниеТипов("NULL");
Для каждого Колонка Из ТЗПриемник.Колонки Цикл
Если Колонка.ТипЗначения = ОписаниеТиповNULL Тогда
МассивПустыхКолонок.Добавить(Колонка.Имя);
Иначе
Если Не стрПоляПриемника = "" Тогда
стрПоляПриемника = стрПоляПриемника + ",";
КонецЕсли;
стрПоляПриемника = стрПоляПриемника + Колонка.Имя;
КонецЕсли;
КонецЦикла;
КонецЕсли; //aga+

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| вТабПриемник." + стрПоляПриемника + "
|ПОМЕСТИТЬ вТабПриемник
|ИЗ &ТЗПриемник КАК вТабПриемник
|;
|//__________________________________________________________­___________


// таблица-источник
|ВЫБРАТЬ
| вТабИсточник." + стрПолеСоединенияИ + ",
| " + СтрПоляИсточника + "
|ПОМЕСТИТЬ вТабИсточник
|ИЗ &ТЗИсточник КАК вТабИсточник
|;
|//__________________________________________________________­___________

// объединяем две таблицы
|ВЫБРАТЬ
| вТабПриемник.*,
| " + СтрПоляИсточника + "
|ИЗ
| вТабПриемник КАК вТабПриемник
| ЛЕВОЕ СОЕДИНЕНИЕ вТабИсточник КАК вТабИсточник
| ПО вТабПриемник." + стрПолеСоединенияП + " = вТабИсточник." + стрПолеСоединенияИ + "
|УПОРЯДОЧИТЬ ПО
//|" + СтрПолеИсточника; //aga- ошибочка надо стрполЯисточника
|вТабПриемник." + стрПоляПриемника; // aga+. Имхо приемник главнее, так что по нему важнее сортировать, но в общем случае все же это излишне, т.к. в полученном ТЗ потом можно отсортировать выборочно и как угодно, без лишних полей из этого списка в запросе.

Запрос.УстановитьПараметр("ТЗПриемник", ТЗПриемник);
Запрос.УстановитьПараметр("ТЗИсточник", ТЗИсточник);
ТЗРез = Запрос.Выполнить().Выгрузить();

Для каждого ПустаяКолонка Из МассивПустыхКолонок Цикл
ТЗРез.Колонки.Добавить(ПустаяКолонка);
ТЗРез.ЗаполнитьЗначения(NULL,ПустаяКолонка);
КонецЦикла;

Возврат ТЗРез;
КонецФункции //СоединениеДвухТЗПоПолю

Кстати, интересная ситуация, попробовал было эту ф-ию применить два раза к одной исходной ТЗ, ибо одним запросом все поля заполнить невозможно, но увы что-то не так как ожидается работает, глюк пока не знаю где искать у меня в коде или в платформе, будет время посижу, а счас его нет к сож., потому решил свою задачу простым перебором в лоб сравнивая две ТЗ в цикле построчно без использования этой ф-ии (т.е. без запросов). Но проблема заинтересовала своей странностью на ровном месте.
12. aga_aga (Збянтэжаны Саўка) 17.04.09 17:45
пардон а как укоротить свой пост?
13. spryn (spryn) 13.10.11 23:28
Отлично, пригодилось
14. Станислав Бобровский (GrafB) 22.10.11 19:54
aga aga помести свой код в (CODE][/CODE) //вместо круглых квадратные скобки
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа