Имя: Пароль:
1C
1С v8
Помогите найти отличия
0 Kvitok8320
 
05.09.13
13:04
Добрый день, не могу справиться сам ....

вот два куска модуля формы отчета
первый работает, а второй нет - показывает, что в выборке элементов нет

&НаСервере
Процедура ЗаполнитьСервер()
запрос = новый запрос;
запрос.Текст="
|ВЫБРАТЬ
|суммаостатокКт, Счет, Субконто1
|ИЗ
|регистрбухгалтерии.хозрасчетный.остатки(&Выбдата) КАК Остатки
|ГДЕ
|Остатки.Счет = &ВыбСчет";
выбсчет=планысчетов.Хозрасчетный;
нужныйсчет = выбсчет.УставныйКапитал_ОбыкновенныеАкции;
запрос.УстановитьПараметр("ВыбДата",отчет.ДатаЗапроса);
запрос.УстановитьПараметр("ВыбСчет",Нужныйсчет);
результат = запрос.Выполнить();
выборка=результат.Выбрать();

пока выборка.Следующий() цикл
    строка = отчет.ТабличнаяЧасть1.Добавить();
    строка.заемщик=выборка.субконто1;

    запрос2=новый запрос;
    запрос2.Текст = "
    |Выбрать
    |Объект, Вид, Представление
    |ИЗ
    |РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |КонтактнаяИнформация.Объект=&Объект";
    запрос2.УстановитьПараметр("Объект",строка.заемщик);
    результат2=запрос2.Выполнить();
    выборка2 = результат2.Выбрать();
    строка.контактнаяинформация = " ";
    пока выборка2.Следующий() цикл
    строка.контактнаяинформация = строка.контактнаяинформация + строка(выборка2.вид)+":"+сокрлп(строка(выборка2.представление))+";";
    конеццикла;
конеццикла;
конецпроцедуры

вот второй - реально просто скопировал

&НаСервере
Процедура Заполнить3Сервер()
для каждого строка5 из отчет.ТабличнаяЧасть1 цикл
запрос2=новый запрос;
    запрос2.Текст = "
    |Выбрать
    |Объект, Тип, Вид, Представление
    |ИЗ
    |РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |КонтактнаяИнформация.Объект=&Объект";
    запрос2.УстановитьПараметр("Объект",строка5.заемщик);
    результат2=запрос2.Выполнить();
    выборка2 = результат2.Выбрать();
    строка5.контактнаяинформация = " ";
    пока выборка2.Следующий() цикл
    строка5.контактнаяинформация = строка5.контактнаяинформация + строка(выборка2.вид)+":"+сокрлп(строка(выборка2.представление))+";";
    конеццикла;
конеццикла;
КонецПроцедуры

по точке останова проверял - параметр в запросе присваивается параметр.объект.справочникссылка.контрагенты .....
1 pumbaEO
 
05.09.13
13:05
kdiff3, winmerge тебе поможет.
2 Любопытная
 
05.09.13
13:06
За запрос в цикле тебя сейчас тут бить будут...
3 Wobland
 
05.09.13
13:06
ставлю на  запрос2.УстановитьПараметр("Объект"
4 Wobland
 
05.09.13
13:07
(2) кстати, да. с учётом этого имеющееся выкинуть, приличным людям мозг не любить, всё переписать, стоя на горохе
5 Любопытная
 
05.09.13
13:07
" параметр.объект.справочникссылка.контрагенты " вот это что значит?
6 Kvitok8320
 
05.09.13
13:11
сорри - по другому пока не научился (посмотрите мой стаж на форуме ....)
(5) У регистра контактная информация 3 измерения - одно из них объект ....
ну в первом же работает ...
7 Любопытная
 
05.09.13
13:14
(6) посмотри в РС - есть ли действительно контактная информация у этого контрагента. Запусти свой запрос в консоли и задай параметром того контрагента, который у тебя в параметр пишется.
Переименуй переменные более информативно, код сразу станет более читабельным. Все эти Запрос2, строка5 и тому подобное... бррр :)
8 Kvitok8320
 
05.09.13
13:15
проверил - у некоторых точно есть
9 Wobland
 
05.09.13
13:15
(6) отличный повод научиться
10 Любопытная
 
05.09.13
13:15
(6) Сделай с соединением твоей ТЧ и регистра сведений, связь по объекту. В конструкторе это просто
11 Любопытная
 
05.09.13
13:16
(10) *Сделай запрос конечно же :)
12 Любопытная
 
05.09.13
13:17
Кстати. Что ж ты говоришь, что скопировал, если в первом поля Тип нет, а в твоем есть?
13 Kvitok8320
 
05.09.13
13:19
ок, сделаю, перепишу, научусь :)
(12) это я уже потом проверять начал - методом ... ну вобщем не лучшим ...
14 Любопытная
 
05.09.13
13:21
(13) возьми консоль запросов и тестируй свой запрос в ней. Это очень просто, если голова есть. А она, судя по фото, точно есть :)
15 Wobland
 
05.09.13
13:23
ух ты! а я ж думал, Квиток- это студент ;)
16 Kvitok8320
 
05.09.13
13:26
(15) ну пристыдили, пристыдили .... уже пошел переучиваться  :)
17 Kvitok8320
 
05.09.13
13:27
(7) Что то мне подсказывает, что вы правы насчет отсутствия информации как таковой .....
18 Wobland
 
05.09.13
13:28
(16) я б дорожил комплиментом от Любопытной ;)
19 Kvitok8320
 
05.09.13
13:33
Да, я уже сделал скриншот экрана :)
но, думаю что замечание относилось к наличию головы как элемента тела ... :)

(7) да, так и есть - у меня есть дублирующиеся элементы в справочнике контрагентов и контактная информация есть не на тех, которые попадают в мою выборку
20 Любопытная
 
05.09.13
13:36
(18) Я бы посоветовала хотя бы изредка меня не комментировать. (19) Ну вот, все просто. Но от запросов в цикле все же советую избавиться. Нехорошо это
21 Kvitok8320
 
05.09.13
13:38
Спасибо еще раз! Понял, что надо, пока не понял как - пошел изучать конструктор запросов
22 Kvitok8320
 
05.09.13
14:56
(10) ... исправленный вариант запроса (без запроса в цикле) .... (работает)
запрос = новый запрос;
запрос.Текст="

|ВЫБРАТЬ
|    КонтактнаяИнформация.Объект КАК Объект,
|    КонтактнаяИнформация.Тип КАК Тип,
|    КонтактнаяИнформация.Вид КАК Вид,
|    КонтактнаяИнформация.Представление,
|    ХозрасчетныйОстатки.Счет КАК Счет,
|    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
|    ХозрасчетныйОстатки.СуммаОстатокКт
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
|    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    ПО ХозрасчетныйОстатки.Субконто1 = КонтактнаяИнформация.Объект
|ГДЕ
|    ХозрасчетныйОстатки.Счет = &ВыбСчет
|УПОРЯДОЧИТЬ ПО
|    Объект
        
выбсчет=планысчетов.Хозрасчетный;
нужныйсчет = выбсчет.УставныйКапитал_ОбыкновенныеАкции;
запрос.УстановитьПараметр("ВыбСчет",Нужныйсчет);
23 Wobland
 
05.09.13
15:41
(22) левое сделай. внутреннее тебе убьёт (возможно) некоторые записи из регистра бухгалтерии
24 Wobland
 
05.09.13
15:44
да и как-то.. странный он какой-то, запрос. вот так вот шарашить по всему регистру, полагая, что первое субконто - это кто-то (кто?) с контактами?
25 Любопытная
 
05.09.13
16:49
(22) Теперь советую освоить параметры виртуальных таблиц. Тогда запрос будет работать быстрее)
Таким образом ты выбрал все объекты, по которым есть остатки по выбранному счету И у которых есть контактная информация. Т.е. объекты с остатками без контактной информации в выборку не попадут. И наоборот :)
26 Kvitok8320
 
05.09.13
20:15
(23) (24) я понял, что вы имеете ввиду, проверю, обязательно учту на будущее.
это запрос под конкретный счет 80.01 - там субконто1 = контрагенты, а у них предположительно должна быть контактная информация (если бы ее занесли) ...
27 Kvitok8320
 
05.09.13
20:21
(25) то есть, если я правильно понял, нужно определить, что для меня первично и после этого решить, какой тип соединения устанавливать ... ок, буду думать
28 Kvitok8320
 
06.09.13
15:12
а скажите пожалуйста, если мне нужно проанализировать какой-то период "по состоянию на конец каждого дня", на предмет каких-то показателей , это тоже можно без запроса в цикле реализовать? ... а то вдруг нельзя, а я ...
29 Wobland
 
06.09.13
15:46
(28) нужно. можно поискать "срез последних на каждую дату"
30 Kvitok8320
 
06.09.13
21:14
(29) .... это магия более высокого уровня ... попробую разобраться ....
31 Kvitok8320
 
10.09.13
13:38
Подскажите пожалуйста: в процессе борьбы со срезом последних на каждую дату у меня не получается в ВЫБРАТЬ добавить в запрос2
Максимум(РегистрСведенийФФФ.Период) как Период
Начинает ругаться на ВТ1.ДоговорЗайма и т.п.

а не определяя максимум, ошибок нет, но результат не тот, что нужен ....


&НаСервере
Процедура сформироватьсервер()
    
МВТ = Новый МенеджерВременныхТаблиц;
Запрос=Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "
|выбрать ДоговорЗайма, Период, Остаток
|поместить ВТ1
|ИЗ регистрнакопления.договорызаймаостатки
|где регистрнакопления.договорызаймаостатки.договорзайма=&договорзайма
|сгруппировать по договорзайма, период, остаток
|Индексировать по  договорзайма, период, остаток";

запрос.УстановитьПараметр("ДоговорЗайма",объект.Договорзайма);

результат = запрос.Выполнить();
выборка = результат.Выбрать();
Пока выборка.следующий() Цикл
а=0;
КонецЦикла;


запрос2 =  новый запрос;
запрос2.МенеджерВременныхТаблиц = МВТ;
запрос2.Текст = "
|Выбрать
|ВТ1.ДоговорЗайма, ВТ1.Период, ВТ1.Остаток
|
|ИЗ  ВТ1
|Левое Соединение
|Регистрсведений.ДоговорыЗаймаЗадолженность
|ПО ВТ1.Период >= Регистрсведений.ДоговорыЗаймаЗадолженность.Период И
|ВТ1.ДоговорЗайма = Регистрсведений.ДоговорыЗаймаЗадолженность.ДоговорЗайма";

результат2 = запрос2.Выполнить();
выборка2 = результат2.Выбрать();
пока выборка2.Следующий() цикл
а=0;
конеццикла;
КонецПроцедуры
32 Любопытная
 
10.09.13
13:54
(31) А что не получается?
33 Kvitok8320
 
10.09.13
13:56
так вот это и не получается - когда пишу не Максимум(РС.период), а просто РС.Период
ошибку не выдает, а когда пишу Максимум(РС.Период) - ругается
34 Любопытная
 
10.09.13
13:56
(33) Как ругается?
35 Kvitok8320
 
10.09.13
14:00
написал вот так

запрос2.Текст = "
|Выбрать
|ВТ1.ДоговорЗайма, ВТ1.Период, ВТ1.Остаток,
|Максимум(РегистрСведений.ДоговорыЗаймаЗадолженность.период) как дата
|ИЗ  ВТ1
|Левое Соединение
|Регистрсведений.ДоговорыЗаймаЗадолженность
....

ругается вот так
{Обработка.срезпоследнихнакаждуюдату.Форма.Форма.Форма(44)}: Ошибка при вызове метода контекста (Выполнить)
результат2 = запрос2.Выполнить();
по причине:
{(3, 1)}: Поле не входит в группу "ВТ1.ДоговорЗайма"
<<?>>ВТ1.ДоговорЗайма, ВТ1.Период, ВТ1.Остаток,
36 Любопытная
 
10.09.13
14:01
Все, рабочий день кончился.
(33) Подозреваю, что ты, когда примеры смотрел, СГРУППИРОВАТЬ ПО не увидел. МАКСИМУМ получается по какому-нибудь полю, а не просто так
37 Kvitok8320
 
10.09.13
14:03
проверю
38 Kvitok8320
 
10.09.13
15:38
переписал вот так

&НаСервере
Процедура сформироватьсервер()
    
МВТ = Новый МенеджерВременныхТаблиц;
Запрос=Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "
|выбрать ДоговорЗайма, Период, Остаток
|поместить ВТ1
|ИЗ регистрнакопления.договорызаймаостатки
|где регистрнакопления.договорызаймаостатки.договорзайма=&договорзайма
|сгруппировать по договорзайма, период, остаток
|Индексировать по  договорзайма, период, остаток";

запрос.УстановитьПараметр("ДоговорЗайма",объект.Договорзайма);
результат = запрос.Выполнить();
выборка = результат.Выбрать();
Пока выборка.следующий() Цикл
а=0;
КонецЦикла;

Запрос3=Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МВТ;
Запрос3.Текст = "
|выбрать ДоговорЗайма, Период как Дата, ЗадолженностьПоГрафику как задолженность
|поместить ВТ2
|ИЗ регистрсведений.договорызаймазадолженность
|где регистрсведений.договорызаймазадолженность.договорзайма=&договорзайма
|сгруппировать по договорзайма, период, задолженностьпографику
|Индексировать по  договорзайма, период, задолженностьпографику";

запрос3.УстановитьПараметр("ДоговорЗайма",объект.Договорзайма);
результат3 = запрос3.Выполнить();
выборка3 = результат3.Выбрать();
Пока выборка3.следующий() Цикл
а=0;
КонецЦикла;

запрос2 =  новый запрос;
запрос2.МенеджерВременныхТаблиц = МВТ;
запрос2.Текст = "
|Выбрать
|ВТ1.ДоговорЗайма, ВТ1.Период, ВТ1.Остаток,
|Максимум(ВТ2.дата) как максимум
|ИЗ  ВТ1
|Левое Соединение
|ВТ2
|ПО (ВТ1.Период >= ВТ2.Дата И
|ВТ1.ДоговорЗайма = ВТ2.ДоговорЗайма)
|Сгруппировать по
|ВТ2.Дата,
|ВТ1.ДоговорЗайма,
|ВТ1.Период,
|ВТ1.Остаток";

результат2 = запрос2.Выполнить();
выборка2 = результат2.Выбрать();
пока выборка2.Следующий() цикл
а=0;
конеццикла;
КонецПроцедуры

ошибку не выдает, но и максимум не отбирает
в ВТ1 = 5 элементов
в ВТ2 = 61 элемент
в выборка2 получает 161 элемент, вместо предполагаемых 5 ...
39 Kvitok8320
 
10.09.13
15:40
может вот это неправильно
|ВТ2
|ПО (ВТ1.Период >= ВТ2.Дата И
|ВТ1.ДоговорЗайма = ВТ2.ДоговорЗайма)
40 Любопытная
 
10.09.13
17:34
Ты не пробовал свои запросы в конструкторе создавать? Будет читабельнее)
Почему в последнем запросе у тебя поле ВТ2.Дата и в группируемых и в группировках? И зачем группировки в тех запросах, где группируемых полей нет?

Я немного не могу понять, что у тебя получилось. И чего ты хотел добиться
41 Любопытная
 
