1С 7.7 Объединение 2 таблиц значений

1. kulkrise 3 14.07.17 15:10 Сейчас в теме
Добрый день, Форумчане!
Помогите, пожалуйста, разобраться с объединением 2-х ТЗ.
1С Бухгалтерия 7.7, релиз 7.70.628.

ТЗ_1 - это данные из документа "Выписка".
ТЗ_1 - это данные из документа "Выписка".
ТЗ_1.КоррСчет    |  ТЗ_1.Субконто1      |   ТЗ_1.Субконто2   |   ТЗ_1.Приход
62.1                Чайный клуб             Договор 001          300
62.1                Иванов                  Договор 001          500
62.1                Пионер                  Договор 005          100

ТЗ_2 - это список всех контрагентов
ТЗ_2.Код        |   ТЗ_2.Наименование   |   ТЗ_2.ПолнНаименование
00001               Иванов                  ИП Иванов А.А.
00002               Петров                  ИП Петров И.И.
...
00053               Пионер                  ООО "Пионер"
00054               Статус                  ЗАО "Статус"
...
00177               Чайный клуб             ООО "Чайничек"
Показать

нужно из ТЗ_2 в ТЗ_1 добавить Код и ПолнНаименование, если такой контрагент присутствует в ТЗ_1.
Пробую циклом
	ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
	ТЗ2.НоваяКолонка("КК","Строка",5);
	ТЗ2.НоваяКолонка("Наименование2","Строка",50);
	ТЗ2.НоваяКолонка("ПолнНаименование","Строка",50);
	СпрКонтр = СоздатьОбъект("Справочник.Контрагенты");
	СпрКонтр.ВыбратьЭлементы();
	Пока СпрКонтр.ПолучитьЭлемент() = 1 Цикл
		Если СпрКонтр.ЭтоГруппа()=1 Тогда // Без групп
			Продолжить;
		КонецЕсли;
		Родитель=СпрКонтр.Родитель;
		Если СокрЛП(Родитель)="ДОМБАЙ УСН" Тогда
			ТЗ2.НоваяСтрока();
			ТЗ2.КК = СпрКонтр.Код;
			ТЗ2.Наименование2 = СокрЛП(СпрКонтр.Наименование);
			ТЗ2.ПолнНаименование = СокрЛП(СпрКонтр.ПолнНаименование);
		КонецЕсли;
		    ТЗ2.Сортировать("ПолнНаименование,Наименование2");
	КонецЦикла;
    
	ТЗ1 = СоздатьОбъект("ТаблицаЗначений");
	ТЗ1.НоваяКолонка("НомерСтроки","Число",5);
	ТЗ1.НоваяКолонка("КоррСчет","Число",4,1);
	ТЗ1.НоваяКолонка("Субконто1","Строка",50);
	ТЗ1.НоваяКолонка("Субконто2","Строка",50);
	ТЗ1.НоваяКолонка("Приход","Число",15,2);
	ТЗ1.НоваяКолонка("КК","Строка",50);
	ТЗ1.НоваяКолонка("ПолнНаименование","Строка",50);
	Выписка = Докум;
	Выписка.УстановитьФильтр(1); // по желанию , 0
	НомерСтроки=0;
	Выписка.ВыбратьСтроки();
	Пока Выписка.ПолучитьСтроку() = 1 Цикл
		ТЗ1.НоваяСтрока();
		ТЗ1.НомерСтроки = ТЗ1.НомерСтроки + 1;
		ТЗ1.КоррСчет = СокрЛП(Выписка.КоррСчет);
		ТЗ1.Субконто1 = СокрЛП(Выписка.Субконто1);
		ТЗ1.Субконто2 = СокрЛП(Выписка.Субконто2);
		ТЗ1.Приход = Выписка.Приход;
		Если ПустоеЗначение(Выписка.Приход)=1 Тогда
			Продолжить;    
		КонецЕсли;
	КонецЦикла;

	ТЗ1.ВыбратьСтроки();
	Пока ТЗ1.ПолучитьСтроку() = 1 Цикл
	    ТЗ2.ВыбратьСтроки();
	    Пока ТЗ2.ПолучитьСтроку() = 1 Цикл
	        ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,ТЗ1.КК,ТЗ2.КК);
	        ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,ТЗ1.ПолнНаименование,ТЗ2.ПолнНаименование);
			Сообщить(ТЗ1.КК+" "ТЗ1.ПолнНаименование+" "+ТЗ1.КоррСчет+" "+ТЗ1.Субконто1+" "+ТЗ1.Субконто2+" "+ТЗ1.Приход);
	    КонецЦикла;
	КонецЦикла;
