Как настроить положение пользовательского поля в СКД, рассчитать по нему итоги и исправить ошибку useQueryGroupIfPossible?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с Системой компоновки данных (СКД) в 1С:Предприятии — это мощный инструмент для создания гибких отчетов. Однако при проектировании сложных схем разработчики часто сталкиваются с неочевидным поведением системы. В этой статье мы подробно разберем три взаимосвязанные проблемы, которые часто вызывают затруднения:

  1. Почему созданное пользовательское поле «перескакивает» в начало отчета и нарушает заданный порядок колонок.
  2. Почему пользовательского поля нет на вкладке «Ресурсы» и как правильно рассчитать по нему итоги в группировках.
  3. Как исправить критическую ошибку загрузки документа XDTO, связанную со свойством useQueryGroupIfPossible, при переносе отчета между разными версиями платформы.

Давайте шаг за шагом проанализируем каждую ситуацию и найдем оптимальные технические решения.


Часть 1. Почему пользовательское поле «перескакивает» вперед и как им управлять

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

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

Чтобы жестко зафиксировать положение нашего поля в таблице, выполним следующие шаги:

  1. Откроем схему компоновки данных в конфигураторе и перейдем на вкладку «Настройки».
  2. Выберем нужную группировку (или корневой элемент «Отчет») и откроем вкладку «Выбранные поля».
  3. Найдем в списке элемент «Автополе» и удалим его. Вместо автоматического вывода перетащим все необходимые поля из левого списка в правый вручную. Это позволит задать точный порядок их отображения слева направо.
  4. Перейдем на вкладку «Другие настройки» (для отчета или конкретной группировки).
  5. Найдем параметр «Расположение ресурсов». По умолчанию там установлено значение «Авто». Изменим его на «После полей» или «Не использовать». Это предотвратит принудительное группирование расчетных и пользовательских колонок в начале таблицы.

Часть 2. Настройка итогов: разница между пользовательскими и вычисляемыми полями

Довольно часто разработчики пытаются найти созданное пользовательское поле на вкладке «Ресурсы» в конфигураторе, чтобы посчитать по нему сумму или среднее значение, но не обнаруживают его там. Разберем подробнее, почему так происходит.

Пользовательские поля создаются на уровне настроек схемы компоновки (в режиме «1С:Предприятие» или на вкладке «Настройки» в конфигураторе). Они хранятся в XML-структуре настроек, а не в самой схеме данных. Соответственно, вкладка «Ресурсы», которая описывает саму схему данных, физически ничего не знает о существовании этих полей.

Существует два пути решения этой задачи в зависимости от того, где создается логика.

Способ А. Использование Вычисляемых полей (наиболее надежный метод)

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

Разберем этот процесс по шагам:

  1. В конфигураторе откроем схему компоновки данных и перейдем на вкладку «Вычисляемые поля».
  2. Добавим новую строку, укажем имя поля (например, ИтоговаяСумма) и пропишем выражение детальных записей:

Выбор 
    Когда Количество > 0 Тогда СуммаПродаж / Количество 
    Иначе 0 
Конец
  1. Теперь перейдем на вкладку «Ресурсы». Вычисляемое поле ИтоговаяСумма появилось в списке доступных полей!
  2. Перетащим его в список ресурсов и укажем нужное выражение для расчета итогов (например, сумму или среднее):

Сумма(ИтоговаяСумма)

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

Способ Б. Настройка расчета итогов внутри пользовательского поля

Если мы вынуждены использовать именно пользовательское поле (например, при редактировании отчета пользователем в режиме «1С:Предприятие»), то для расчета итогов нужно задействовать специальное свойство самого поля.

При создании пользовательского поля типа «Поле-выражение» система предлагает заполнить два независимых окна выражений:

Пример формулы для итоговых записей пользовательского поля:

Сумма(Сумма) / Сумма(Количество)

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


Часть 3. Ошибка совместимости XDTO useQueryGroupIfPossible

При переносе отчета с одной базы на другую или при обновлении платформы может возникнуть следующая неприятная ошибка:


Ошибка загрузки документа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: dataSet    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data-composition-system/schema}DataSet по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: item    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data-composition-system/schema}DataSet по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data-composition-system/schema}useQueryGroupIfPossible    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

Проанализируем ситуацию. Данная ошибка возникает из-за нарушения обратной совместимости платформ «1С:Предприятие». Начиная с версии платформы 8.3.14, разработчики добавили новое свойство набора данных СКД — Использовать группировки запроса если возможно (в XML-схеме оно записывается как useQueryGroupIfPossible). Этот механизм оптимизирует построение запросов к СУБД.

Если отчет был сохранен или изменен в конфигураторе версии 8.3.14 и выше (например, 8.3.15), платформа автоматически прописывает тег <useQueryGroupIfPossible> в XML-структуру схемы компоновки. При попытке запустить этот же отчет на более старых версиях платформы (например, 8.3.13, 8.3.10) парсер XDTO не находит описание этого свойства в старых библиотеках и аварийно завершает работу.

Рассмотрим по шагам два способа устранения этой проблемы.

Решение 1. Отключение свойства в конфигураторе новой платформы

Если у нас есть доступ к конфигуратору более новой версии платформы (на которой отчет открывается без ошибок):

  1. Откроем отчет в конфигураторе и зайдем в схему компоновки данных.
  2. Перейдем на вкладку «Наборы данных».
  3. Для каждого набора данных (запроса или объекта) найдем в свойствах флаг «Использовать группировки запроса если возможно» и снимем его.
  4. Сохраним отчет. Теперь тег не будет записываться в XML, и файл успешно откроется на старых версиях платформы.

Решение 2. Ручная очистка XML-кода схемы (для внешних отчетов)

Если отчет сохранен как внешний (файл с расширением .erf или .epf), а новой платформы под рукой нет, мы можем отредактировать XML напрямую:

  1. Откроем отчет в конфигураторе старой платформы (или в любой доступной версии).
  2. Зайдем в схему компоновки данных и выгрузим ее в XML-файл (нажав на кнопку сохранения схемы в файл на панели инструментов СКД).
  3. Откроем полученный XML-файл в любом текстовом редакторе (например, Notepad++).
  4. Используя поиск (сочетание клавиш Ctrl+F), найдем все строки, содержащие упоминание useQueryGroupIfPossible. Они будут выглядеть следующим образом:

<useQueryGroupIfPossible>true</useQueryGroupIfPossible>

  1. Полностью удалим эти строки из файла и сохраним изменения.
  2. Вернемся в конфигуратор, в схеме компоновки данных нажмем кнопку загрузки схемы из файла и выберем отредактированный XML-файл.
  3. Сохраним внешний отчет. Ошибка совместимости полностью устранена!

Используя предложенные методики, мы сможем эффективно управлять структурой отчетов в СКД, корректно рассчитывать агрегатные функции по любым видам полей и легко решать проблемы совместимости версий платформы «1С:Предприятие».

← На главную