10.09.13
17:36
Ну, в общем, да. Убери из группировки ВТ2.Дата и по идее, должно все получиться.
42 Kvitok8320
 
10.09.13
18:59
(41) пытался создать аналог среза последних на каждую дату. во всех примерах, которые я нашел, нужно присоединить максимальное значение даты из искомой таблицы, которая соответствует дате в текущей строке первой таблицы - с помощью "максимума" ....
если я уберу соединение по дате - у меня ничего нужного мне не получится.
сейчас к каждой строке из левой таблицы присоединяются по очереди все строки из правой таблицы, которых дата меньше. а мне надо, чтобы присоединялась только одна из них ...
В конструкторе у меня вообще ничего не получается ....
43 Kvitok8320
 
10.09.13
19:14
(41) спасибо! заработало - буду дальше разбираться.
44 Kvitok8320
 
13.09.13
08:30
Добрый день, с этой задачей справился.
Присоединил информацию из 4-х регистров на каждую дату за заданный период по одному договору, с кучей запросов, но без запросов в цикле :).
А как быть, когда мне надо не по одному договору это сделать а сразу по всем (в аналитике, естественно)?
если я в качестве параметра не один договор передам, а список,
это будет работать по очереди с каждым элементом списка, или равносильно тому, что я вообще не задал договор для отбора?
Или мне сделать вспомогательный регистр?

есть даты 01.01, 02.01, 03.01, 04.01
есть договоры №1, №2, №3
я полагаю мне для для присоединения нужна таблица
01.01 №1
01.01 №2
01.01 №3
02.01 №1
02.01 №2
02.01 №3
....
можно сделать таблицу значений и загнать ее в регистр (потом очистить)
или "по правильному" надо как-то по другому?
45 Любопытная
 
13.09.13
08:46
(44) ничего не поняла :( Передай список, будет тоже самое, что и по одному договору, только по списку договоров.
46 Kvitok8320
 
13.09.13
08:48
понял, буду пробовать
47 Kvitok8320
 
13.09.13
09:09
При простой замене одного договора на список - вот такая вот ошибка выдается:

{Обработка.срезпоследнихнакаждуюдату_9_список.Форма.Форма.Форма(42)}: Ошибка при вызове метода контекста (Выполнить)
результат11 = запрос11.Выполнить();
по причине:
{(4, 79)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ИЗ регистрнакопления.договорызаймаостатки.ОстаткиИОбороты(,,День,,договорзайма<<?>>=&договорзайма)

там наверное не = надо ставить?
48 Любопытная
 
13.09.13
10:34
(47) не ну не так прямо конечно)
ОстаткиИОбороты(,,День,,договорзайма В(&договорзайма))
Потому что договор у тебя в списке
49 Kvitok8320
 
13.09.13
11:04
спасибо!
исправил - проверил - получилось также, как если бы я совсем параметр договора не устанавливал (проверял).

вариантов два - либо по циклу перебирать все договоры и запускать вариант который работает с одним договором (... знаю, что так "не правильно - если сделаю - никому не покажу ...),
либо создать вспомогательную таблицу вместо той, которую я использовал (регистрсведений.курсывалют), чтобы там были договоры для привязки
50 Любопытная
 
13.09.13
11:07
(49) так может у тебя в списке договоров все договоры, по которым есть движения, вот и получается так?
Вообще, беспредметно слегка и я не понимаю ход мыслей и требования по задаче. Так что сам.
А на счет "никому не покажу"... На баше же было: кодить надо так, будто проверять будет психопат, который знает ваш домашний адрес. Ну или что-то в этом роде))
51 Любопытная
 
13.09.13
11:07
(49) С праздником, кстати
52 Kvitok8320
 
13.09.13
11:11
(51) Понял :) Спасибо! (я правда типа аудитор ...., со сдвигом  в сторону программирования :)  )
а договоры там да, все - буду думать
53 Kvitok8320
 
13.09.13
11:13
О! Вас то тоже с Праздником!!!
Ошибка? Это не ошибка, это системная функция.