Приветствую Вас ГостьЧетверг, 25.04.2024, 10:47

Каталог статей


Роли полей в наборе данных или почему СКД может врать

1. Исключение из запроса полей, которые не участвуют в настройках

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

Например, делаем запрос по сумме проданной номенклатуры. В запросе указываем день, номенклатуру, сумму, покупателя, регистратор. Допустим у нас один и тот же покупатель купил 3 раза одну и туже номенклатуру в один и тот же день по одной и той же цене (100 руб.).

  • Регистратор1, Номенклатура, Покупатель, 100
  • Регистратор2, Номенклатура, Покупатель, 100
  • Регистратор3, Номенклатура, Покупатель, 100

Если в настройках отчета укажем все поля запроса то получим верные данные. Если укажем только номенклатуру, покупателя и сумму, то рискуем получить меньший оборот, если у нас не будет детальных записей. В этом случае СКД сгруппирует все данные и вместо 3 строк по 100 руб, у нас появится 1 строка по 100 руб. Так как все 3 покупки будут различаться только регистраторами, который мы не включили, то в результате данные сгруппируются до 1 строки: Номенклатура, Покупатель, 100

Чтобы такого не случилось (мало ли как будут настраивать отчет пользователи), надо поставить в Роли поля "Регистратор" галку "Обязательное" 

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

2. Неверно настроен период в роли полей

Если в запросе используется регистр оборотов с автопериодом и в настройках отчета есть детализация по регистратору, то итоги могут рассчитаться неверно. Здесь есть правило: если регистратор указан в качестве периода в роли поля, то необходимо добавить в запрос ещё одно поле  ПериодСекунда (время до секунды), у которого в роли указать роль "Период". Номер периода будет больше номера периода у регистратора +1

Запрос:

ВЫБРАТЬ
    ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура,
    ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    ОстаткиНоменклатурыОстаткиИОбороты.Склад,
    ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток,
    ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток,
    ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход,
    ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход КАК Расход,
    ОстаткиНоменклатурыОстаткиИОбороты.Регистратор,
    ОстаткиНоменклатурыОстаткиИОбороты.ПериодСекунда

ИЗ
    РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(, , Авто, , ) КАК ОстаткиНоменклатурыОстаткиИОбороты

Настройка ролей:

Пример результата отчета с незаполненной ролью в поле ПериодСекунда

Пример результата отчета с заполненной ролью ПериодСекунда

Если вообще убрать период в ролях у полей, то получим следующее:

То же самое мы получим, если поставим период (1) в поле ПериодСекунда, а в настройках отчета не будем выводить поле ПериодСекунда (здесь срабатывает ошибка из пункта 1).

Это относится ко всем полям-периодам – при получении поля-периода в запросе должно присутствовать его родительское поле-период.

Поля-периоды для правильного расчета остатков должны иметь непрерывную нумерацию, начиная с 1. При этом чем меньше номер периода, тем более точным должен быть период. Например, поле НомерСтроки является уточнением поля Регистратор, поэтому номер периода поля НомерСтроки должен быть меньше, чем номер периода поля Регистратор. Аналогично и номер периода поля ПериодДень должен быть меньше, чем номер поля ПериодГод.

В нашем примере поле Регистратор (номер периода – 1) является уточнением поля ПериодСекунда (номер периода – 2). Если по какой-то причине роли полей-периодов не проставлены автоматически, необходимо сделать это вручную.

3. Отсутствие в запросе парного поля-остатка

Если в запросе отчета есть определение остатка, то надо чтобы было 2 остатка: начальный и конечный и в роли установлен соответствующий тип.

Пример результата отчета, у которого в запросе убрали начальный остаток:

При наличии в запросе парного поля-остатка и установленном свойстве Автозаполнение (Автоматическое заполнение полей) платформа автоматически заполнит Роли полей -остатка в наборе данных

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

4.Отсутствие в запросе родительских полей-измерений

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

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

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

5. Неправильно настроены измерения

Измерения - это поля, в разрезе которых должны быть получены остатки.

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

Например к предыдущему запросу добавим вывод поле Номенклатура.ВидНоменклатуры:

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

Добавим в настройках отчета группировку по виду номенклатуры:

При формировании отчета мы получим неправильные итоги по полю КонечныйОстаток

Результат отчета:

Проблема в том, что у поля ВидНоменклатуры не указана роль реквизита измерения. Для решения этой проблемы нужно указать родительское поле в роли поля-реквизита. Так, в приведенном выше примере нужно у поля ВидНоменклатуры указать роль Измерение и указать в качестве родительского поле Номенклатура

 

 

Категория: СКД | Добавил: leshic (17.06.2019)
Просмотров: 881 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [40]
Администрирование [34]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [28]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0