Добрый день, Форумчане!
Помогите, пожалуйста, разобраться с объединением 2-х ТЗ.
1С Бухгалтерия 7.7, релиз 7.70.628.
нужно из ТЗ_2 в ТЗ_1 добавить Код и ПолнНаименование, если такой контрагент присутствует в ТЗ_1.
Пробую циклом
укажите, пожалуйста на ошибки
Помогите, пожалуйста, разобраться с объединением 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.Приход);
КонецЦикла;
КонецЦикла;
Показатьукажите, пожалуйста на ошибки
По теме из базы знаний
- Универсальный конструктор отчетов (Новейший отчет) для 1C 7.7
- Пример переноса справочников, документов и движений через Эксель и "Конвертацию данных 2" из оптовой учетной системы 1С 7.7 Комплексной 4.2 и розничной учетной системы Рарус Торговый комплекс -> в 1С 8.3 ЕРП 2.4 (расширение и дополнительные реквизиты)
- Переход с 1С:УПП на 1C:ERP. Переезд пользователей с сохранением прежних прав
- 1С-ная магия
- Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Второй цикл не нужен. Да и загонять весь список контрагентов в ТЗ2 тоже не нужно, можно прямо в справочнике искать по наименованию.
укажите, пожалуйста на ошибки
Основная ошибка: вы не ищете в ТЗ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 тоже не нужно, можно прямо в справочнике искать по наименованию.
(2) Спасибо, за помощь.
Что-то у меня все равно не получается.
т.е. он везде указывает Код и ПолнНаименование 1-ой строки
Что-то у меня все равно не получается.
.
. 1 62.1 Чайный клуб Договор 001 300 00001 ООО "Чайничек"
. 2 62.1 Иванов Договор 001 500 00001 ООО "Чайничек"
. 3 62.1 Пионер Договор 005 100 00001 ООО "Чайничек"
т.е. он везде указывает Код и ПолнНаименование 1-ой строки
(3)
он везде указывает Код и ПолнНаименование 1-ой строки
Вы вот это из кода убрали?
ТЗ1.ВыбратьСтроки();
Пока ТЗ1.ПолучитьСтроку() = 1 Цикл
ТЗ2.ВыбратьСтроки();
Пока ТЗ2.ПолучитьСтроку() = 1 Цикл
ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,ТЗ1.КК,ТЗ2.КК);
ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,ТЗ1.ПолнНаименование,ТЗ2.ПолнНаименование);
Сообщить(ТЗ1.КК+" "ТЗ1.ПолнНаименование+" "+ТЗ1.КоррСчет+" "+ТЗ1.Субконто1+" "+ТЗ1.Субконто2+" "+ТЗ1.Приход);
КонецЦикла;
КонецЦикла;
Показать
(4) Да, убрала, т.к. я поняла, что через НайтиЗначение находит и ПолучитьЗначение устанавливается
Если ТЗ2.НайтиЗначение(ТЗ1.Субконто1,НомерСтроки,"Наименование2")=1 Тогда
ТЗ1.КК=ТЗ2.ПолучитьЗначение(НомерСтроки,"КК");
ТЗ1.ПолнНаименование=ТЗ2.ПолучитьЗначение(НомерСтроки,"ПолнНаименование");
КонецЕсли;
(5)
После этого я уже не удивляюсь еще одному логическому косяку в коде: ну какой смысл помещать
в конце цикла? Если даже Выписка.Приход=0, то строчка-то уже добавлена?
Короче, второй (он же последний) цикл должен выглядеть так:
P.S. Мой вам совет - завязывайте с программированием.
я поняла, что через НайтиЗначение находит и ПолучитьЗначение устанавливается
А НомерСтроки=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. Мой вам совет - завязывайте с программированием.
(6)
да я эту ошибку уже увидела еще до того как Вы мне на нее указали, но, к сожалению, не раньше. Аналогично подумала какого лешего я ее в конец влепила после добавления строк)))
ну какой смысл помещать
Если ПустоеЗначение(Выписка.Приход)=1 Тогда
Продолжить;
КонецЕсли;
в конце цикла? Если даже Выписка.Приход=0, то строчка-то уже добавлена?
Если ПустоеЗначение(Выписка.Приход)=1 Тогда
Продолжить;
КонецЕсли;
в конце цикла? Если даже Выписка.Приход=0, то строчка-то уже добавлена?
да я эту ошибку уже увидела еще до того как Вы мне на нее указали, но, к сожалению, не раньше. Аналогично подумала какого лешего я ее в конец влепила после добавления строк)))
(8)
В итоге, у вас один раз нашлось в первой строке - всё, дальше будет искать только в ней. Не найдет (другой контрагент) - пофиг, НомерСтроки все равно не изменится, останется 1.
В-общем, вы отлично продемонстрировали принцип: "Компьютер исполняет ту программу, которую вы написали, а не ту, которую хотели написать"
далее по тексту вроде не присваивала, поэтому из тела цикла и убирала.
Вот вам и причина "везде указывает Код и ПолнНаименование 1-ой строки" - если переменная НомерСтроки при поиске не равна нулю, то поиск осуществляется только в строке с этим номером - читайте СП.
В итоге, у вас один раз нашлось в первой строке - всё, дальше будет искать только в ней. Не найдет (другой контрагент) - пофиг, НомерСтроки все равно не изменится, останется 1.
В-общем, вы отлично продемонстрировали принцип: "Компьютер исполняет ту программу, которую вы написали, а не ту, которую хотели написать"
(6)
Тут такой момент, сидеть делать нудную работу по полдня или даже дольше, если можно найти решение, чуть ли не нажатием "одной кнопки":).
Огромное спасибо Вам за помощь!!!
P.S. И все-таки мне не понятно: почему если я ставлю нСтр=0 перед телом цикла выдаёт по всем строкам ООО "Чайничек", а если в цикле, то всё правильно?
P.S. Мой вам совет - завязывайте с программированием.
Тут такой момент, сидеть делать нудную работу по полдня или даже дольше, если можно найти решение, чуть ли не нажатием "одной кнопки":).
Огромное спасибо Вам за помощь!!!
P.S. И все-таки мне не понятно: почему если я ставлю нСтр=0 перед телом цикла выдаёт по всем строкам ООО "Чайничек", а если в цикле, то всё правильно?
(10)
И все-таки мне не понятно: почему если я ставлю нСтр=0 перед телом цикла выдаёт по всем строкам ООО "Чайничек", а если в цикле, то всё правильно?
Читайте (9) до просветления - сообщение посвящено как раз объяснению этого. Раз уж у вас аллергия на Синтакс-Помощник.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот