Имя: Пароль:
1C
1С v8
Нужна помощь в написании запроса
0 capllary
 
02.10.14
08:01
Требуется получить ОборотКт 51 счета с отбором по статье движения денежных средств.

Пока написал вот что, но почему то результат выходит нулевой, хотя в оборотке вижу движения за этот период по данным СДДС:


ПС = ПланыСчетов["Хозрасчетный"];
     Счет51   = ПС.НайтиПоКоду("51");
     Субконто1 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000039");
     Субконто2 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000040");
     Субконто3 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000154");

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

     РезультатЗапроса = Запрос.Выполнить().Выбрать();
     РезультатЗапроса.Следующий();
     Сообщить(РезультатЗапроса.СуммаДокумента);
2 capllary
 
02.10.14
08:06
Последнюю строку не ту скопировал:

Вместо:

Сообщить(РезультатЗапроса.СуммаДокумента);

Вот что:

Сообщить(РезультатЗапроса.СуммаОборотКт);
3 Wobland
 
02.10.14
08:10
ну и сообщается тебе нулл согласно этогам
4 capllary
 
02.10.14
08:12
(3) Сообщается не NULL, а 0
6 Wobland
 
02.10.14
08:13
ноль так ноль. итоги тебе зачем?
8 capllary
 
02.10.14
08:14
(5) Щас качну консоль.
9 Wobland
 
02.10.14
08:14
(7) запятую пропустил
11 capllary
 
02.10.14
08:16
(9) Где запятую пропустил?
12 Wobland
 
02.10.14
08:16
(11) перед неопределённым артиклем
13 capllary
 
02.10.14
08:16
(6) Итоги убрал, все равно 0
14 Галахад
 
гуру
02.10.14
08:17
Чо-то, новое:

Субконто1 В (&Субконто1, &Субконто2, &Субконто3)
15 Wobland
 
02.10.14
08:17
теперь сумму убери
16 capllary
 
02.10.14
08:21
(12) Что за артикл?
17 capllary
 
02.10.14
08:21
(15) Сумму убрал, эффект тот же.
18 Wobland
 
02.10.14
08:23
(17) всё правильно
19 organizm
 
02.10.14
08:25
запихай Субконто1,2,3 в массив и сделай его параметром
20 organizm
 
02.10.14
08:26
ИТОГИ зачем? если есть агрегатная функция
21 ChiginAV
 
02.10.14
08:27
Запрос = Новый Запрос("ВЫБРАТЬ
|    СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачПериода, &КонПериода, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета), , Субконто2 В (&МассивСтатейДДС), , ) КАК ХозрасчетныйОбороты");

Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("КонПериода", Новый Граница(КонПериода, ВидГраницы.Включая));
МассивСтатейДДС = Новый Массив;
МассивСтатейДДС.Добавить(Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000039"));
МассивСтатейДДС.Добавить(Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000040"));
МассивСтатейДДС.Добавить(Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000154"));
Запрос.УстановитьПараметр("МассивСтатейДДС", );

Выборка = Запрос.Выполнить().Выбрать();

Сообщить(?(Выборка.Следующий(), Выборка.СуммаОборотКт, 0));
22 organizm
 
02.10.14
08:27
вид субконто определи в параметрах виртуальной таблицы
23 ChiginAV
 
02.10.14
08:28
(21) Упс, последний параметр не установил
24 Cube
 
02.10.14
08:28
(0) Начнем с того, что надо бы называть переменные своими именами. В частности в строке

РезультатЗапроса = Запрос.Выполнить().Выбрать();

Метод запроса Выбрать() возвращает выборку из результатов запроса, поэтому правильно писать

Выборка = Запрос.Выполнить().Выбрать();
25 organizm
 
02.10.14
08:28
Сообщить(?(Выборка.Следующий(), Выборка.СуммаОборотКт, 0));

это то же очень оригинально.

"Выборка.Следующий()" отдельно вверх
26 Cube
 
02.10.14
08:29
(21) Не взлетит. В запрос надо список значений сувать, а не массив.
27 ChiginAV
 
02.10.14
08:29
(25) Зачем?
28 Cube
 
02.10.14
08:30
(25) Здесь как раз, всё отлично.
29 ChiginAV
 
02.10.14
08:30
(26) Попробуй сначала
30 organizm
 
02.10.14
08:30
(26) да?!..
31 Cube
 
02.10.14
08:30
+(28) Ой, я думал, что у него написано Сообщить(?(Выборка.Следующий(), Выборка.СуммаОборотКт, 0)); и тебе не нравится)))
32 capllary
 
02.10.14
08:36
Пробую.
33 organizm
 
02.10.14
08:36
ВЫБРАТЬ
    СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачПериода, &КонПериода, , Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета)), &ВС, Субконто1 В (&МассивСтатейДДС), , ) КАК ХозрасчетныйОбороты
34 Cube
 
02.10.14
08:37
+(26) Чёрд! Я точно помню, что не работало... Потому что в этом случае можно было бы пользоваться методом ВыгрузитьКолонку() у ТЗ, но приходилось перебором создавать СЗ и скармливать его запросу...
35 organizm
 
02.10.14
08:37
в &ВС поставь ПВС
36 organizm
 
02.10.14
08:38
* ПВХ
37 organizm
 
02.10.14
08:39
(34) в  консоли только СЗ, в коде и массив нормально кушает.
38 capllary
 
02.10.14
08:40
(33) Пока что по прежнему 0
39 ChiginAV
 
02.10.14
08:40
Еще вот так, чтоб совсем хорошо было

"ВЫРАЗИТЬ(Субконто2 КАК Справочник.СтатьиДвиженияДенежныхСредств) В (&МассивСтатейДДС)"
40 Cube
 
02.10.14
08:42
(38) Убери отбор по статьям ДДС и в запрос добавь все поля, оттуда и пляши потом.
41 organizm
 
02.10.14
08:43
в &ВС устанавливаешь каким должен быть Субконто1 для отбора. Если у тебя 51 счет "Банковские счета", "Статьи ДС", можно в &ВС поставить ПВХ.СтатьиДС и отбирай как хотел.
42 organizm
 
02.10.14
08:43
короче посиди подумай, все должно работать. посмотри Оборотку, может там и нет ничего
43 ChiginAV
 
02.10.14
08:45
Посмотрел бы оборотку по 51, чтоб быть уверенным, что есть обороты за период по выбранным статьям
44 capllary
 
02.10.14
08:47
(43) Оборот точно есть.
45 capllary
 
02.10.14
08:48
Мне просто вообще нужен отбор по 20 статьям ДДС.
46 capllary
 
02.10.14
08:48
(44) И оборот точно Кт именно по 51 счету.
47 ChiginAV
 
02.10.14
08:49
(44) Оборот есть. Запрос рабочий. Кто тогда слабое звено?
48 capllary
 
02.10.14
08:49
В не за данный период есть один документ Платежное поручение исходящее со статьей, у которой код 000000154
49 capllary
 
02.10.14
08:50
В ней, в оборотке
50 capllary
 
02.10.14
08:51
Убираю субконто, выдает полный оборотКт по 51 счету за данный период.
52 capllary
 
02.10.14
08:51
Значит точно проблема в Субконто1
54 organizm
 
02.10.14
08:52
ВЫБРАТЬ
    СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачПериода, &КонПериода, , Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета)), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств), Субконто1 В (&МассивСтатейДДС), , ) КАК ХозрасчетныйОбороты
55 capllary
 
02.10.14
08:52
(39) Кстати, почему написано "ВЫРАЗИТЬ(Субконто2 КАК Справочник.СтатьиДвиженияДенежныхСредств) В (&МассивСтатейДДС)". В плане есть ли разница между Субконто1 и Субконто2?
56 organizm
 
02.10.14
08:52
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Сообщить(Выборка.СуммаОборотКт);
57 organizm
 
02.10.14
08:53
(55) смотри (54)
58 capllary
 
02.10.14
08:53
(54) Щас попробую.
59 ChiginAV
 
02.10.14
08:54
(55) Тип значений разный
60 ChiginAV
 
02.10.14
08:54
(56) Если выборка пустая, ошибка будет
61 organizm
 
02.10.14
08:57
(60)ну можно и так:
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат 0;
КонецЕсли;

Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Сообщить(Выборка.СуммаОборотКт);
62 hhhh
 
02.10.14
08:57
(58) да, там на счете 51 статьи - это Субконто2
63 ChiginAV
 
02.10.14
08:57
(61) То-есть если пустой, то сообщать об этом не надо?
64 organizm
 
02.10.14
08:58
можно еще и так:
СУММА(ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотКт,0)) КАК СуммаОборотКт
65 organizm
 
02.10.14
08:58
(63) сообщи
66 capllary
 
02.10.14
08:59
(65) Пока никак, щас скину полный код, который у меня.
67 capllary
 
02.10.14
09:00
ТекстЗапроса =
     "ВЫБРАТЬ
     |    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт
     |ИЗ
     |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета)), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств), Субконто1 В (&МассивСтатейДДС)) КАК ХозрасчетныйОстаткиИОбороты";
Запрос = Новый Запрос;
     Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(мДатаКонцаПериодаОтчета));
     Запрос.УстановитьПараметр("КонПериода", КонецДня(мДатаКонцаПериодаОтчета));
