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

27.07.12

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

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

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

Наименование Файл Версия Размер
СравнениеФайловExcel
.epf 15,13Kb
45
.epf 15,13Kb 45 Скачать

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

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

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

 

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

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

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

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


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

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

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

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

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

    КонецЦикла;

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

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

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

    КонецЦикла;

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

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

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

    КонецЦикла;

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

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

    КонецЦикла;

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

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

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

    КонецЦикла;

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

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

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

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

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

    Возврат РЗ;

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

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

1 стартмани

18.03.2024    2676    0    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4613    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3962    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8840    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 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    16148    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 339 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 15 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 24 31.07.20 10:40 Сейчас в теме
В этом что-то есть, но необходимо доработать. Возможно возьму за основу. Заметил, что часто приходится писать похожий код для сравнения таблиц. Сейчас думаю сделать функции, которыми можно получить левое, правое, полное, внутреннее соединения. Разницу можно получить так https://infostart.ru/public/326983/
Оставьте свое сообщение