[ Разбор вопросов ] Роли полей в СКД и программная работа с полями расшифровки

Из данной подборки вы узнаете, как СКД рассчитывает итоги для набора данных “Объект” и как программно работать с полями расшифровки при необходимости. Информация будет полезна и для начинающих разработчиков 1С, и для специалистов с опытом.
 

Вопрос №1: Что означает роль “Измерение” для поля набора данных в СКД?

В конструкторе СКД для некоторых полей компоновки задается свойство “Роль”. Если с ролью “Период” после просмотра уроков стало все понятно, то роль “Измерение” по-прежнему для меня – белое пятно. Понятно, что если ее не назначить для поля или не связать поле с другим полем, у которого роль “Измерение”, то возникают ошибки при расчете итогов. Но непонятно, почему так происходит, какая логика расчетов. Статья на ИТС Расчет итогов по полям остатка в системе компоновки данных особой ясности не внесла. Если вы сможете более ясно описать логику расчетов, буду очень благодарен.

Ответ

Роль “Измерение” тоже используется для расчета остатков при помощи механизмов СКД. Чтобы разобраться, нужно вспомнить 2 тезиса:

  1. СКД не допускает использования предложения ИТОГИ в тексте запросов наборов данных, потому что СКД считает итоги самостоятельно.
  2. В схеме компоновки могут присутствовать не только наборы данных – запросы, для которых по тексту запроса можно определить связь с объектами метаданных. Например, в запросе используется регистр накопления “ТоварыНаСкладах”, значит, поле “Номенклатура” – это измерение.

В схеме компоновки могут быть наборы данных – объекты, в которых есть только список полей, но нет никакой связи с объектами метаданных. Для наборов данных – объектов СКД тоже должна иметь возможность рассчитать итоги. Поэтому системе нужно “подсказать”, как считать итоги. Для этого и предназначены указанные роли. Поэтому среди полей набора данных выделяются 3 класса:

  • Ресурсы (итоговые поля, например, “КоличествоНачальныйОстаток”, “КоличествоПриход”, “КоличествоРасход”, “КоличествоКонечныйОстаток”)
  • Измерения (в разрезе чего нам нужно подсчитать итоги, например, “Номенклатура”, “Склад”)
  • Периоды (как изменялись значения во времени, например, “Регистратор”, “ПериодСекунда”)

Таким образом, кратко алгоритм по указанной Вами ссылке можно сформулировать так – СКД подсчитывает итоги для ресурсов, группируя данные в разрезе измерений, используя упорядочивание данных по полям-периодам.

Уточняющий вопрос

А что происходит, когда мы “просим” СКД рассчитать итог по полю без роли?

Ответ

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

 

Вопрос №2: Как программно получить список полей расшифровки?

Когда мы кликаем по полю ресурса в отчете, нам предлагается выбрать поле расшифровки. Есть какой-то простой способ получить список этих полей? Пока на ум приходит только это – пойти в настройки, для которых сформирован отчет, и посмотреть в структуре нижестоящие поля группировки.

 

Выбор поля

Ответ

Для этого предназначен метод ПолучитьПоля(). Примерный код выглядит следующим образом:

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
   
    СтандартнаяОбработка = Ложь;
   
    ДанныеРасшифровкиКомпоновки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    ПоляРасшифровки = ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля();
   
КонецПроцедуры

Также в одном из практических заданий курса рассматривается, как рекурсивно определять родительские элементы расшифровки, получать из них значения полей расшифровки.

Уточняющий вопрос

Видимо, я не совсем корректно задал вопрос. Когда мы кликаем по полю ресурса или в выпадающем списке выбираем пункт “Расшифровать”, нам предлагаются поля нижестоящих группировок. Именно про них был мой вопрос.

 

Пункт "Расшифровать"

Ответ

Можно таким образом поступить – при помощи кода из решения практического задания получаем список вышележащих группировок. Затем из схемы компоновок получаем перечень всех полей. Удаляем из этого списка поля вышележащих группировок, получится как раз список из интересующих Вас полей.

Либо альтернатива – анализировать структуру отчета из настроек компоновки, как Вы предлагаете.

Уточняющий вопрос

Еще вопрос про родительские элементы расшифровки. Метод “ПолучитьРодителей()” объекта “ЭлементРасшифровкиКомпоновкиДанныхПоля ” возвращает массив. Получается, что у элемента расшифровки может быть несколько родителей. В каком случае такое может быть?

Ответ

Когда в настройках компоновки используется кросс-таблица. Тогда получится 2 родителя: один из группировки строк, другой – из группировки колонок, на пересечении которых находится расшифровываемое значение.

Это примеры разобранных вопросов из Мастер-группы курса
Профессиональная разработка отчетов в 1С 8.3 на СКД.

Описание курса и примеры видео

