Имя: Пароль:
1C
1С v8
СКД и пересчёт в валюту полей с ролями Начальный, Конечный остаток.
0 Deryni
 
23.11.16
10:57
Имеем регистр Расчёты с подотчётными лицам. Учёт ведётся в разрезе подотчётных лиц и валют.
Хочу отчёт, где в строках - подотчётные лица, под ними документы, в колонках валюты. Каждый блок колонок Нач. ост, Приход, Расход, Кон. ост.
В конце Итого в валюте, которую выбирает пользователь. Для простоты пусть это будет доллар.
Сами курсы валют передаю внешним набором данных (таблица значений). Это связано с тем, что в системе есть курсы для разных стран и запрос по курсам валют - отдельная сложная тема. Поэтому мне удобнее получать таблицу курсов заранее и потом передавать в запрос именно таблицей.
Естественно наборы связаны между собой.
Для расчёта, собственно по курсу используются вычисляемые поля СКД.
И всё вроде как хорошо. Но вычисляемому полю нельзя присвоить роль.
Получается вот что. Все мы знаем, что при запросе ОстаткиИОбороты кроме собственно документов получаются ещё 2 пустых строки с начальным и конечным остатком. Они выводятся в отчёт. Ну выводятся и фиг с ними, подавить то вывод можно.
Но из-за того, что вычисляемым полям нельзя задать роль получается, что сумма в долларах в начальном и конечном остатке задваивается
Т.е. например у сотрудника Вася есть долг на начало 600 рублей. Это 10 долларов. Но в отчёте показывает 20.
Потому что в самом запросе поле Начальный остаток имеет роль "Начальный остаток", а вот вычисляемое поле Начальный остаток долл. роли не имеет и задать её нельзя.
Подскажите, как правильно сделать. Спасибо.
1 Курцвейл
 
23.11.16
10:59
(0) Переодичность какая указана в запросе?
И 2 - какие периоды выбраны?
2 Deryni
 
23.11.16
11:04
(1)
Ну естественно Регистратор и ПериодСекунда.
Поэтому остатки по валютам показывает правильно. Неправильно показываются только значения вычисляемых полей.
Период тоже выбран Регистратор.
3 Deryni
 
23.11.16
11:05
(1)
Т.е. в приведенном примере в колонке Рубль показывает начальный остаток 600 (что правильно), а вот в колонке Доллар - 20.
4 Курцвейл
 
23.11.16
11:06
(2) Я про периодичность виртуальной таблицы
5 DrShad
 
23.11.16
11:08
а почему пересчет именно в выч полях, а не в запросе?
6 Deryni
 
23.11.16
11:11
(4)
Периодичность - Авто.

(5) а как я в запрос передам таблицу значений? А поля связанных наборов данных я в запросе использовать не могу. Или же не знаю, как.
7 DrShad
 
23.11.16
11:13
(6) ты не поверишь, но источником данных для набора может быть таблица значений
8 Deryni
 
23.11.16
11:14
(7) я в курсе.
У меня в источнике данных 2 набора данных. Собственно запрос по регистру и Таблица значений.
Но в запросе поля этой таблицы я использовать не могу. Только в вычисляемых полях.
9 DrShad
 
23.11.16
11:15
а кто тебе запрещает их использовать?
10 Deryni
 
23.11.16
11:17
(9)
Подскажи как.
Я не знаю.
Пишу в запросе поле ТаблицаКурсов.Курс. Ругается.
ТаблицаКурсов - это второй набор данных.
11 DrShad
 
23.11.16
11:18
используй временные таблицы
12 Deryni
 
23.11.16
11:18
Ещё раз. Запрос выглядит вполне обычно.
Так

ВЫБРАТЬ
    ВЗСотр.Регистратор,
    ВЗСотр.ПериодСекунда,
    ВЗСотр.ФизЛицо,
    ВЗСотр.Валюта,
    ВЗСотр.РасчетныйДокумент,
    ВЗСотр.Организация,
    ВЗСотр.Ссуда,
    ВЗСотр.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачОст,
    ВЗСотр.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонОст,
    ВЗСотр.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВЗСотр.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВЗСотр.Организация.ВалютаРегламентированногоУчета КАК НацВалюта
ИЗ
    РегистрНакопления.ВзаиморасчетыСПодотчетнымиЛицами.ОстаткиИОбороты(, , Авто, , ) КАК ВЗСотр
13 DrShad
 
23.11.16
11:20
(12) это запрос в СКД? а где параметры вирт таблицы?

ну и помещай данные из ТЗ во временную, это тоже во временную, а потом соединяй или объединяй две временные таблицы
14 Deryni
 
23.11.16
11:20
(11)
Т.е. мне нужно сформировать таблицу значений из запроса по регистру, в ней всё пересчитать, а потом её уже использовать как источник для  СКД.
Ну такая идея приходила мне в голову, но я думал, что всё-таки можно решить вопрос другим методом.
Виртуальные таблицы в запросе я использовать не могу. СКД не умеет получать в запросе данные из таблицы значений. Это можно делать только в объекте Запрос. Передать ему параметром ТЗ, в запросе выбрать все её данные в ВТ, а потом ВТ использовать дальше.
15 Deryni
 
23.11.16
11:21
(13)
Что значит "где параметры"? Параметры начало периода и конец периода СКД добавляем само. Как и и ДвиженияИГраницыПериода.
Оно работает правильно для полей запроса, для которых заданы роли. Проблема возникает именно с вычисляемыми полями.

Нельзя поместить ТЗ во временную таблицу в запросе в СКД.
16 DrShad
 
23.11.16
11:22
и почему бы не взять курсы из регистра сведений?
17 DrShad
 
23.11.16
11:23
РегистрНакопления.ВзаиморасчетыСПодотчетнымиЛицами.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, Авто, , )

вот так и єто СКД само не делает
18 Курцвейл
 
23.11.16
11:23
(14) Очень странно работают вычисляемые поля у тебя.
Может нужно агрегирующую функцию применить или назначить его в ресурс?

Кроме того пересчет по курсу можно вынести в общий модуль и под отладкой посмотреть что у тебя происходит с СКД
19 Deryni
 
23.11.16
11:24
(16)
Потому что такие начальные условия задачи.
Там очень сложная структура курсов. Есть несколько регистров с курсами. Плюс курс нужно брать средний за период. Для этого у меня уже есть готовые процедуры. Зачем мне повторять эти запросы в каждом отчёте, когда можно получить таблицу курсов заранее и передать?
Вопрос вообще не в этом. Вопрос в том, возможно ли такое, как я хочу именно в таком варианте со связыванием наборов данных, или нужно искать другие пути.
20 DrShad
 
23.11.16
11:27
(19) ну ты же уже дошел до того что вычисляемые поля не имеют возможности быть выбранными в наборе данных - ищи другие пути
21 Deryni
 
23.11.16
11:27
(17)
Это не важно. Если без пересчёта всё работает хорошо. Остатки по каждой валюте считаются правильно.

(18)
Да оно правильно считает по курсу, оно просто не понимает, что СуммаНачОстДолл - это начальный остаток и не нужно его суммировать.
Хорошо.
Результат выполнения СКД с группировкой по документам выглядит так:
Сотрудник Вася    - 600
   Пустая строка  - 600
   Пустая строка  - 600
   Документ 1     - 600
   Документ 2     - 500

И вот оно правильно показывает 600, но в долларах считает 2 по 600. Потом, что вычисляемому полю нельзя присвоить роль.

Я понимаю, что у меня происходит. Он первые две пустых строки суммирует. Я не понимаю, как это обойти и заставить его считать только одну строку.
22 DrShad
 
23.11.16
11:31
игнорировать NULL
23 Курцвейл
 
23.11.16
11:31
(21) Это похоже на проблему получения остатков в разрезе документов :)
24 Deryni
 
23.11.16
11:40
(22)
Я не могу игнорировать NULL. Как минимум один раз я должен остаток посчитать.

(23)
Нет, не похоже. Остатки в разрезе документов как раз работают на ура. Вопрос именно в том, что вычисляемые поля не имеют роли. Поэтому он не воспринимает их как остатки и просто суммирует.
25 Курцвейл
 
23.11.16
12:13
(24) А причем тут роль? Твои вычисленные поля должны быть ресурсом.

ЗЫ Так же слабо понятна причина задвоения.
26 Курцвейл
 
23.11.16
12:15
+(25)
Попробуй такой вариант, добавь группировку ПериодСекунда,
а в группировке Регистратор не отображать Нач и Кон остатки.
27 Deryni
 
23.11.16
13:15
(26)
Причина задвоения - простая. Когда выполняется запрос по ВТ с периодичностью Регистратор там всегда будет 2 строки с пустым регистратором. Это остаток на начало и на конец. Если задать роли для поле СуммаНачальныйОстаток и СуммаКонечныйОстаток, то СКД понимает, что это остатки и не суммирует остатки в этих двух строках для группировки более высокого уровня.
А вот для вычисляемых полей - она не понимает.
ПериодСекунда у меня в запросе есть. Именно поэтому без вычисляемых полей всё работает ок.
Программист всегда исправляет последнюю ошибку.