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

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;

    КонецЦикла;

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

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

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

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

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

    Возврат РЗ;

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

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

См. также

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

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4682    Abysswalker    11    

46

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

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

14.05.2025    8709    DeerCven    15    

62

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

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

21.05.2024    56855    dimanich70    85    

174

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

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

1 стартмани

18.03.2024    8002    7    John_d    13    

59

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

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

12.02.2024    71419    atdonya    31    

72

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

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

30.11.2023    10003    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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/
Для отправки сообщения требуется регистрация/авторизация