Имя: Пароль:
1C
 
Отбор документов по совпадению реквизитов в табличной части документа.
, ,
0 Nikk100
 
28.11.24
10:41
Задача — отобрать договора, в которых есть несовпадение реквизитов со ссылкой на обучающегося и его табличной части с этими же ссылками. Пытался сам, но что-то с методом Найти() не так, я уже с разных сторон пробовал, не находит совпадения, считает их все несовпадающими. Пробовал обойти метод Найти() через подсчет совпадений, тоже без результата.

Код функции такой:
	МассивДоговоров = новый Массив ();
	Выборка = Документы.Договор.Выбрать();
	Пока Выборка.Следующий() Цикл
		СписокСлушателей = новый СписокЗначений;
		Если Не Выборка.Обучающийся1.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся1)
		КонецЕсли;
		Если Не Выборка.Обучающийся2.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся2)
		КонецЕсли;
		Если Не Выборка.Обучающийся3.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся3)
		КонецЕсли;
		Если Не Выборка.Обучающийся4.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся4)
		КонецЕсли;
		Если Не Выборка.Обучающийся5.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся5)
		КонецЕсли;
		Если Не Выборка.Обучающийся6.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся6)
		КонецЕсли;
		Если Не Выборка.Обучающийся7.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся7)
		КонецЕсли;
		Если Не Выборка.Обучающийся8.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся8)
		КонецЕсли;
		Если Не Выборка.Обучающийся9.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся9)
		КонецЕсли;
		Если Не Выборка.Обучающийся10.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся10)
		КонецЕсли;
		Если Не Выборка.Обучающийся11.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся11)
		КонецЕсли;
		Если Не Выборка.Обучающийся12.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся12)
		КонецЕсли;
		Если Не Выборка.Обучающийся13.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся13)
		КонецЕсли;
		Если Не Выборка.Обучающийся14.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся14)
		КонецЕсли;
		Если Не Выборка.Обучающийся15.Пустая() тогда
			СписокСлушателей.Добавить(Выборка.Обучающийся15)
		КонецЕсли;
		Если СписокСлушателей.Количество()<> 0 тогда
			Если Выборка.Список.Количество() > СписокСлушателей.Количество()тогда
				Для каждого ТекущаяСтрока из Выборка.Список цикл
					Если СписокСлушателей.НайтиПоЗначению(ТекущаяСтрока) = неопределено тогда
						СтруктураДоговора = новый Структура;
						СтруктураДоговора.Вставить("ДоговорНомер",Выборка.Номер);
						СтруктураДоговора.Вставить("ДоговорДата",Выборка.Дата);
						СтруктураДоговора.Вставить("СлушательВСписке","отсутствует");
						СтруктураДоговора.Вставить("СлушательВТаблице",ТекущаяСтрока.КарточкаСлушателя);
						МассивДоговоров.Добавить(СтруктураДоговора);
					КонецЕсли;
				КонецЦикла; 
			Иначе
				Для каждого Элемент из СписокСлушателей цикл
					Совпадение = 0;
					Для каждого ТекущаяСтрока из Выборка.Список цикл
						Если ТекущаяСтрока.КарточкаСлушателя.Фамилия = Элемент.Значение.Фамилия тогда
							Совпадение = Совпадение + 1;
						КонецЕсли;
					КонецЦикла;	
					Если Совпадение = 0 тогда
						СтруктураДоговора = новый Структура;
						СтруктураДоговора.Вставить("ДоговорНомер",Выборка.Номер);
						СтруктураДоговора.Вставить("ДоговорДата",Выборка.Дата);
						СтруктураДоговора.Вставить("СлушательВСписке",Элемент.Значение);
						СтруктураДоговора.Вставить("СлушательВТаблице","отсутствует");
						МассивДоговоров.Добавить(СтруктураДоговора);
					КонецЕсли;
					
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;			
		
	КонецЦикла;
	Возврат МассивДоговоров;