МассивСтатейДДС = Новый Массив;
     МассивСтатейДДС.Добавить(Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000039"));
     МассивСтатейДДС.Добавить(Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000040"));
     МассивСтатейДДС.Добавить(Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000151"));
     Запрос.УстановитьПараметр("МассивСтатейДДС", );
Запрос.Текст = ТекстЗапроса;

     РезультатЗапроса = Запрос.Выполнить().Выбрать();
     РезультатЗапроса.Следующий();
     Сообщить(НачалоМесяца(мДатаКонцаПериодаОтчета));
     Сообщить(мДатаКонцаПериодаОтчета);
     Сообщить(РезультатЗапроса.СуммаОборотКт);
68 capllary
 
02.10.14
09:01
По этому Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000151") точно есть сумма за данный период
69 organizm
 
02.10.14
09:03
(68) может они группа ?
70 capllary
 
02.10.14
09:03
(64) Когда вставляю твой код, конструктор запроса пишет что поле не найдено.
71 ChiginAV
 
02.10.14
09:03
(67) Субконто2 же
72 capllary
 
02.10.14
09:05
(71) Где субконто2? Тут - Субконто1 В (&МассивСтатейДДС))?
73 ChiginAV
 
02.10.14
09:05
(72) да
74 hhhh
 
02.10.14
09:06
(72) а зачем ОстаткиИОбороты? Сделай просто Обороты
75 capllary
 
02.10.14
09:06
(73) Ошибка обработки представления "РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты:Поле не найдено (Субконто2)"
<<?>>РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета)), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств), Субконто2 В (&МассивСтатейДДС)) КАК ХозрасчетныйОстаткиИОбороты
76 capllary
 
02.10.14
09:07
(74) В данном случае мне кажется разницы никакой.
77 ChiginAV
 
02.10.14
09:07
(75) У тебя в плане счетов у 51 субконто "СтатьиДДС" какое по счету?
78 capllary
 
02.10.14
09:09
(77) Субконто2
79 capllary
 
02.10.14
09:10
(77) Теперь я начал понимать в чем разница Субконто1 и Субконто2 и Субконто3
80 hhhh
 
02.10.14
09:11
(77) он же поправил, задал свой порядок субконто

ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств),
81 hhhh
 
02.10.14
09:11
(79) правильно написано. Субконто1
82 ChiginAV
 
02.10.14
09:13
(80) Не порядок, а тип значения
(81) Неправильно
83 capllary
 
02.10.14
09:15
(82) Сделал так, все равно 0 возвращает.

РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета)), , Субконто2 В (&МассивСтатейДДС)) КАК ХозрасчетныйОстаткиИОбороты"
84 ChiginAV
 
02.10.14
09:15
Вставляем запрос из (21) в консоль. Проверяем. Удостоверяемся, что он работает. Думаем
85 hhhh
 
02.10.14
09:16
(82) синтакс помощник с вами не согласен

Субконто
Субконто (необязательный)

Тип параметра: ПланВидовХарактеристикСсылка.; Массив; ФиксированныйМассив; СписокЗначений.
Ссылка, или массив ссылок, или фиксированный массив ссылок, или список значений, содержащий ссылки, на виды субконто.
Задает набор и порядок субконто, которыми можно оперировать в запросе. Накладывает фильтр на записи по видам субконто (если массив, то по И).
Если параметр <Субконто> не задан, то субконто определяются позиционно. То есть выбирается вид субконто соответствующего счета из соответствующей позиции. Так, если <Субконто> не определен, и выполняется запрос по счету, у которого определены виды субконто первое "Материалы", второе "Склад", то поле "Субконто1" будет содержать материалы, а поле "Субконто2" - склады. Если выполняется запрос по двум счетам, при этом у первого настройка субконто "Материалы, Склад", а у второго "Склад, Материал" и не задан параметр <Субконто>, то поле "Субконто1" будет содержать и материалы для первого счета, и склады для второго счета. Поле "Субконто2" будет содержать склады для первого счета и материалы для второго.
Если параметр <Субконто> задан, то выбираются данные только по тем счетам, у которых определены все указанные виды субконто. При этом поля "Субконто<N>" будут содержать значения, соответствующие переданным видам субконто. Например, если один счет имеет настройку субконто "Материалы, Склад", а второй "Склад, Материалы", и параметр "Виды субконто" задан как массив "Материалы, Склад", то поле "Субконто1" будет содержать материалы, а поле "Субконто2" - склады независимо от счета.
Параметр "Субконто" не существует, если при конфигурировании для плана счетов не указаны субконто.
Значение по умолчанию: Неопределено.
86 capllary
 
02.10.14
09:17
Все получилось, щас опишу как.
87 ChiginAV
 
02.10.14
09:18
(85) Хм, не знал. Соглашусь
88 capllary
 
02.10.14
09:21
Все банально:

Субконто8 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000151");
     Субконто9 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000149");
     Субконто10 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000148");
     Субконто11 = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000152");


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

Запрос.УстановитьПараметр("Субконто1", Субконто11);
     Запрос.УстановитьПараметр("Субконто2", Субконто8);
89 capllary
 
02.10.14
09:22
У меня изначально все верно было, надо было просто поменять Субконто1 на Субконто2.
90 capllary
 
02.10.14
09:26
Всем спасибо.