Функция сравнения двух таблиц

27.07.12

Разработка - Универсальные функции

Сравнение/склейка двух таблиц значений по произвольным колонкам. Пример формирования запроса для сравнения.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
СравнениеФайловExcel
.epf 15,13Kb
45 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • Поиск от одного разработчика до ИТ-команд под проект.
  • Обмен любыми контактами разрешён.
  • 0% комиссии, допускаются расчёты напрямую.

Не претендуя на какое-то открытие, просто в качестве примера динамического формирования текста запроса, вашему вниманию:

Функция для сравнения/склеивания двух таблиц по произвольным колонкам запросом.

В прикрепленных файлах пример использования - обработка для склейки двух ексель-файлов по выбранным колонкам.

 

Параметры функции:

тзОдин, тзДва - таблицы значений для сравнения.

КолонкиДляСравнения - таблица значений с колонками: Колонки1, Колонки2, содержащая имена колонок соответственно первой и второй таблиц, по которым нужно склеивать таблицы.

ВыводитьРавные - булево, добавлять или нет в результирующую таблицу найденные по соответствию строки.


Функция СравнитьДанные(тзОдин,тзДва,КолонкиДляСравнения,ВыводитьРавные=Истина)

   
Запрос = Новый Запрос;

   
ТекстЗапроса = "
    |ВЫБРАТЬ "
;

    Для
инд=0 по тзОдин.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзОдин."
+тзОдин.Колонки[инд].Имя+" КАК "+тзОдин.Колонки[инд].Имя+",";

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |""ПоследнийСтолбец"" как ДляЗавершения__
    |ПОМЕСТИТЬ тзОдин
    |ИЗ
    |   &тзОдин КАК тзОдин
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ"
;

    Для
инд=0 по тзДва.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзДва."
+тзДва.Колонки[инд].Имя+" КАК "+тзДва.Колонки[инд].Имя+",";

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |""ПоследнийСтолбец"" как ДляЗавершения__
    |ПОМЕСТИТЬ тзДва
    |ИЗ
    |   &тзДва КАК тзДва
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ"
;

    Для
инд=0 по тзОдин.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзОдин."
+тзОдин.Колонки[инд].Имя+" КАК "+тзОдин.Колонки[инд].Имя+"_1,";

    КонецЦикла;

    Для
инд=0 по тзДва.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзДва."
+тзДва.Колонки[инд].Имя+" КАК "+тзДва.Колонки[инд].Имя+"_2,";

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |   ВЫБОР
    |       КОГДА (НЕ тзДва."
+тзДва.Колонки[0].Имя+" ЕСТЬ NULL и не тзОдин."+тзОдин.Колонки[0].Имя+" ЕСТЬ NULL)
    |           ТОГДА ИСТИНА
    |       ИНАЧЕ ЛОЖЬ
    |   КОНЕЦ КАК ЕстьКонтакт
    |ИЗ
    |   тзОдин КАК тзОдин
    |       Полное СОЕДИНЕНИЕ тзДва КАК тзДва
    |       ПО Истина"
;

    Для
инд = 0 По КолонкиДляСравнения.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |   И тзОдин."
+КолонкиДляСравнения[инд].Колонки1+" = тзДва."+КолонкиДляСравнения[инд].Колонки2;

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |"
;

   
Запрос.УстановитьПараметр("тзОдин", тзОдин);
   
Запрос.УстановитьПараметр("тзДва", тзДва);

   
Запрос.Текст = ТекстЗапроса;

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

    Если не
ВыводитьРавные тогда
       
Отбор = Новый Структура("ЕстьКонтакт",Истина);
       
СтрокиДляУдаления = РЗ.НайтиСтроки(Отбор);
        Для каждого
удСтрока из СтрокиДляУдаления Цикл
           
РЗ.Удалить(удСтрока);
        КонецЦикла;
    КонецЕсли;

    Возврат РЗ;

КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Разберем самые частые способы создания коллекции, значения которой известны заранее. И сравним скорость их выполнения.

28.10.2019    13350    SeiOkami    69    

71

Универсальные функции Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Сразу открою интригу, напрямую прочитать XML, не содержащий объект 1С, не удастся. Статья раскрывает способы привести XML к формату, который возможно прочитать средствами платформы.

24.10.2019    32507    kraspila    33    

66

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

Устали переключаться с русского на английский и обратно при работе с таблицами Excel из 1С? Сборка наиболее необходимых функций и методов работы с Excel, обернутых в функции 1С на русском языке.

24.10.2019    10436    DmitryKotov    6    

57

Сканер штрих-кода Универсальные функции 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Абонемент ($m)

Вывод QR-кода типовыми средствами. На данный момент очень часто нужно вывести в печатную форму QR-код. Показываю как на примере типового кода из УТ11 это сделать. Можно использовать в любых конфигурациях с обычными формами.

1 стартмани

21.10.2019    86395    188    Емельянов Алексей    58    

59

Универсальные функции Программист 1С:Предприятие 8 1С:Управление производственным предприятием Бесплатно (free)

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

17.10.2019    30443    aximo    35    

77

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Бесплатно (free)

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    60723    HostHost    41    

294

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

1 стартмани

03.10.2019    21575    nekit_rdx    27    

43

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример решения простой и распространенной задачи - автоматическое создание документа на основании другого документа.

16.09.2019    35439    Infostart    38    

81
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 342 01.08.12 08:12 Сейчас в теме
А алгоритм vde69 не смотрела?
Он наверное быстрее будет.
2. catena 110 01.08.12 08:29 Сейчас в теме
(1)Не видела, есть ссылка?
8. Bublik2011 9 17.01.13 21:00 Сейчас в теме
Прекрасная функция (2) catena! Очень полезная. Могу пример привести, как еще можно использовать публикацию. Вот например у нас на складе при инвентаризации женщина пишет в журнале с нумерованными строками, а я сканирую товар. Можно вместо "крыжить" занести бумажный журнал в Excel или сразу в ЭтотДокумент :) \см.фото\


Применил другую функцию для сравнения (код не "причесал", извини:)


	ДокументДок = ЭтотОбъект.Ссылка; 
	Таб1 = ДокументДок.Товары.Выгрузить();
	Таб2 = ДокументДок.Список.Выгрузить();
СтрокаН = Таб1.Количество() - 1; 
Для Сч1 = 0 по СтрокаН Цикл
 Состояние("СтрокаН равна: "+Строка(Сч1+1)+" из "+Строка(СтрокаН));

							Строка1=ЭтотОбъект.Товары[Сч1];
	Таб1ЦенаСтрокаН=Строка1.Цена;//Таб1ЦенаСтрокаН=Таб1[Сч1].Цена;  
 	
		СтрокаНН = Таб2.Количество() - 1;
 
		Для Сч2 = 0 по СтрокаНН Цикл
			 //Состояние("СтрокаН равна: "+Строка(Сч1+1)+" из всего "+Строка(СтрокаН)+" - строка НН:"+Строка(Сч2+1));
							 Если Строка1.Количество=0 Тогда
				               Сч2=СтрокаНН;
									 //Прервать;
							КонецЕсли;
							Строка2=ЭтотОбъект.Список[Сч2]; 
	Таб2ЦенаСтрокаНН=Строка2.Цена;//Таб2ЦенаСтрокаН=Таб2[Сч2].Цена;
	ЕстьЧегоУбавлять=1;

 	           Пока ЕстьЧегоУбавлять=1 Цикл

					   Если Строка2.Количество>0 Тогда
		 			ЕстьЧегоУбавлять=1;	   
 				

 								
							Если Строка1.Количество>0		Тогда
		 			ЕстьЧегоУбавлять=1;	   
 	

 
                                Если Строка2.Цена=Строка1.Цена Тогда
							   		Строка2.Количество=Строка2.Количество-1;//Таб2[Сч2].Количество=Таб2[Сч2].Количество-1;
							   		Строка1.Количество=Строка1.Количество-1;//Таб1[Сч1].Количество=Таб1[Сч1].Количество-1;
									Если СтавитьИсточникЗаписи Тогда
									Строка1.Примечание=СокрЛП(Строка2.СтрокаЗаписи);
									Строка2.Примечание=СокрЛП(Строка1.СтрокаЗаписи);
									КонецЕсли;
									
									 Иначе	
									ЕстьЧегоУбавлять=0;
							    КонецЕсли;
							 Иначе
					ЕстьЧегоУбавлять=0;
 					 Прервать;

						   КонецЕсли;
						   
					   Иначе
					ЕстьЧегоУбавлять=0;
 
					 Прервать;
					   КонецЕсли;
				КонецЦикла;		   
					   
		КонецЦикла;	


Показать
Прикрепленные файлы:
3. vec435 17 01.08.12 14:49 Сейчас в теме
если колонки не строго типизированы, то ВТ не получится
4. unknownDaemon 44 07.11.12 12:54 Сейчас в теме
А чего бы не так, как во вложении у мну? Просто, сударь, на кой черт нужны запросы, если потом результат прочесывается в циклах? :)))
Ну и … если надобно — можно еще и добавить логику анализа удаленных строк, например…
Прикрепленные файлы:
СравнениеТаблиц.txt
5. catena 110 07.11.12 12:57 Сейчас в теме
(4)Вложения не вижу. Вы о том, что можно удалять равные прямо в запросе? Ну да, логично :)
6. unknownDaemon 44 07.11.12 13:00 Сейчас в теме
(5) ссорь… не сразу прикрепился файл… Не только удалять равные, но разницу выводить в вариантах, например группировать… Псмотри файлик… ;-)
7. catena 110 07.11.12 14:26 Сейчас в теме
(6)Посмотрела. Не очень удобно, не каждая таблица имеет колонку НомерСтроки. И как искать среди колонок какой строке исходных таблиц что принадлежит?
9. nikolka75 72 06.04.13 14:30 Сейчас в теме
Функция не работае.
Только потратил время.
10. nikolka75 72 06.04.13 14:43 Сейчас в теме
Была ошибка:
Тип не может быть выбран в запросе.
1) Решение нашол (необходимо типизировать колонки ТЗ) но лучше чтобы обработка решала это сама.
2) Очень неудобный способ задания колонок,
лучше в строке, если пустая то автоматом по колонкам с совпадающими именами.
11. kbjy 21 02.10.14 07:42 Сейчас в теме
Спасибо. Очень помогло.
12. It-developer 26 31.07.20 10:40 Сейчас в теме
В этом что-то есть, но необходимо доработать. Возможно возьму за основу. Заметил, что часто приходится писать похожий код для сравнения таблиц. Сейчас думаю сделать функции, которыми можно получить левое, правое, полное, внутреннее соединения. Разницу можно получить так https://infostart.ru/public/326983/
Для отправки сообщения требуется регистрация/авторизация