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

27.07.12

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
СравнениеФайловExcel
.epf 15,13Kb
45
45 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

 

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

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

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

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


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

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

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

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

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

    КонецЦикла;

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

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

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

    КонецЦикла;

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

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

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

    КонецЦикла;

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

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

    КонецЦикла;

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

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

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

    КонецЦикла;

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

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

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

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

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

    Возврат РЗ;

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

См. также

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

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    29714    dimanich70    83    

151

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4895    6    John_d    11    

57

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    32902    atdonya    26    

59

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    6485    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    17895    YA_418728146    8    

171

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4758    78    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19709    188    sapervodichka    112    

137
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 340 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/
Оставьте свое сообщение