Показать

укажите, пожалуйста на ошибки
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Cooler 22 14.07.17 15:38 Сейчас в теме
(1)
укажите, пожалуйста на ошибки
Основная ошибка: вы не ищете в ТЗ2 наименование из ТЗ1.

    Пока Выписка.ПолучитьСтроку() = 1 Цикл
        ТЗ1.НоваяСтрока();
        ТЗ1.НомерСтроки = ТЗ1.НомерСтроки + 1;
        ТЗ1.КоррСчет = СокрЛП(Выписка.КоррСчет);
        ТЗ1.Субконто1 = СокрЛП(Выписка.Субконто1);
        ТЗ1.Субконто2 = СокрЛП(Выписка.Субконто2);
        ТЗ1.Приход = Выписка.Приход;

        НомерСтроки=0;
        Если ТЗ2.НайтиЗначение(ТЗ1.Субконто1,НомерСтроки,"Наименование2")=1 Тогда
                ТЗ1.КК=ТЗ2.ПолучитьЗначение(НомерСтроки,"КК");
                ТЗ1.ПолнНаименование=ТЗ2.ПолучитьЗначение(НомерСтроки,"ПолнНаименование");
        КонецЕсли;

        Если ПустоеЗначение(Выписка.Приход)=1 Тогда
            Продолжить;    
        КонецЕсли;
    КонецЦикла;
Показать


Второй цикл не нужен. Да и загонять весь список контрагентов в ТЗ2 тоже не нужно, можно прямо в справочнике искать по наименованию.
kulkrise; +1 Ответить
3. kulkrise 3 14.07.17 16:26 Сейчас в теме
(2) Спасибо, за помощь.
Что-то у меня все равно не получается.
. 
. 1 62.1 Чайный клуб	Договор 001	300 00001    ООО "Чайничек"                                    
. 2 62.1 Иванов		Договор 001	500 00001    ООО "Чайничек"                                    
. 3 62.1 Пионер		Договор 005	100 00001    ООО "Чайничек"

т.е. он везде указывает Код и ПолнНаименование 1-ой строки
4. Cooler 22 14.07.17 17:03 Сейчас в теме
(3)
он везде указывает Код и ПолнНаименование 1-ой строки
Вы вот это из кода убрали?

    ТЗ1.ВыбратьСтроки();
    Пока ТЗ1.ПолучитьСтроку() = 1 Цикл
        ТЗ2.ВыбратьСтроки();
        Пока ТЗ2.ПолучитьСтроку() = 1 Цикл
            ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,ТЗ1.КК,ТЗ2.КК);
            ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,ТЗ1.ПолнНаименование,ТЗ2.ПолнНаименование);
            Сообщить(ТЗ1.КК+" "ТЗ1.ПолнНаименование+" "+ТЗ1.КоррСчет+" "+ТЗ1.Субконто1+" "+ТЗ1.Субконто2+" "+ТЗ1.Приход);
        КонецЦикла;
    КонецЦикла;
Показать
5. kulkrise 3 14.07.17 17:11 Сейчас в теме
(4) Да, убрала, т.к. я поняла, что через НайтиЗначение находит и ПолучитьЗначение устанавливается
Если ТЗ2.НайтиЗначение(ТЗ1.Субконто1,НомерСтроки,"Наименование2")=1 Тогда
                ТЗ1.КК=ТЗ2.ПолучитьЗначение(НомерСтроки,"КК");
                ТЗ1.ПолнНаименование=ТЗ2.ПолучитьЗначение(НомерСтроки,"ПолнНаименование");
        КонецЕсли;
6. Cooler 22 14.07.17 18:28 Сейчас в теме
(5)
я поняла, что через НайтиЗначение находит и ПолучитьЗначение устанавливается
А НомерСтроки=0 перед процитированным фрагментом, случайно, не выкинули? А то ведь эта строчка там необходима, почему - читайте Синтакс-Помощник. И вообще надо поменять имя этой переменной, а то оно у вас уже используется при присвоении ТЗ1.НомерСтроки. Точнее, должно было использоваться, но этому помешал ваш "талант" программиста.

