Роль "Остатки" поля набора данных СКД в отчете и в расшифровке

24.05.20

Разработка - СКД

В СКД создан набор данных "Запрос". Запрос выполняется к виртуальной таблице "Остатки и обороты", периодичность регистра "Авто", выбираются все измерения и ресурсы регистра, а так же выбирается Регистратор и ПериодСекунда. Для полей содержащих остатки устанавливается роль "Остатки". Для полей "Регистратор" и "ПериодСекунда" устанавливается роль "Период". Для поля "Регистратор" устанавливается выражение упорядочивания.

Набор данных "Запрос" СКД содержит следующий текст:

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


Настройки полей следующие:

 

Полям "КоличествоНачальныйОстаток" и "КоличествоКонечныйОстаток" назначена роль "Остатки". Полям "Регистратор" и "ПериодСекунда" назначена роль "Период". Для поля "Регистратор" установлено выражение упорядочивания.

Настройки:

Результат:


Расшифровка:

Пока все очевидно и предсказуемо.

А теперь чуть-чуть изменим текст запроса.

 
 Новый текст запроса

Настройки полей и настройки СКД не изменились (не считая добавления еще одного ресурса "КоличествоОборот").

А вот результат изменился:

Но исказились только поля остатков, обороты остались корректными. В полях остатка считается просто сумма.

Но при этом расшифровка формируется корректно:

 

В новом тексте запроса я не случайно выделил кусок РН1.РЕГИСТРАТОР = РН2.РЕГИСТРАТОР.

Если из соединения убрать это условие, то результат снова становится корректным.

А теперь установим такой текст запроса:

 
 Новый текст запроса

И результат, и расшифровка формируются корректно.

Но такой способ можно применить не всегда.

Были опробованы следующие способы обойти эту проблему:

1. Запросы помещались во временные таблицы:

 
 Текст запроса с временными таблицами

2. Отключалось Автозаполнение:

 
 Текст запроса для отключения Автозаполнения

Ни один из этих вариантов не помог добиться корректного заполнения полей остатков в отчете. 

Почему не работает роль "Остатки" если в запросе присутствует соединение с таблицей регистра по регистратору и как выйти из ситуации я разобраться не смог. Если знаете способ, то отпишитесь в коментах.

 

UPD.

Сообщество объяснило, как решить данную проблему. Спасибо Денис Урянский.

Решение.

Необходимо добавить второй набор данных и вынести в него запрос к той таблице, которую мы присоединяем левым соединением. Соответственно из первого набора эту таблицу убираем, т.е. приводим его к виду указанному в самом начале публикации.

Набор 2. 

После этого необходимо настроить связи между наборами. Ключевым моментом является настройка связи по регистратору. Она должна быть необязательной.

На этом, собственно, все. Остальные настройки остаются без изменений, а отчет и расшифровка формируются корректно. 

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    126530    685    389    

737

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4446    33    obmailok    19    

70

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2177    2    Yashazz    0    

31

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8442    20    John_d    25    

124

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    5004    PROSTO-1C    13    

64

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    6074    15    kalyaka    5    

88

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    7570    accounting_cons    7    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4814    KVIKS    15    

80
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 25.05.20 09:20 Сейчас в теме
Мои мысли такие.

Теория. СКД, вычисляя начальный и конечный остатки, оперирует уже готовой таблицей, полученной в результате выполнения запроса. При этом что для полей остатка, что для полей оборотов указывается одно и то же выражение итогов (ресурса): "Сумма". Однако мы понимаем, что на деле для правильного вычисления итогов по полям остатка не всегда нужно тупо складывать детальные записи. Например, в общем итоге для группировки по регистратору (расшифровка) для начального остатка нужно взять начальный остаток для самой первой записи, а конечный - для самой последней. Чтобы СКД понимала, для каких полей нужно простое сложение детальных записей, а для каких с учетом момента времени, разработчику и предоставлена возможность указывать роль "Остаток" для полей в наборах данных.

Еще раз обращу на это внимание. СКД не понимает, что есть остаток, а что оборот в тексте запроса. Она оперирует уже готовой таблицей, где все необходимые значения полей выбраны. А вот как применять эти значения, СКД решает на основании ролей.

Проблема. Вы связали регистры по регистратору. Но в основном варианте отчета Регистратор не выбран. Следовательно СКД "выкинет" это поле из исходного запроса, вместе с периодом. При том выброшено оно будет только из секции "ВЫБРАТЬ", не из условия связей таблиц. В результате выполнения запроса мы получим таблицу с детализацией до регистратора, но при этом без колонок периода и регистратора. В итоге СКД оказывается в полной растерянности: поле остатка есть, значений остатка множество (для каждого из регистратора), но какое из них самое первое, а какое последнее, совершенно не понятно. Стало быть, нужные все значения каждой детальной записи, вот они все и складываются, выдавая в отчете некорректные начальный и конечный остатки.

Эта проблема уходит, когда осуществляется расшифровка по регистратору. Ведь теперь это поле не "выкидывается" из исходного запроса (оно выбрано в отчете), значит СКД имеет всю необходимую информацию для правильного расчета остатков.

Решение. Возможные решения очевидным образом вытекают из описания проблемы.
1. Сделать регистратор и период обязательными, настроив соответствующим образом их роли в наборах данных. Это приведет к невозможности для СКД в полной мере оптимизировать запрос, но Вам от данной оптимизации чаще только хуже.
2. Разделить регистры на два набора данных, связанных между собой. В этом случае все поля связи либо станут обязательными, либо они будут выброшены из обоих запросов к регистрам - в зависимости от того, как настроите связь наборов.
Cyberhawk; Aspire1C; Albert_2008; nagimo; kasper076; IgorS; +6 Ответить
4. kasper076 105 25.05.20 10:51 Сейчас в теме
(1) Спасибо. Проблема решилась именно через создания двух наборов данных и связь по регистратору сделана не обязательной.
Однако вопросы остаются.
В первом варианте отчета из статьи поле Регистратор так же будет выброшено из отчета, однако отчет формируется корректно. Собственно как и в варианте с объединением. Поле регистратор не выводится в отчет, но это не приводит СКД в растерянность.
Назначив поле регистратор обязательным получаем в отчете и расшифровке весьма загадочные цифры. СКД сортирует регистраторы по имени по алфавиту и таким образом вычисляет кто из них первый.
Я в ближайшее время дополню публикацию готовым решением и так же опишу все представленные нюансы.
6. dhurricane 25.05.20 11:01 Сейчас в теме
(4)
В первом варианте отчета из статьи поле Регистратор так же будет выброшено из отчета, однако отчет формируется корректно.
Потому что его нет вообще. Виртуальная таблица "ОстаткиИОбороты" будет получена в разрезе лишь измерений. Соответственно и растерянности нет, т.к. нет детализации до документа. При наличии соединения по регистратору таблица в дополнении к измерениям будет уже в разрезе и регистратора, хоть самой колонки регистратора не будет.
Назначив поле регистратор обязательным получаем в отчете и расшифровке весьма загадочные цифры.
Важно сделать обязательным не только регистратор, но и поле периода (секунда). Об этом я писал в исходном сообщении. СКД сортирует по ссылке, т.е. по уникальному идентификатору. Чтобы сортировала сперва по периоду, необходимо само поле периода.
7. kasper076 105 25.05.20 13:02 Сейчас в теме
(6)
Важно сделать обязательным не только регистратор, но и поле периода (секунда). Об этом я писал в исходном сообщении. СКД сортирует по ссылке, т.е. по уникальному идентификатору. Чтобы сортировала сперва по периоду, необходимо само поле периода.