2 Волшебник
 
28.11.24
10:40
Зачем убрали начало и конец функции? Как называется функция? Какие параметры?
3 Nikk100
 
28.11.24
10:51
(2) Функция СортировкаДоговор()
4 Nikk100
 
28.11.24
10:52
(2) Это внешняя обработка
5 Волшебник
 
28.11.24
10:53
(3) Плохое название функции
6 Nikk100
 
28.11.24
10:56
Если смотреть на задачу глобальнее, то суть задачи найти не до заполненные табличные части договоров, а потом избавиться от отдельных реквизитов Обучающиеся1 и Обучающийся2 и т.д.
7 Волшебник
 
28.11.24
11:00
(6) Похоже на план
8 2S
 
28.11.24
11:52
(0) Цикл? Не, не слышали.
9 youalex
 
28.11.24
12:11
(0)
Запросом собери в таблицу через объединение
ВЫБРАТЬ Ссылка, Обучающийся1 КАК Обучающийся ПОМЕСТИТЬ ВТШапка
ИЗ Документ.Договор
ОБЪЕДИНИТЬ
ВЫБРАТЬ Ссылка, Обучающийся2 ПОМЕСТИТЬ ВТШапка
ИЗ Документ.Договор
....

потом Левое соединение с ТЧ
... ГДЕ ТЧ.Ссылка IS NULL И ВТШапка.Обучающийся <> &ПустаяСсылка
10 Мультук
 
гуру
28.11.24
12:36
(0)

Обучающийся1

и

КарточкаСлушателя

Это одинаковые типы ?

