Имя: Пароль:
1C
1C 7.7
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Сумма и т.д. будут цифры. Эта строчка соответствует группировке по контрагенту (когда при переборе ТЗ ты наткнешься на такую строку - тупо выводи ее данные в секции Контрагент). Будут встречаться строки с заполненным контрагентом и фирмой, но пустым документом. выводи их в секции Фирма. Полностью заполненные строки выводи в секции ТекущийДокумент.
НЕ сворачивай ничего, и так нет дублей!