Этот момент проверил и убедился, что это именно так. Сделав обязательными не только поле Регистратор, но и поле ПериодСекунда я получил корректный результат.
Потому что его нет вообще. Виртуальная таблица "ОстаткиИОбороты" будет получена в разрезе лишь измерений. Соответственно и растерянности нет, т.к. нет детализации до документа. При наличии соединения по регистратору таблица в дополнении к измерениям будет уже в разрезе и регистратора, хоть самой колонки регистратора не будет.

Виртуальная таблица имеет настройки РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) и в результате поле регистратор есть. Опять же не обязательно получать данную таблицу из виртуальной таблицы регистра накопления. Таблица может быть произвольной. Так что этот момент остается мне неясным.
8. dhurricane 25.05.20 13:26 Сейчас в теме
(7)
остается мне не ясным
Попробую показать наглядно. Представьте себя на месте СКД. :)

Согласно настройкам отчета от Вас не ждут вывода в отчет ни регистратор, ни периода. Для оптимизации исходного запроса Вы "выбрасываете" неиспользуемые поля из выборки. В результате получаете следующий запрос:
ВЫБРАТЬ
	РН1.Организация КАК Организация,
	РН1.Склад КАК Склад,
	РН1.Номенклатура КАК Номенклатура,
	РН1.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
	РН1.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
	РН1.КоличествоПриход КАК КоличествоПриход,
	РН1.КоличествоРасход КАК КоличествоРасход,
	РН2.СуммаОборот КАК СуммаОборот,
	...
	// опущены добавленные поля представлений и сортировки для организации, склада и номенклатуры
ИЗ
	РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) КАК РН1
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрНакопления2.Обороты(, , Авто, ) КАК РН2
		ПО РН1.Организация = РН2.Организация
			И РН1.Склад = РН2.Склад
			И РН1.Номенклатура = РН2.Номенклатура
			И РН1.Регистратор = РН2.Регистратор
Показать
Результатом этого запроса будет таблица, представленная на рисунке (см. вложение). Прим.: наименования и некоторые цифры изменены в сравнении с Вашим примером для наглядности.

А теперь будучи на месте СКД попытайтесь вычислить начальный остаток по организации для представленной таблицы. Какое значение взять? В выражении ресурса для полей остатков указана формула "Сумма(...)". Полей периода нет, есть только измерения, и непонятно в итоге, какая из записей на оси времени первая, какая последняя. Соответственно Вы просто складываете значения и получаете вместо нулевого начального остатка остаток, равный -3.
Прикрепленные файлы:
vshish; Cyberhawk; acanta; +3 Ответить
9. kasper076 105 25.05.20 13:51 Сейчас в теме
(8)
С этим я полностью согласен. Но если мы уберем ЛЕВОЕ СОЕДИНЕНИЕ, то от нас так же не будут ожидать вывода ни регистратора, ни периода и данные поля будут выкинуты. Однако отчет сформируется корректно.
10. dhurricane 25.05.20 13:54 Сейчас в теме
(9)
Но если мы уберем ЛЕВОЕ СОЕДИНЕНИЕ
Так ведь изменятся детальные записи (см. рис.). В результате выполнения запроса останется лишь одна строка. Ведь без соединения по регистратору меняется детализация виртуальной таблицы в сторону ее уменьшения до измерений регистра. И тут нет неоднозначности, какое значение взять в качестве остатка.

P.S. Вернее сказать будет так. Сумма из одного значения даст нам верный остаток.
Прикрепленные файлы:
Cyberhawk; +1 Ответить
11. kasper076 105 25.05.20 13:56 Сейчас в теме
(10)
Вот теперь все встало на свои места. Огромное спасибо за ликбез.
2. toypaul 63 25.05.20 10:13 Сейчас в теме
Где-то тут на ИС я уже видел такое. Давно это было. Именно про соединение по регистратору. Не статья, а на форуме по-моему.
3. toypaul 63 25.05.20 10:18 Сейчас в теме
Через 2 набора должно сработать. В новом тексте запроса роли у остатков не сбились? Обычно так бывает (суммирует), когда роли у остатков не заполнены
5. kasper076 105 25.05.20 10:51 Сейчас в теме
(3) Решилось через 2 набора. Роли не сбивались.
12. Новиков 292 27.05.20 18:13 Сейчас в теме
Спасибо автор, спасибо Денис! :)