Комментарии / обсуждение (21):

  1. Вячеслав

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

    • Василий Ханевич

      Добрый день!
      Если для виртуальной таблицы Обороты указать периодичность Авто, то можно в запросе выбирать несколько полей-периодов:

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

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

        • Василий Ханевич

          Можно использовать объединение наборов данных: в первом получать данные за текущий месяц, во втором – за предыдущий и т.д.
          В курсе по СКД такой прием рассматриваем.

          • Вячеслав

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

            • Василий Ханевич

              То, что записали на курс по СКД – отлично! Это поможет систематизировать знания.
              Прикрепил пример отчета Сравнение продаж за 2 периода. Выводим номенклатуру, а также сумму продаж за 2 периода, разницу между этими суммами. Посмотрите, пожалуйста, должно быть очень похоже на Вашу задачу.

              • Вячеслав

                Спасибо огромное. К сожалению отчет напрямую не подошел, у вас видимо какая то учебная база. Я чуточку приблизился к решению. Я вдвух отчетах почему то не разводил имена количество и выручка. У меня было пости как у вас, только и менами проблема. Всё сделал по образу и подобию. И… опять пот же цирк, никаких изменений. Я больше 20 лет программирую на 1С. С СКД делал много простеньких отчетов. Всегда казалось что он какой то мутный и очередной раз подтверждается. Да мощьный, красивый, но мутный…

                • Василий Ханевич

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

                  • Вячеслав

                    Воспользовался отладочной консолью, убедился что СКД создал параметры П и П2. Присвоил им значения первого периода и оба запроса формирует по эти параметрам. Остаёся понять “самую малость” как на это безобразие влиять…

                    • Василий Ханевич

                      Отлично, что получилось диагностировать проблему!
                      Вы столкнулись с особенностью автозаполнения. Для решения проблемы можно использовать в тексте запроса из набора данных конструкции в фигурных скобках. В статье 17 вопросов и ответов по СКД, проектированию форм, навигации, панелям и т.п. есть вопрос 5 по СКД, он может помочь Вам.

                    • Вячеслав

                      Спасибо. Разобрался. Правда 17 вопросов и ответов по СКД вопрос 5 по СКД – вопрос оказался не в тему. А вот фраза особенности автозаполнеия, очень помогла. Помотрел как люди это делают, отключил автозаполнение, настоил поля, и всё получилось.

                    • Василий Ханевич

                      Отлично, что разобрались!
                      Про 5-й вопрос не согласен – он именно про автозаполнение, про подобную ситуацию с получением данных за 2 периода.

                    • Вячеслав

                      Вопрос 5
                      В процессе выполнения кода создается текстовый файл. По окончании формирования файла используется метод ПоказатьОповещениеПользователя().
                      Можно ли в этом методе создать гиперссылку, при переходе по которой будет открываться созданный файл? И где тут про автозаполнение?

                    • Василий Ханевич

                      Вы смотрите вопросы по интерфейсам.
                      Спуститесь ниже в раздел по СКД, найдите 5-й вопрос по СКД, а не по интерфейсам и формам

                    • Вячеслав

                      И всё таки в итоге ничего не работает. За это время руками без скд написал бы 10 отчетов… Жаль только время потерял…

  2. SinO

    Добрый день! А Как получить корректные остатки и обороты при этом исключив из оборотов документ перемещение товаров?

    • Василий Ханевич

      Добрый день!
      Рекомендую посмотреть в УТ 11, как сделан отчет ВедомостьПоПартиямТоваров. В схеме компоновки реализован параметр ИсключаемыеХозОперации, по его значениям фильтруются записи регистра накопления СебестоимостьТоваров.

      • SinO

        Добрый день! Спасибо за ответ! Я примерно так и сделал, я в запросе объединил две таблицы “ТоварыНаСкладахОстаткиИОбороты” из нее берется начальный и конечный остаток, “ТоварыНаСкладахОбороты” из нее берется приход и расход и в этой же таблице установлено условие по регистратору “НЕ ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров”, в обеих таблицах период установлен авто, а так же выбираются поля периоды “Регистратор,ПериодСекунда,ПериодМесяц”,данные выводятся так, в строках номенклатура, в колонках ПериодМесяц. Если я формирую отчет за один месяц , то все формируется корректно (Начальный и Конечный Остаток), а если выбираю период квартал, то выводятся не корректные данные по начальному и конечному остатку: к примеру выбираем в период 3 квартал, в июле корректные остатки, в августе неверные Начальный и Конечный остаток, в сентябре тоже все корректно. Подскажите пожалуйста, что я делаю не так?

        • Василий Ханевич

          Добрый день!
          Для проверки попробуйте сделать отчет только по виртуальной таблице ТоварыНаСкладахОстаткиИОбороты сначала без ограничений по типу регистратора. Сделайте требуемую структуру отчета, проверьте, что все остатки выводятся корректно.
          Потом добавьте отбор по типу регистратора, проверьте остатки после этого.
          По идее достаточно только одной виртуальной таблицы ТоварыНаСкладахОстаткиИОбороты для получения всех нужных данных, возможно, получится упростить, обойтись без объединения.
          Также посмотрите сами исходные данные – детальные записи. Возможно исключение перемещений из оборотов дает некорректные данные, из-за которых СКД не может правильно посчитать итоги. Например, ордерная схема или какие-то доработанные движения, которые искажают остатки.

          • SinO

            Добрый день! Спасибо за ответ! “Простым” способом не получается решить вопрос(использовать только одну таблицу ТоварыНаСкладахОстаткиИОбороты с условием на регистратор). Сделал по другому, использовал набор данных объединение двух таблиц ТоварыНаСкладахОстаткиИОбороты и ТоварыНаСкладахОбороты, в каждой из этих таблиц получил остаток на каждый день (в вашем курсе по запросам есть пример) и условие на регистратор сделал в таблице “Оборотов” и все заработало! Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.