Если да -- пишем запрос (ВТ_ИНДИЙСКИЕ_ОБУЧ нужно дописать ради пример первые два реквизита
ВЫБРАТЬ
	т1.ссылка, 
	т1.Обучающийся1 как Обучающийся
ПОМЕСТИТЬ ВТ_ИНДИЙСКИЕ_ОБУЧ
ИЗ 
   Документ.Договор как т1
ГДЕ
	т1.Обучающийся1 <> &ПустаяСсылкаОбучающийся

ОБЪЕДИНИТЬ	 

ВЫБРАТЬ
	т1.ссылка, 
	т1.Обучающийся2 как Обучающийся
ИЗ 
   Документ.Договор как т1
ГДЕ
	т1.Обучающийся2 <> &ПустаяСсылкаОбучающийся

;

ВЫБРАТЬ
	т1.ссылка, 
	т1.КарточкаСлушателя как Обучающийся
ПОМЕСТИТЬ ВТ_ОБУЧ
ИЗ 
   Документ.Договор.Список как т1
;

ВЫБРАТЬ 
	т1.ссылка, 
	т1.Обучающийся
ИЗ
	ВТ_ИНДИЙСКИЕ_ОБУЧ как т1

	ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОБУЧ как т2
	ПО т1.ссылка = т2.ссылка и т1.Обучающийся = т2.Обучающийся
ГДЕ	
	т2.ссылка IS NULL
11 Nikk100
 
29.11.24
11:06
(10) Переписал вот так. С запросами туго (надеюсь пока), строго не судите, но не работает, что-то неправильно понял, но вот что?
функция
Функция СортировкаДоговора()

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся1.Ссылка КАК Обучающийся
        |ПОМЕСТИТЬ СписОбуч
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся1.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся2.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся2.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся3.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся3.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся4.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся4.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся5.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся5.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся6.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся6.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся7.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся7.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся8.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся8.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся9.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся9.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся10.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся10.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся11.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся11.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся12.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся12.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся13.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся13.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся14.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся14.Ссылка <> &ПустаяСсылкаОбучающийся
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Договор.Ссылка,
        |    Договор.Обучающийся15.Ссылка
        |ИЗ
        |    Документ.Договор КАК Договор
        |ГДЕ
        |    Договор.Обучающийся15.Ссылка <> &ПустаяСсылкаОбучающийся
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    СписОбуч.Обучающийся,
        |    Договор.Ссылка
        |ИЗ
        |    СписОбуч КАК СписОбуч
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Договор КАК Договор
        |        ПО СписОбуч.Ссылка = Договор.Список.КарточкаСлушателя.Ссылка
        |            И СписОбуч.Обучающийся.Договор.Ссылка = Договор.Ссылка
        |ГДЕ
        |    СписОбуч.Ссылка ЕСТЬ NULL";
    
    Запрос.УстановитьПараметр("ПустаяСсылкаОбучающийся", Документы.КарточкаСлушателя.ПустаяСсылка());
    
    РезультатЗапроса = Запрос.Выполнить();
    МассивСлушателей = новый Массив ();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        НоваяСтруктура = новый Структура();
        НоваяСтруктура.Вставить("Слушатель",ВыборкаДетальныеЗаписи.Обучающийся);
        НоваяСтруктура.Вставить("ДоговорНомер",ВыборкаДетальныеЗаписи.Ссылка.Номер);
        НоваяСтруктура.Вставить("ДоговорДата",ВыборкаДетальныеЗаписи.Ссылка.Дата);
        МассивСлушателей.Добавить(НоваяСтруктура);
    КонецЦикла;
    Возврат МассивСлушателей;
    
КонецФункции
12 Волшебник
 
29.11.24
11:05
(11) чушь какая-то
13 Ненавижу 1С
 
гуру
29.11.24
11:11
маловато обучающихся. 15 - это несерьезно
14 Nikk100
 
29.11.24
11:15
(13) 15 отдельных реквизитов Обучающихся в документе
15 Nikk100
 
29.11.24
11:20
(12) Чушь возникает от непонимания, а хочется понять.
16 Волшебник
 
29.11.24
11:20
(15) Всё сотрите и сделайте нормально.
17 Волшебник
 
29.11.24
11:24
(14) Обращаться можно так:

Для н = 1 По 15 Цикл
  значение = объект["обучающийся" + н];
КонецЦикла;
18 Nikk100
 
29.11.24
11:31
(16) Чтобы сделать нормально нужно понять где ненормально. Я понял так. Первая часть запроса собирает всех Обучаюoихся(1-15) во временную таблицу. Во второй части выбирается из объединенной таблицы (временная + табличная часть) где есть в колонке от временной таблице NULL.
19 Волшебник
 
29.11.24
11:31
(18) Уберите запрос. Пишите циклы
20 youalex
 
29.11.24
12:19
(15) если хочется понять, ответь что такое "ЛЕВОЕ СОЕДИНЕНИЕ"  что такое NULL и что за условие IS NULL (ЕСТЬ NULL)
+ у тебя соединение не с ТЧ?
21 Nikk100
 
29.11.24
17:39
(19) Подскажите в чем дело.

                        Для каждого СтрТЧ из Выборка.Список Цикл
                Стр = СтрТЧ.КарточкаСлушателя.Ссылка;
                СписокТЧ.Добавить(СтрТЧ.КарточкаСлушателя.Ссылка);
            КонецЦикла;

Переменная СтрТЧ содержит строку табличной части документа, а при обращении к значениям строки в ней содержится "{<Неизвестный модуль>(1,1)}: Переменная не определена (Стр)". Я правильно понимаю что СтрТЧ это значения полей текущей строки при переборе строк в таблице?
22 Волшебник
 
29.11.24
18:13
(21) Вы понимаете неправильно
23 Nikk100
 
29.11.24
19:01
(22) Я наверно коряво описал свое понимание. Все заработало. Проблема была не в этом цикле. Спасибо огромное.
24 Nikk100
 
29.11.24
19:14
(20) Скорее всего понимание перечисленного есть, а вот правильного понимания языка запросов местами нет. А хотелось бы. Все в наших, и с помощью ваши, руках (головах). Спасибо.
25 Волшебник
 
29.11.24
19:47
(23) Покажите программный код
26 Волшебник
 
29.11.24
19:48
(24) Не надо пустых слов. Покажите настоящий работающий программный код.
27 Nikk100
 
29.11.24
20:14
(26) Есть в настройках форума уведомления о новых сообщениях в теме, на почту например? А то случайно заметил два последних. Уже уходить хотел.

Функция СортировкаДоговора()
    МассивДоговоров = новый Массив ();
    Выборка = Документы.Договор.Выбрать();
    Пока Выборка.Следующий() Цикл
        СписокСлушателей = новый СписокЗначений;
        Для Н = 1 по 15 Цикл
            Слушатель = Выборка["Обучающийся" + Н];
            Пусто = Документы.КарточкаСлушателя.ПустаяСсылка();
            Если Не Слушатель = Пусто тогда
                СписокСлушателей.Добавить(Слушатель);
            КонецЕсли;
        КонецЦикла;
        
        //Колич = Выборка.Список.Количество();
        
        Если СписокСлушателей.Количество()<> 0 тогда
            СписокТЧ = новый СписокЗначений;
            Для каждого СтрТЧ из Выборка.Список Цикл
                Стр = СтрТЧ.КарточкаСлушателя.Ссылка;
                СписокТЧ.Добавить(Стр);
            КонецЦикла;
            
            Если Выборка.Список.Количество() > СписокСлушателей.Количество()тогда
                //Строк = новый Массив;    
                //Строк = Выборка.Список.Получить(0);
                //Строк1 = Строк.КарточкаСлушателя.Ссылка;
                
                Для каждого Элемента из СписокТЧ цикл
                    
                    Если СписокСлушателей.НайтиПоЗначению(Элемента.Значение) = неопределено тогда
                        СтруктураДоговора = новый Структура;
                        СтруктураДоговора.Вставить("ДоговорНомер",Выборка.Номер);
                        СтруктураДоговора.Вставить("ДоговорДата",Выборка.Дата);
                        СтруктураДоговора.Вставить("СлушательВСписке","отсутствует");
                        СтруктураДоговора.Вставить("СлушательВТаблице",Элемента.Значение);
                        МассивДоговоров.Добавить(СтруктураДоговора);
                    КонецЕсли;
                КонецЦикла;
            Иначе
                Для каждого Элемент из СписокСлушателей цикл
                    Если СписокТЧ.НайтиПоЗначению(Элемент.Значение) = неопределено тогда
                        СтруктураДоговора = новый Структура;
                        СтруктураДоговора.Вставить("ДоговорНомер",Выборка.Номер);
                        СтруктураДоговора.Вставить("ДоговорДата",Выборка.Дата);
                        СтруктураДоговора.Вставить("СлушательВСписке",Элемент.Значение);
                        СтруктураДоговора.Вставить("СлушательВТаблице","отсутствует");
                        МассивДоговоров.Добавить(СтруктураДоговора);
                    КонецЕсли;
                    
                КонецЦикла;
            КонецЕсли;
        КонецЕсли;            
        
    КонецЦикла;
    Возврат МассивДоговоров;
КонецФункции
28 Волшебник
 
29.11.24
20:19
(27) Уведомлений нет.

Ваш программный код начал показывать, что Вы не безнадёжны и понимаете рекомендации. С Вами можно работать.
29 Волшебник
 
29.11.24
20:20
Это Вы сюда должны заходить за светлой мыслью, а не мы должны Вам пропихивать нашу светлую мысль в Вашу тёмную голову.
Диспозиция понятна?
30 Nikk100
 
29.11.24
20:34
(29) Понятна. Посыл был не пропустить важное. Еще раз спасибо.
31 Волшебник
 
29.11.24
20:35
(30) 💖
32 lEvGl
 
гуру
29.11.24
21:03
о как к концу оптимизировали 👍
33 Волшебник
 
29.11.24
21:04
(32) Явно стало лучше. Человек пойдёт!