Если идти по пути объединения в тексте запроса, то в случае, когда будет добавлена группировка по регистратору, скорее всего проблема повторится. В этой статье автор ее победил.
13. Yashazz 4727 07.06.20 15:58 Сейчас в теме
Это ещё в 2012-м на ДевТрейне было, Радченко отвечал и про 2 набора всё объяснял.

Я вот не понимаю, зачем из рабочей проблемы, которой, к тому же, автор не нашёл самостоятельно решения, было делать публикацию? Ну давайте я завтра наткнусь на какой-нибудь затык, раскатаю со скринами в эдакое вот, и в конце напишу: "чё делать хз, помогитя". И каждый так сделает. Это типа нормально теперь, да?
alest; TerveRus; +2 3 Ответить
14. kasper076 105 07.06.20 19:23 Сейчас в теме
(13) было бы весьма уместно тут ссылку дать на материал 12-го года. Публикация была оформлена потому, что в обычном посте нельзя наглядно показать всю суть проблемы. Я считаю, что сообщество для того и существует, чтобы решать тут свои затыки. Разве нет?
Varozh; dvsidelnikov; Xershi; +3 Ответить
16. Yashazz 4727 08.06.20 12:02 Сейчас в теме
(14) Ну, если кто нахаляву хочет, чтоб разжевали и в рот положили, то оно конешно. Только вот для этого есть вопросы, и оформлять свой затык следует как вопрос, а не как публикацию. Ну, по крайней мере, меня так в 2008-м году модераторы ИС учили. Возможно, нечто изменилось, и теперь можно своё незнание и обращение за помощью презентовать как основной материал ИС)))
kasper076; +1 4 Ответить
15. vipetrov2 08.06.20 06:30 Сейчас в теме
По регистратору соединение делается ТОЛЬКО ОБОРОТОВ.

Поэтому для корректной работы надо сначала соединить остатки 2-х регистров по 3-ем полям. Потом отдельно соединить обороты 2-х регистров по 4-ем полям, включая регистратор. И уже в конце соединять 2 виртуальные таблицы остатков и оборотов. И везде делать соединение полное.
17. echo77 1884 01.04.21 19:48 Сейчас в теме
(0) ИМХО, разнородные данные лучше объединять, а не соединять. В чём проблема расчета остатков в СКД описано здесь: https://infostart.ru/1c/articles/1409861/#%D0%9A4 видео + ссылка на статью.

Возможно я неправильно понял суть продемонстрированного в публикации решения :-)
18. Salavat 13 10.04.22 14:00 Сейчас в теме
Спасибо, за очередную подсказку!!
19. Vortigaunt 96 26.03.23 14:36 Сейчас в теме
Спасибо. Как раз столкнулся с такой проблемой. Мне надо было соединить остатки с оборотами по бухучету, чтобы получить ведомость по взаиморасчетам. Одна таблица "Остатки и обороты" не подходила, потому что надо было наложить условие на счет и на корр счет для оборотов. Связано с зачетом авансов.
Дополнительно хочу отметить, что связи наборов данных связываются по левому соединению, поэтому в мою ведомость сначала перестали попадать строки где начальный и конечный остаток нулевые, но есть обороты. Решил так: левый набор записей - таблица "Остатки и обороты", добавил из нее поля оборотов и в ролях сделал их обязательными.
20. Xershi 1484 04.11.23 22:01 Сейчас в теме
Спасибо за статью!
Как раз такая же проблема была!
Корректный расчет остатков и по разным разделам учета.
Получается если мы делаем объединение, то нужно сделать дополнительное поле уникальности. После добавления такого поля и указания его как измерение и обязательное отчет стал показывать все корректно!
Оставьте свое сообщение