Консультация № 88089
22.05.2007, 16:27
0.00 руб.
0 4 4
Здравствуйте. Результаты 2-х различных запросов я поместила в 2 таблицы значений соответственно, теперь нужно вывести всех контрагентов и СНК() из табЗнач62 а документы по этим контрагентам из другой табЗнач76. У меня получается что, по табЗнач62 все выполняется правильно, а по ТаБзнач76 только 1-е значение и все, если же я использую выбратьСтроки() то получается полный бред.

Приложение:
процедура Кредит() табЗнач62=СоздатьОбъект("ТаблицаЗначений"); табЗнач62.НоваяКолонка("Контрагент"); табЗнач62.НоваяКОлонка("сальдоК"); табЗнач62.НоваяКОлонка("сальдоД"); табЗнач76=СоздатьОбъект("ТаблицаЗначений"); табЗнач76.НоваяКолонка("Контрагент"); табЗнач76.НоваяКолонка("Договор"); табЗнач76.НоваяКОлонка("Оборот"); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Ит = СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,, 1); Ит.ИспользоватьСубконто(ВидыСубконто.Договоры,, 1); Ит.ВключатьСубсчета(1); Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, "62.2",,, 3,, "С"); Итб=СоздатьОбъект("БухгалтерскиеИтоги"); Итб.ИспользоватьСубконто(ВидыСубконто.Контрагенты,, 1); Итб.ИспользоватьСубконто(ВидыСубконто.СчетаФактурыВыданные,, 1,); Итб.ВключатьСубсчета(1,1); Итб.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"76.АВ",,,3,, "С"); н=0; Таб.ВывестиСекцию("Заголовок"); Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); сум=0;сумС=0; Ит.ВыбратьСчета(,1); Пока Ит.ПолучитьСчет() = 1 Цикл Ит.ВыбратьСубконто(ВидыСубконто.Договоры); Пока Ит.ПолучитьСубконто(ВидыСубконто.Договоры) = 1 Цикл табЗнач62.НоваяСтрока(); табЗнач62.контрагент=ит.Субконто(1); табЗнач62.сальдоД=ит.СНД(); табЗнач62.сальдоК=ит.СНК(); Договор=Ит.Субконто(ВидыСубконто.Договоры); сум=сум+ит.КО(); сумС=сумС+ит.СНК(); КонецЦикла; КонецЦикла; итб.ВыбратьСубконто(2); пока итб.получитьСубконто(2)=1 цикл ТабЗнач76.НоваяСтрока(); табЗнач76.Контрагент=итб.Субконто(1); табЗнач76.Договор=итб.Субконто(2); табЗнач76.Оборот=итб.КО(); конецЦикла; стр=0; табЗнач62.Сортировать("контрагент"); табЗнач62.ВыбратьСтроку(стр,"62"); табЗнач76.Сортировать("контрагент"); табЗнач76.ВыбратьСтроку(стр,"76"); табЗнач62.ВыбратьСтроки(); пока табЗнач62.ПолучитьСтроку()=1 цикл контрагент=табЗнач62.Контрагент; //табЗнач76.ВыбратьСтроки(); //пока табЗнач76.ПолучитьСтроку()=1 цикл если табЗнач76.найтиЗначение(контрагент,номстр,номкол)=1 тогда табзнач76.ПолучитьЗначение(номстр,номКол); табЗнач76.ПолучитьСтрокуПоНомеру(номСтр); контр=табЗнач76.Контрагент; дог=табЗнач76.Договор; КО=табЗнач76.Оборот;сообщить("к= "+контр+" д= "+дог+" КО "+ко); таб.ВывестиСекцию("КредитОсновная"); иначе таб.ВывестиСекцию("К1"); конецЕсли; //конецЦикла; конецЦикла; //таб.ВывестиСекцию("сумма"); Таб.ТолькоПросмотр(1); Таб.Показать("Сформировать",""); конецпроцедуры

Обсуждение

Неизвестный
22.05.2007, 18:08
общий
это ответ
Здравствуйте, Fifina!
Ну, это стандартная ошибка- не присвоены начальные значения
НомСтр=0;//Поиск по всем строкам
Номкол="Контрагент"//Поиск по колонке Контрагент
если табЗнач76.найтиЗначение(контрагент,номстр,номкол)=1 тогда
табЗнач76.ПолучитьСтрокуПоНомеру(номСтр);
Строки же типа табзнач76.ПолучитьЗначение(номстр,номКол);
совершенно излишние, ведь Вы полученное значение ничему не присваиваете.
Лишняя также строка контр=табЗнач76.Контрагент;, ведь Вы получите, естественно, то же значение, что и искали, а именно контрагент

И вообще, код какой-то сумбурный (если, конечно, он не сокращенный для удобочитаемости). Если счет 62.2 не группа, то незачем выбирать счета, потому что он единственный, по которому сделан запрос. Выбирается сразу второе субконто, а ведь по стандартам нужно сначала выбирать первое субконто, а потом второе.
Кроме того, есть серьезное замечание. У одного контрагента может быть несколько договоров, и это значит, что табЗнач76 будет иметь несколько строк с одинаковым контрагент. НайтиЗначение всегда будет искать первую строку, содержащую контрагента. Выйти из ситуации можно тремя способами:1. свернуть табЗнач76 по контрагенту 2. добавить служебную колонку Индекс типа неограниченная строка, состоящую из имени контрагента и договора и искать по этой колонке 3. Перебирать всю таблицу табЗнач76 в цикле (как закомментировано). Следует отметить, что перебор в цикле работает очень медленно, лучше сделать индекс или отказаться от детализации по договорам.

Приложение:
В приложении данные хранятся в ТЗ в разрезе контрагентов и договоров, а поиск ведется через индекс.
Неизвестный
22.05.2007, 18:41
общий
это ответ
Здравствуйте, Fifina!

Если мы об одном и том же, то смотрите приложение. Делал под свои план счетов, так что просмотрите, нигде ничего не забыл на место поставить

Приложение:
//*******************************************Процедура Кредит() табЗнач62=СоздатьОбъект("ТаблицаЗначений"); табЗнач62.НоваяКолонка("Контрагент"); табЗнач62.НоваяКОлонка("сальдоК"); табЗнач62.НоваяКОлонка("сальдоД"); табЗнач76=СоздатьОбъект("ТаблицаЗначений"); табЗнач76.НоваяКолонка("Контрагент"); табЗнач76.НоваяКолонка("Договор"); табЗнач76.НоваяКОлонка("Оборот"); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Ит = СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,, 1); Ит.ИспользоватьСубконто(ВидыСубконто.Договоры,, 1); Ит.ВключатьСубсчета(1); Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, "62.2",,, 3,, "С"); Итб=СоздатьОбъект("БухгалтерскиеИтоги"); Итб.ИспользоватьСубконто(ВидыСубконто.Контрагенты,, 1); Итб.ИспользоватьСубконто(ВидыСубконто.СчетаФактурыВыданные,, 1,); Итб.ВключатьСубсчета(1,1); Итб.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"76.АВ",,,3,, "С"); н=0; Таб.ВывестиСекцию("Заголовок"); Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); сум=0;сумС=0; Ит.ВыбратьСчета(,1); Пока Ит.ПолучитьСчет() = 1 Цикл Ит.ВыбратьСубконто(1); Пока Ит.ПолучитьСубконто(1) = 1 Цикл Ит.ВыбратьСубконто(2); Пока Ит.ПолучитьСубконто(2) = 1 Цикл табЗнач62.НоваяСтрока(); табЗнач62.контрагент=ит.Субконто(1); табЗнач62.сальдоД=ит.СНД(); табЗнач62.сальдоК=ит.СНК(); Договор=Ит.Субконто(2); сум=сум+ит.КО(); сумС=сумС+ит.СНК(); КонецЦикла; КонецЦикла; КонецЦикла; итб.ВыбратьСубконто(1); пока итб.получитьСубконто(1)=1 цикл итб.ВыбратьСубконто(2); пока итб.получитьСубконто(2)=1 цикл ТабЗнач76.НоваяСтрока(); табЗнач76.Контрагент=итб.Субконто(1); табЗнач76.Договор=итб.Субконто(2); табЗнач76.Оборот=итб.КО(); конецЦикла; конецЦикла; табЗнач62.ВыбратьСтроки(); пока табЗнач62.ПолучитьСтроку()=1 цикл контрагент=табЗнач62.Контрагент; табЗнач76.ВыбратьСтроки(); пока табЗнач76.ПолучитьСтроку()=1 цикл если табЗнач76.контрагент = контрагент тогда контр=табЗнач76.Контрагент; дог=табЗнач76.Договор; КО=табЗнач76.Оборот; сообщить("к= "+контр+" д= "+дог+" КО "+ко); таб.ВывестиСекцию("КредитОсновная"); иначе таб.ВывестиСекцию("К1"); конецЕсли; конецЦикла; конецЦикла; таб.ВывестиСекцию("сумма"); Таб.ТолькоПросмотр(1); Таб.Показать("Сформировать","");КонецПроцедуры
Неизвестный
23.05.2007, 00:32
общий
это ответ
Здравствуйте, Fifina!

Попробуйте мой вариант. Я поубирал все лишнее, исправил несколько неточностей. Хотя, конечно, не видя данных и самой печтной формы...