После этого я уже не удивляюсь еще одному логическому косяку в коде: ну какой смысл помещать
        Если ПустоеЗначение(Выписка.Приход)=1 Тогда
            Продолжить;    
        КонецЕсли;

в конце цикла? Если даже Выписка.Приход=0, то строчка-то уже добавлена?

Короче, второй (он же последний) цикл должен выглядеть так:

Пока Выписка.ПолучитьСтроку() = 1 Цикл
        Если ПустоеЗначение(Выписка.Приход)=1 Тогда
            Продолжить;    
        КонецЕсли;
        ТЗ1.НоваяСтрока();
        НомерСтроки = НомерСтроки + 1;
        ТЗ1.НомерСтроки = НомерСтроки;
        ТЗ1.КоррСчет = СокрЛП(Выписка.КоррСчет);
        ТЗ1.Субконто1 = СокрЛП(Выписка.Субконто1);
        ТЗ1.Субконто2 = СокрЛП(Выписка.Субконто2);
        ТЗ1.Приход = Выписка.Приход;
        нСтр=0;
        Если ТЗ2.НайтиЗначение(ТЗ1.Субконто1,нСтр,"Наименование2")=1 Тогда
                ТЗ1.КК=ТЗ2.ПолучитьЗначение(нСтр,"КК");
                ТЗ1.ПолнНаименование=ТЗ2.ПолучитьЗначение(нСтр,"ПолнНаименование");
        КонецЕсли;
        Сообщить(ТЗ1.КК+" "ТЗ1.ПолнНаименование+" "+ТЗ1.КоррСчет+" "+ТЗ1.Субконто1+" "+ТЗ1.Субконто2+" "+ТЗ1.Приход);
КонецЦикла;
Показать


P.S. Мой вам совет - завязывайте с программированием.
kulkrise; +1 Ответить
7. kulkrise 3 15.07.17 10:02 Сейчас в теме
(6)
ну какой смысл помещать
Если ПустоеЗначение(Выписка.Приход)=1 Тогда
Продолжить;
КонецЕсли;

в конце цикла? Если даже Выписка.Приход=0, то строчка-то уже добавлена?

да я эту ошибку уже увидела еще до того как Вы мне на нее указали, но, к сожалению, не раньше. Аналогично подумала какого лешего я ее в конец влепила после добавления строк)))
8. kulkrise 3 15.07.17 10:05 Сейчас в теме
(6)
А НомерСтроки=0 перед процитированным фрагментом, случайно, не выкинули?

она у меня изначально была указана перед телом цикла, др. значения далее по тексту вроде не присваивала, поэтому из тела цикла и убирала.
9. Cooler 22 15.07.17 10:31 Сейчас в теме
(8)
далее по тексту вроде не присваивала, поэтому из тела цикла и убирала.
Вот вам и причина "везде указывает Код и ПолнНаименование 1-ой строки" - если переменная НомерСтроки при поиске не равна нулю, то поиск осуществляется только в строке с этим номером - читайте СП.

В итоге, у вас один раз нашлось в первой строке - всё, дальше будет искать только в ней. Не найдет (другой контрагент) - пофиг, НомерСтроки все равно не изменится, останется 1.

В-общем, вы отлично продемонстрировали принцип: "Компьютер исполняет ту программу, которую вы написали, а не ту, которую хотели написать"
kulkrise; +1 Ответить
10. kulkrise 3 15.07.17 10:38 Сейчас в теме
(6)
P.S. Мой вам совет - завязывайте с программированием.

Тут такой момент, сидеть делать нудную работу по полдня или даже дольше, если можно найти решение, чуть ли не нажатием "одной кнопки":).
Огромное спасибо Вам за помощь!!!
P.S. И все-таки мне не понятно: почему если я ставлю нСтр=0 перед телом цикла выдаёт по всем строкам ООО "Чайничек", а если в цикле, то всё правильно?
11. Cooler 22 15.07.17 10:53 Сейчас в теме
(10)
И все-таки мне не понятно: почему если я ставлю нСтр=0 перед телом цикла выдаёт по всем строкам ООО "Чайничек", а если в цикле, то всё правильно?
Читайте (9) до просветления - сообщение посвящено как раз объяснению этого. Раз уж у вас аллергия на Синтакс-Помощник.
12. kulkrise 3 15.07.17 12:11 Сейчас в теме
(11) Я постоянно читаю СП, вопрос в том, что мне не всегда понятно и очевидно как пользоваться тем или иным на практике.
Оставьте свое сообщение

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