Проблема при сравнении табличных частей в запросе

1. Anjut-ka4 02.10.17 17:37 Сейчас в теме
Здравствуйте! Подскажите, пожалуйста, в таком вопросе. В справочнике есть табличная часть с реквизитом1, например. При записи нового элемента справочника, я хочу проверить, есть ли такая же табличная часть у существующего элемента справочника. Порядок следования не важен. Т.е. если есть таб.часть со значениями знч1, знч2, знч3, а мы занесли новый элемент с табличной частью знч2, знч1, знч3, то мне это надо вывести в ошибку. Я хочу это сделать в запросе, пока не пойму как и можно ли вообще это сделать запросом.?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Skill 02.10.17 17:42 Сейчас в теме
Делаете полное соединение таблиц и отбираете по null, если есть хоть один null значит не равны
3. Anjut-ka4 03.10.17 15:59 Сейчас в теме
не полным, а левым соединением) вообщем, получилось)
5. Skill 04.10.17 13:01 Сейчас в теме
(3) если сделаете левым то у вас будет неправильный результат. Если в таблице слева зн1, зн2 а справа зн1, зн2, зн3 то при левом таблицы у вас будут равны, что не соответствует действительности.
4. splxgf 03.10.17 18:17 Сейчас в теме
А если есть табличная часть знч1, знч2, знч3, знч4 ваш запрос как отработает?
6. Anjut-ka4 04.10.17 21:06 Сейчас в теме
там не все так просто.. сначала левым соединением определяю, что совпало (ставлю 1), а где null (ставлю 0), учитывая ссылки конечно, потом считаю количество единиц по каждой ссылке (т.е. по каждой табличной части) и сравниваю, чтоб совпадало. Пока работает!)
7. Skill 05.10.17 10:32 Сейчас в теме
(6) Как отработает ваш вариант на вот такой набор данных? Если в таблице слева зн1, зн2 а справа зн1, зн2, зн2, зн1
8. Skill 05.10.17 10:44 Сейчас в теме
(6) Я вот такое для сравнения двух тз делал
Функция СравнитьДвеТЗ(ТЗ1, ТЗ2) Экспорт 
	Если НЕ ТипЗнч(ТЗ1) = Тип("ТаблицаЗначений") Тогда 
		Возврат Ложь;
	КонецЕсли;
	
	Если НЕ ТипЗнч(ТЗ2) = Тип("ТаблицаЗначений") Тогда 
		Возврат Ложь;
	КонецЕсли;
	
	//Количество строк в ТЗ
	Если ТЗ1.Количество() <> ТЗ2.Количество() Тогда 
		Возврат Ложь;
	КонецЕсли;
	
	//Количество колонок в ТЗ
	Если ТЗ1.Колонки.Количество() <> ТЗ2.Колонки.Количество() Тогда 
		Возврат Ложь;
	КонецЕсли;
		
	//Удаляем номер строки т.к. сортировка может отличаться
	Если Не ТЗ1.Колонки.Найти("НомерСтроки") = Неопределено Тогда  
		ТЗ1.Колонки.Удалить("НомерСтроки");
	КонецЕсли;
	Если Не ТЗ2.Колонки.Найти("НомерСтроки") = Неопределено Тогда  
		ТЗ2.Колонки.Удалить("НомерСтроки");
	КонецЕсли;
		
	Для Каждого Колонка Из ТЗ1.Колонки Цикл 
		КолонкиТЗ1 = ?(ЗначениеЗаполнено(КолонкиТЗ1), КолонкиТЗ1 + ", " +"ТЗ_1."+Колонка.Имя, "ТЗ_1."+Колонка.Имя);
		КолонкиЗапросУсловие = ?(ЗначениеЗаполнено(КолонкиЗапросУсловие), КолонкиЗапросУсловие + " И ТЗ_1."+Колонка.Имя + "= ТЗ_2."+ Колонка.Имя, "ТЗ_1."+Колонка.Имя + "= ТЗ_2."+ Колонка.Имя);
	КонецЦикла;
	
	Для Каждого Колонка Из ТЗ2.Колонки Цикл 
		КолонкиТЗ2 = ?(ЗначениеЗаполнено(КолонкиТЗ2), КолонкиТЗ2 + ", " +"ТЗ_2."+Колонка.Имя, "ТЗ_2."+Колонка.Имя);
	КонецЦикла;
		
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ТЗ1", ТЗ1);
	Запрос.УстановитьПараметр("ТЗ2", ТЗ2);
	Запрос.Текст = "ВЫБРАТЬ 
					|*
					|ПОМЕСТИТЬ ТЗ_1
					|ИЗ
					|	&ТЗ1 КАК ТЗ1
					|;
					|
					|////////////////////////////////////////////////////////////­////////////////////
					|ВЫБРАТЬ
					|*
					|ПОМЕСТИТЬ ТЗ_2
					|ИЗ
					|	&ТЗ2 КАК ТЗ2
					|
					|;
					|////////////////////////////////////////////////////////////­////////////////////
					|ВЫБРАТЬ " + КолонкиТЗ1 + ", " + КолонкиТЗ2 + " ИЗ ТЗ_1 ПОЛНОЕ СОЕДИНЕНИЕ ТЗ_2 ПО " + КолонкиЗапросУсловие; 
	
	Результат = Запрос.Выполнить().Выгрузить();
	
	Если Результат.Количество() <> ТЗ1.Количество() Тогда 
	    Возврат Ложь;
	Иначе 
		Возврат Истина;
	КонецЕсли;
	
КонецФункции
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот