![]() |
|
v7: Хелп; ТЗ.НайтиЗначение 7.7 | ☑ | ||
---|---|---|---|---|
0
bura_limon
04.10.11
✎
12:37
|
Подскажите как из 2-х ТЗ найти Контрагент.То есть в Запросе(ТЗ1) данные до 31.12.09,в Запросе(ТЗ)данные после 31.12.09,Условие:Если у Контрагента есть записи до 31.12.09 то не выводим..
Щас Выдает ошибку: Контрагенты = ТЗ.ПолучитьЗначение(Стр,"Контрагент"); : Номер за пределами значения! Процедура Сформировать() Перем Запрос,Запрос2, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос2 = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(СфорТЗ1) |Период с ВыбНачПериодов по ВыбКонПериодов; |Фирма = Документ.Реализация.Фирма, Документ.СтрокаВыпискиПриход.Фирма, Документ.ВозвратОтПокупателя.Фирма; |Номенклатура = Документ.Реализация.Номенклатура; |Сумма = Документ.Реализация.Сумма; |Цена = Документ.Реализация.Цена; |Менеджер = Документ.Реализация.Менеджер, Документ.СтрокаВыпискиПриход.Менеджер, Документ.ВозвратОтПокупателя.Менеджер; |Контрагент = Документ.Реализация.Контрагент, Документ.СтрокаВыпискиПриход.Контрагент, Документ.ВозвратОтПокупателя.Контрагент; |ТекущийДокумент = Документ.Реализация.ТекущийДокумент, Документ.СтрокаВыпискиПриход.ТекущийДокумент, Документ.ВозвратОтПокупателя.ТекущийДокумент; |Сумма1 = Документ.СтрокаВыпискиПриход.Сумма; |Сумма2 = Документ.ВозвратОтПокупателя.Сумма; |Функция СуммаСумма = Сумма(Сумма); |Функция Сумма1Сумма = Сумма(Сумма1); |Функция Сумма2Сумма = Сумма(Сумма2); |Группировка Контрагент; |Группировка Фирма без групп все ВошедшиеВЗапрос; |Группировка ТекущийДокумент; |Условие(Менеджер = ВыбМенеджер); |Условие(Фирма = ВыбФирма); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос2.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; ТЗ1 = СоздатьОбъект("ТаблицаЗначений"); Запрос2.Выгрузить(ТЗ1) ; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |Фирма = Документ.Реализация.Фирма, Документ.СтрокаВыпискиПриход.Фирма, Документ.ВозвратОтПокупателя.Фирма; |Номенклатура = Документ.Реализация.Номенклатура; |Сумма = Документ.Реализация.Сумма; |Цена = Документ.Реализация.Цена; |Менеджер = Документ.Реализация.Менеджер, Документ.СтрокаВыпискиПриход.Менеджер, Документ.ВозвратОтПокупателя.Менеджер; |Контрагент = Документ.Реализация.Контрагент, Документ.СтрокаВыпискиПриход.Контрагент, Документ.ВозвратОтПокупателя.Контрагент; |ТекущийДокумент = Документ.Реализация.ТекущийДокумент, Документ.СтрокаВыпискиПриход.ТекущийДокумент, Документ.ВозвратОтПокупателя.ТекущийДокумент; |Сумма1 = Документ.СтрокаВыпискиПриход.Сумма; |Сумма2 = Документ.ВозвратОтПокупателя.Сумма; |Функция СуммаСумма = Сумма(Сумма); |Функция Сумма1Сумма = Сумма(Сумма1); |Функция Сумма2Сумма = Сумма(Сумма2); |Группировка Контрагент; |Группировка Фирма без групп все ВошедшиеВЗапрос; |Группировка ТекущийДокумент; |Условие(Менеджер = ВыбМенеджер); |Условие(Фирма = ВыбФирма); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Сформировать"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); ТЗ = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗ); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=0; Если ТЗ.НайтиЗначение(ТЗ1.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе Контрагенты = ТЗ.ПолучитьЗначение(Стр,"Контрагент"); //Пока ТЗ.Группировка(1) = 1 Цикл // // Заполнение полей Контрагент Таб.ВывестиСекцию("Контрагент"); // Пока ТЗ.Группировка(2) = 1 Цикл // // Заполнение полей Фирма // Таб.ВывестиСекцию("Фирма"); // Пока ТЗ.Группировка(3) = 1 Цикл // // Заполнение полей ТекущийДокумент // Таб.ВывестиСекцию("ТекущийДокумент"); // КонецЦикла; // КонецЦикла; //КонецЦикла; КонецЕсли; КонецЦикла; // Заполнение полей "Итого" Таб.ВывестиСекцию("Итого"); // Вывод заполненной формы Таб.ТолькоПросмотр(1); Таб.Показать("Сформировать", ""); КонецПроцедуры |
|||
1
chelentano
04.10.11
✎
12:41
|
(0) в СП глянь и всё понятно станет
|
|||
2
Шапокляк
04.10.11
✎
12:44
|
Т.е. вы перебираете строки ТЗ и в цикле каждый раз ищете строку в ТЗ, в которой контрагент=ТЗ1.Контрагент?
|
|||
3
aka AMIGO
04.10.11
✎
12:46
|
Стр=0;
Контрагенты = ТЗ.ПолучитьЗначение(МойЛучшийКонтрагент,Стр,"Контрагент"); Если Стр<>0 тогда ТЗ.ПолучитьСтрокуПоНомеру(Стр); |
|||
4
aka AMIGO
04.10.11
✎
12:50
|
Вау!!!
Первый цикл бьется вторым циклом! Что-нибудь уж одно: либо перебирать строки тз, либо искать в тз, но не сбивать-же перебор! Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=0; Если ТЗ.НайтиЗначение(ТЗ1.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе... |
|||
5
Web00001
04.10.11
✎
12:52
|
Чота ниче не понятно
ТЗ.НайтиЗначение(ТЗ1.Контрагент,Стр,"Контрагент")=1 ищем ТЗ1.Контрагент а в какой момент мы обращались к ТЗ1 что бы выйти на какую нить строку не ясно Стр=0; Если ТЗ.НайтиЗначение(ТЗ1.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе Контрагенты = ТЗ.ПолучитьЗначение(Стр,"Контрагент"); то есть строка ТЗ.ПолучитьЗначение(Стр,"Контрагент"); срабатывает тогда уогда в стр строго 0 ибо когда там не 0 срабатывает условие и "продолжить" |
|||
6
aka AMIGO
04.10.11
✎
12:53
|
Вот так понятней будет?
ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 Цикл Стр=0; Если ТЗ.НайтиЗначение(ТЗ1.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе |
|||
7
Web00001
04.10.11
✎
12:54
|
(6) погоди ты и bura_limon одно лицо?
|
|||
8
aka AMIGO
04.10.11
✎
12:55
|
(7) нет, совершенно разные..
я ошибся в (6), подумал, что это вопрос от ТС :) |
|||
9
aka AMIGO
04.10.11
✎
12:56
|
для ТС - пост (6), если я понял замысел автора
|
|||
10
bura_limon
04.10.11
✎
12:57
|
(4)а где увидел второй цикл?
|
|||
11
Web00001
04.10.11
✎
12:58
|
ну и код блин в (0) очень не люблю когда так пишут, создание ьаблиц и работа с запросами перемешана, имена переменных ТЗ и ТЗ1 за такую привычку по рукам бить надо почему нельзя назвать ТЗДо31 и ТЗПосле31?
|
|||
12
aka AMIGO
04.10.11
✎
12:58
|
(10) - я тоже ошибаюсь: ты сбиваешь перебор элементов тз поиском в той-же тз, после чего цикл твой убит
|
|||
13
Web00001
04.10.11
✎
13:01
|
(12)ничего он не сбивает, но какой смысл в
Контрагенты = ТЗ.ПолучитьЗначение(Стр,"Контрагент"); ведь там в стр ВСЕГДА 0 |
|||
14
bura_limon
04.10.11
✎
13:01
|
может напишет кто-нибудь свой правельный вариант
|
|||
15
aka AMIGO
04.10.11
✎
13:02
|
(14) - уже написан в (6)
счас напишу второй правельной вориант |
|||
16
Web00001
04.10.11
✎
13:02
|
(14) маилагент или джабер есть?
|
|||
17
aka AMIGO
04.10.11
✎
13:03
|
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=0; Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе //-- дальше - сам.. |
|||
18
Шапокляк
04.10.11
✎
13:04
|
Замысел, скорее всего, такой: перебрать все строки ТЗ, каждый раз проверяя, нет ли контрагента этой строки в ТЗ1.
(14) у меня нет 7.7. под рукой, что-то вроде этого: ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ТЗ1.НайтиЗначение(ТЗ.Контрагент)=1 Тогда Продолжить; Иначе Контрагенты = ТЗ.Контрагент; .... |
|||
19
aka AMIGO
04.10.11
✎
13:06
|
(18) у тебя ошибка в НайтиЗначение(...)..
|
|||
20
Web00001
04.10.11
✎
13:07
|
(17)(18) :) в один момент практически
|
|||
21
Шапокляк
04.10.11
✎
13:10
|
(19) я ж говорю, нет СП и 7.7. не установлен. Короче, строку найти надо в ТЗ1, где контрагент совпадает с ТЗ.Контрагент. Уточни, плз, как надо по синтаксису :)
|
|||
22
aka AMIGO
04.10.11
✎
13:12
|
(21) :)
ТЗ1.НайтиЗначение(ИскомоеЗначение,Строка,Колонка)=1/0 |
|||
23
bura_limon
04.10.11
✎
13:18
|
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=""; Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе Контрагенты = ТЗ1.ПолучитьЗначение(Стр,"Контрагент"); Ошибка:Номер за пределами значения! |
|||
24
bura_limon
04.10.11
✎
13:20
|
незная кто так пишет Стр="";,кто так Стр=0;
|
|||
25
aka AMIGO
04.10.11
✎
13:20
|
+ 22
переменная "Строка" должна быть объявлена до выполнения оператора в параметре "Колонка" - или номер колонки, или её наименование результат =1 - значение найдено, при этом переменной "Строка" присваивается значение, отличное от "0" результат = 0 - переменная "Строка"=0, значение не найдено (23) попробуй Стр=0; перед поиском значения |
|||
26
Шапокляк
04.10.11
✎
13:21
|
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=0; Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе Контрагенты =ТЗ.Контрагент; |
|||
27
aka AMIGO
04.10.11
✎
13:21
|
(24) в функцию поиска лучше подставлять число, а не пустую переменную..
|
|||
28
bura_limon
04.10.11
✎
13:22
|
(16)ага есть,надо?
|
|||
29
Шапокляк
04.10.11
✎
13:23
|
+(26) Вы перебираете ТЗ.
Ищете контрагента из строки ТЗ в ТЗ1. Если находите, продолжаете, а если не находите, берете Контрагента из перебираемой строки ТЗ и что-то там делаете дальше по тексту! |
|||
30
aka AMIGO
04.10.11
✎
13:24
|
(23) сколько ошибаться будешь? :)
ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=""; Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе //Контрагенты = ТЗ1.ПолучитьЗначение(Стр,"Контрагент"); - здесь Стр =0 !!!! |
|||
31
aka AMIGO
04.10.11
✎
13:26
|
+30 сам-же пишешь:
Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда //контрагент найден!! Продолжить; Иначе //здесь - контрагент не найден.. что ты хочешь выполнить если он не найден? |
|||
32
bura_limon
04.10.11
✎
13:29
|
(30)да пошла ребят.....Спасибо огромное,я больше с 8-кой работаю,вот впрягли с 7.7
|
|||
33
bura_limon
04.10.11
✎
14:00
|
Ребят подскажите еще пожалуста как можно вывести только 1 строку Контрагента,Фирма,чтобы они не повторялись в следующей строке,по итогам по моему как то надо
Вот как сейчас: http://clip2net.com/s/1dvAs |
|||
34
chief accountant
04.10.11
✎
14:02
|
Свернуть ТЗ?
|
|||
35
bura_limon
04.10.11
✎
14:30
|
(34)а как она работает, и куда именно его втыкать,Перед Циклом и в Цикле не получается:
ошибка: Поле агрегатного объекта не обнаружено (Свертнуть) ТЗ.Свертнуть(ТЗ.Контрагент,); Пока ТЗ.ПолучитьСтроку()=1 Цикл не понятен "СуммКолонки" обязателен он или нет Свернуть(<?>,); Синтаксис: Свернуть(<ГруппКолонки>,<СуммКолонки>) Назначение: Позволяет свернуть таблицу значений по соответствующим значениям колонок, т.е. заменяет на одну строку все дублирующие (по значениям группировочных колонок) строки, суммируя значения по суммируемым колонкам. Параметры: <ГруппКолонки> - группировочные колонки (номера или идентификаторы колонок через запятую), по которым группировать данные. <СуммКолонки> - суммируемые колонки (номера или идентификаторы колонок через запятую), по которым суммировать данные. |
|||
36
chief accountant
04.10.11
✎
14:33
|
(35) СверТнуть конечно работать не будет
|
|||
37
Шапокляк
04.10.11
✎
14:42
|
Сворачивать надо перед перебором, но вообще идея дикая, ведь запрос формируется так, что может быть и несколько строк по одному контрагенту в комбинации с фирмой, отличающихся какими-то другими атрибутами. Надо в запросе группировать по Фирме и контрагенту и выводить отчет с группировками, только и всего.
|
|||
38
bura_limon
04.10.11
✎
14:43
|
(36) есть еше варианты?
|
|||
39
chief accountant
04.10.11
✎
14:45
|
(38) Ты разницу не видишь
Свертнуть Свернуть ??? |
|||
40
bura_limon
04.10.11
✎
14:52
|
(37) в (0)посмотри Запрос.Выгрузить(ТЗ) группировки есть,только в моем случаи как будит выглядить отбор по колонкам,щас так:
ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=""; Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе Контрагенты = ТЗ.Контрагент; Фирма = ТЗ.Фирма; ТекущийДокумент = ТЗ.ТекущийДокумент; Фирма = ТЗ.Фирма; СуммаСумма = ТЗ.СуммаСумма; Сумма1Сумма = ТЗ.Сумма1Сумма; Сумма2Сумма = ТЗ.Сумма2Сумма; ТЗ.Свернуть("Контрагенты",); Таб.ВывестиСекцию("Контрагент"); можешь подсказать как с группировкой тогда будит?! |
|||
41
bura_limon
04.10.11
✎
15:02
|
(39)не отрабатывает
ТЗ.Свернуть(ТЗ.Контрагент,); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр=""; Если ТЗ1.НайтиЗначение(ТЗ.Контрагент,Стр,"Контрагент")=1 Тогда Продолжить; Иначе Контрагенты = ТЗ.Контрагент; Фирма = ТЗ.Фирма; ТекущийДокумент = ТЗ.ТекущийДокумент; Фирма = ТЗ.Фирма; СуммаСумма = ТЗ.СуммаСумма; Сумма1Сумма = ТЗ.Сумма1Сумма; Сумма2Сумма = ТЗ.Сумма2Сумма; Таб.ВывестиСекцию("Контрагент"); КонецЕсли; КонецЦикла; |
|||
42
chief accountant
04.10.11
✎
15:05
|
(41) Ты сворачиваешь без сумм
|
|||
43
bura_limon
04.10.11
✎
15:18
|
(41) у меня 3 поля Сумма,более 2-х поле он ругается
|
|||
44
chief accountant
04.10.11
✎
15:25
|
(43) В любом типовом отчете посмотри применение метода
|
|||
45
Шапокляк
04.10.11
✎
15:51
|
(40) Ты в (0) группируешь в запросе сначала по контрагенту, потом по фирме, потом по документу. Если б ты не выгружал результат запроса в ТЗ, а сразу бы обрабатывал, то выбирая по группировкам выводил бы соответствующие секции и все.
Однако ты выгрузил. Если перед перебором ТЗ по строкам ты введешь оператор ТЗ.ВыбратьСтроку(); То на экране узришь таблицу, в которой будут строки с заполненным контрагентом, но пустой фирмой и документом, однако в колонках СуммаСумма, Сумма1Сумма и т.д. будут цифры. Эта строчка соответствует группировке по контрагенту (когда при переборе ТЗ ты наткнешься на такую строку - тупо выводи ее данные в секции Контрагент). Будут встречаться строки с заполненным контрагентом и фирмой, но пустым документом. выводи их в секции Фирма. Полностью заполненные строки выводи в секции ТекущийДокумент. НЕ сворачивай ничего, и так нет дублей! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |