Работа с Системой компоновки данных (СКД) в 1С:Предприятии — это мощный инструмент для создания гибких отчетов. Однако при проектировании сложных схем разработчики часто сталкиваются с неочевидным поведением системы. В этой статье мы подробно разберем три взаимосвязанные проблемы, которые часто вызывают затруднения:
useQueryGroupIfPossible, при переносе отчета между разными версиями платформы.Давайте шаг за шагом проанализируем каждую ситуацию и найдем оптимальные технические решения.
При выводе отчета разработчики часто замечают, что добавленные пользовательские поля выводятся не там, где планировалось, а автоматически смещаются в крайнее левое положение перед стандартными реквизитами. Это происходит из-за внутренней логики генератора макета СКД.
Выясним причину такого поведения. По умолчанию в настройках группировки (или всего отчета) в списке выбранных полей присутствует предопределенный элемент Автополе. Этот элемент заставляет систему компоновки самостоятельно определять оптимальный, с ее точки зрения, порядок колонок. Кроме того, на позиционирование сильно влияет параметр автоматического размещения ресурсов.
Чтобы жестко зафиксировать положение нашего поля в таблице, выполним следующие шаги:
Довольно часто разработчики пытаются найти созданное пользовательское поле на вкладке «Ресурсы» в конфигураторе, чтобы посчитать по нему сумму или среднее значение, но не обнаруживают его там. Разберем подробнее, почему так происходит.
Пользовательские поля создаются на уровне настроек схемы компоновки (в режиме «1С:Предприятие» или на вкладке «Настройки» в конфигураторе). Они хранятся в XML-структуре настроек, а не в самой схеме данных. Соответственно, вкладка «Ресурсы», которая описывает саму схему данных, физически ничего не знает о существовании этих полей.
Существует два пути решения этой задачи в зависимости от того, где создается логика.
Если мы разрабатываем отчет в конфигураторе, правильнее использовать механизм вычисляемых полей. Они создаются на уровне схемы данных и доступны для настройки ресурсов.
Разберем этот процесс по шагам:
ИтоговаяСумма) и пропишем выражение детальных записей:
Выбор
Когда Количество > 0 Тогда СуммаПродаж / Количество
Иначе 0
Конец
ИтоговаяСумма появилось в списке доступных полей!
Сумма(ИтоговаяСумма)
Этот способ гарантирует, что поле будет корректно рассчитываться во всех группировках, общих итогах и выводиться строго на своем месте.
Если мы вынуждены использовать именно пользовательское поле (например, при редактировании отчета пользователем в режиме «1С:Предприятие»), то для расчета итогов нужно задействовать специальное свойство самого поля.
При создании пользовательского поля типа «Поле-выражение» система предлагает заполнить два независимых окна выражений:
[Сумма] / [Количество]).Пример формулы для итоговых записей пользовательского поля:
Сумма(Сумма) / Сумма(Количество)
Если оставить поле итогового выражения пустым, система просто не будет выводить итоги по этой колонке на уровнях группировок.
При переносе отчета с одной базы на другую или при обновлении платформы может возникнуть следующая неприятная ошибка:
Ошибка загрузки документа.
по причине:
Ошибка преобразования данных 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 не находит описание этого свойства в старых библиотеках и аварийно завершает работу.
Рассмотрим по шагам два способа устранения этой проблемы.
Если у нас есть доступ к конфигуратору более новой версии платформы (на которой отчет открывается без ошибок):
Если отчет сохранен как внешний (файл с расширением .erf или .epf), а новой платформы под рукой нет, мы можем отредактировать XML напрямую:
useQueryGroupIfPossible. Они будут выглядеть следующим образом:
<useQueryGroupIfPossible>true</useQueryGroupIfPossible>
Используя предложенные методики, мы сможем эффективно управлять структурой отчетов в СКД, корректно рассчитывать агрегатные функции по любым видам полей и легко решать проблемы совместимости версий платформы «1С:Предприятие».