Приложение:
процедура Кредит() табЗнач62=СоздатьОбъект("ТаблицаЗначений"); табЗнач62.НоваяКолонка("Контрагент"); табЗнач62.НоваяКОлонка("сальдоК"); табЗнач62.НоваяКОлонка("сальдоД"); табЗнач76=СоздатьОбъект("ТаблицаЗначений"); табЗнач76.НоваяКолонка("Контрагент"); табЗнач76.НоваяКолонка("Договор"); табЗнач76.НоваяКОлонка("Оборот"); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Ит = СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,, 1); Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, "62.2",,, 1,, "С"); Итб=СоздатьОбъект("БухгалтерскиеИтоги"); Итб.ИспользоватьСубконто(ВидыСубконто.Контрагенты,, 1); Итб.ИспользоватьСубконто(ВидыСубконто.СчетаФактурыВыданные,, 1,); Итб.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"76.АВ",,,1,, "С"); Таб.ВывестиСекцию("Заголовок"); Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); сум=0;сумС=0; Ит.ВыбратьСубконто(); Пока Ит.ПолучитьСубконто() = 1 Цикл табЗнач62.НоваяСтрока(); табЗнач62.контрагент=ит.Субконто(1); табЗнач62.сальдоД=ит.СНД(); табЗнач62.сальдоК=ит.СНК(); сум=сум+ит.КО(); сумС=сумС+ит.СНК(); КонецЦикла; Итб.ВыбратьСубконто(); Пока Итб.ПолучитьСубконто() = 1 Цикл итб.ВыбратьСубконто(2); пока итб.получитьСубконто(2)=1 цикл ТабЗнач76.НоваяСтрока(); табЗнач76.Контрагент=итб.Субконто(1); табЗнач76.Договор=итб.Субконто(2); табЗнач76.Оборот=итб.КО(); конецЦикла; конецЦикла; стр=0; табЗнач62.Сортировать("контрагент"); табЗнач62.ВыбратьСтроку(стр,"62"); табЗнач76.Сортировать("контрагент"); табЗнач76.ВыбратьСтроку(стр,"76"); табЗнач62.ВыбратьСтроки(); пока табЗнач62.ПолучитьСтроку()=1 цикл контрагент=табЗнач62.Контрагент; табЗнач76.ВыбратьСтроки(); пока табЗнач76.ПолучитьСтроку()=1 цикл если табЗнач76.контрагент=контрагент тогда табЗнач76.ПолучитьСтрокуПоНомеру(номСтр); контр=табЗнач76.Контрагент; дог=табЗнач76.Договор; КО=табЗнач76.Оборот; сообщить("к= "+контр+"; д= "+дог+"; КО= "+ко+"; снд= "+табЗнач62.сальдоД+"; снк = "+табЗнач62.сальдоК); таб.ВывестиСекцию("КредитОсновная"); иначе //таб.ВывестиСекцию("К1"); конецЕсли; конецЦикла; конецЦикла; //таб.ВывестиСекцию("сумма"); Таб.ТолькоПросмотр(1); Таб.Показать("Сформировать","");конецпроцедуры
Неизвестный
23.05.2007, 05:16
общий
это ответ
Здравствуйте, Fifina!

на мой взгляд лучше использовать следующий метод, запросы рассчитываются также но выборку из них нужно производить следующим способом

выбрать счета можно не использовать так указанные счета не группы

Ит.ВыбратьСубконто(ВидыСубконто.Контрагенты);
Пока Ит.ПолучитьСубконто(ВидыСубконто.Контрагенты) = 1 Цикл
Контрагент = Ит.Субконто(ВидыСубконто.Контрагенты);

// здесь выбираем договора
Ит.ВыбратьСубконто(ВидыСубконто.Договоры);
Пока Ит.ПолучитьСубконто(ВидыСубконто.Договоры) = 1 Цикл
Договор = Ит.Субконто(ВидыСубконто.Договоры);
КонецЦикла;

// после получаем документы по контрагенту, если они были
Если Итб.ПолучитьСубконто(ВидыСубконто.Контрагенты,,Контрагент) = 1 Тогда
Итб.ВыбратьСубконто(ВидыСубконто.СчетаФактурыВыданные);
Пока Итб.ПолучитьСубконто(ВидыСубконто.СчетаФактурыВыданные) = 1 Цикл
СчетФактура = Итб.Субконто(ВидыСубконто.СчетаФактурыВыданные);

//выводим ее или обрабатываем как нам нужно
КонецЦикла;
КонецЕслИ;

КонецЦикла;

и комментарий: в данном случае в первом запросе не понятно зачем выбирать договора, если в случае если их больше одного, будет не возможно указать авансовые счетафатуры на них (хотя можно записать в таблицу и счетфактуры по полю договор выбрать)

если использовать таблицы то нужно организовать указанный выше цикл только во втором выбирать счетафактуры при условии совпадения контрагентов
Форма ответа