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) Я постоянно читаю СП, вопрос в том, что мне не всегда понятно и очевидно как пользоваться тем или иным на практике.
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день