Почему не обновляются настройки в сохраненных вариантах СКД и как исправить ошибки вывода полей?

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

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

Почему новые поля не появляются в сохраненных вариантах настроек?

Многие из нас ошибочно полагают, что пользовательский вариант отчета — это «наслоение» поверх основной схемы. На самом деле, когда пользователь или администратор сохраняет вариант, система фиксирует текущее состояние КомпоновщикаНастроек как самостоятельный объект. В этот объект записываются все выбранные поля, группировки и отборы, которые существовали в момент нажатия кнопки «Сохранить».

Когда вы вносите изменения в основную схему СКД (например, добавляете новое поле), система не делает автоматический «merge» этих изменений в существующие сохраненные варианты. Это сделано для того, чтобы пользователь не столкнулся с неожиданными изменениями в привычном ему интерфейсе отчета. Чтобы исправить эту ситуацию, у нас есть несколько путей:

  1. Программное обновление: Вы можете написать обработку, которая при открытии отчета или в регламентном задании будет программно загружать ПользовательскиеНастройки, добавлять в них недостающие поля из основной схемы и сохранять их обратно в ВариантОтчета.
  2. Централизованный сброс: Если пользователей много, можно реализовать логику удаления старых настроек или принудительного обновления структуры через МенеджерВариантовОтчетов (если используется БСП).
  3. Ручная перенастройка: В простых случаях с небольшим количеством вариантов, допустимо попросить пользователей или администраторов пересохранить настройки заново.

Разбираемся с неверным выводом вычисляемых полей

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

Рассмотрим пошагово, как диагностировать и устранить эту ошибку:

  1. Проверка ресурсов: Первым делом перейдите на вкладку Ресурсы в настройках СКД. Если ваше поле СреднемесячныйОборот попало в этот список, СКД будет автоматически суммировать его при любой группировке. Удалите его из списка ресурсов, если вы хотите выводить значение «как есть».
  2. Роли полей: Проверьте вкладку Наборы данных. Если для поля установлена роль, которая провоцирует группировку, система будет пытаться вычислить агрегат. Попробуйте убрать лишние роли, оставив поле обычным атрибутом данных.
  3. Агрегация в выбранных полях: Откройте вкладку Настройки -> Выбранные поля. Проверьте, не стоит ли там по умолчанию функция Сумма(). Бывает так, что при добавлении поля система автоматически «навешивает» на него агрегатную функцию. Удалите её, оставив просто имя поля.
  4. Связи наборов данных: Если запрос сложный и состоит из нескольких наборов данных, убедитесь, что связи не приводят к «декартовому произведению» строк. Если при связывании одна строка договора «размножается» в несколько, то и результат вычисления оборота будет умножаться на количество этих строк.

Технический совет по отладке

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

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

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


// Пример отключения авто-агрегации через настройки компоновщика (фрагмент логики)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ВыбранныеПоля = Настройки.Выбор.Элементы;
Для Каждого Элемент Из ВыбранныеПоля Цикл
    Если Элемент.Поле = Новый ПолеКомпоновкиДанных("СреднемесячныйОборот") Тогда
        Элемент.Использование = Истина;
        // Убедитесь, что агрегатная функция не задана
    КонецЕсли;
КонецЦикла;

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

← На главную