Почему новая колонка не отображается в отчете СКД при запуске из 1С:Предприятия?

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

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

1. Детальная проверка и очистка настроек отчета

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

Очистка пользовательских настроек через интерфейс 1С:Предприятия:

  1. Откройте отчет в режиме 1С:Предприятия.
  2. Найдите меню "Еще" (или "Все действия" в старых интерфейсах) и выберите пункт "Установить стандартные настройки" или "Сбросить настройки". Это действие заставит систему проигнорировать сохраненные пользовательские варианты и применить настройки по умолчанию, заложенные в конфигураторе.
  3. Если это не помогло, попробуйте удалить все сохраненные варианты отчета. В меню "Еще" (или "Все действия") обычно есть пункт "Изменить вариант отчета" или "Варианты отчета". Удалите все пользовательские варианты, относящиеся к данному отчету.

Программная очистка хранилища настроек:

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


// Пример кода для очистки настроек конкретного отчета
// Замените "ВашОтчет" на фактическое имя объекта отчета (например, "Отчет.ВзаиморасчетыСКонтрагентами")
ИмяОбъектаОтчета = "ВашОтчет"; 

// Создаем запрос для поиска настроек, связанных с отчетом
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    СохраненныеНастройки.Ссылка
    |ИЗ
    |    РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
    |ГДЕ
    |    СохраненныеНастройки.ИмяОбъекта = &ИмяОбъектаОтчета
    |    ИЛИ СохраненныеНастройки.ИмяОбъекта ПОДОБНО &ИмяОбъектаОтчетаДляВариантов";

Запрос.УстановитьПараметр("ИмяОбъектаОтчета", ИмяОбъектаОтчета);
// Добавляем параметр для поиска вариантов, которые часто именуются как "ИмяОтчета.ИмяВарианта"
Запрос.УстановитьПараметр("ИмяОбъектаОтчетаДляВариантов", ИмяОбъектаОтчета + ".%"); 

// Выполняем запрос и обходим найденные записи
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Попытка
        // Создаем менеджер записи для удаления
        МенеджерЗаписи = РегистрыСведений.СохраненныеНастройки.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.Ссылка = Выборка.Ссылка;
        МенеджерЗаписи.Прочитать(); // Считываем запись
        МенеджерЗаписи.Удалить();   // Удаляем запись
        Сообщить("Удалена запись настроек: " + Выборка.Ссылка);
    Исключение
        Сообщить("Не удалось удалить запись настроек " + Выборка.Ссылка + ": " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

Сообщить("Очистка настроек отчета " + ИмяОбъектаОтчета + " завершена.");

Переименование отчета:

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

2. Программное формирование или изменение отчета

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

Обработчик ПриКомпоновкеРезультата:

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


// Пример обработчика ПриКомпоновкеРезультата, который может скрывать колонку
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Если СтандартнаяОбработка установлена в Ложь,
    // это означает, что отчет формируется полностью программно,
    // и настройки из конфигуратора будут проигнорированы.
    // Если вы видите эту строку, внимательно изучите весь код ниже.
    // СтандартнаяОбработка = Ложь; 

    // Получаем текущие настройки компоновки данных
    // Это может быть сделано из КомпоновщикаНастроек (если отчет не полностью программный)
    // или программно созданы новые настройки.
    // Например:
    // НастройкиКомпоновки = КомпоновщикМакета.Настройки; 
    // или:
    // НастройкиКомпоновки = Новый СхемаКомпоновкиДанных().НастройкиПоУмолчанию;

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

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

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

Программное создание макета:

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

Внешние отчеты и БСП:

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

3. Проверка условного оформления

Механизм условного оформления (УО) в СКД — это мощный инструмент, который позволяет гибко управлять внешним видом отчета, включая видимость отдельных элементов. Наша новая колонка могла быть случайно скрыта правилом условного оформления.

  1. Откройте схему СКД отчета в конфигураторе.
  2. Перейдите на закладку "Условное оформление".
  3. Внимательно просмотрите все правила. Возможно, для нашей колонки или для всего отчета есть правило, которое устанавливает свойство "Видимость" в "Ложь" при определенных условиях или всегда. Обратите внимание на поля, на которые распространяется правило, и на само условие.
  4. Условное оформление также может устанавливаться программно. Если мы обнаружили, что отчет формируется программно (см. раздел выше, ПриКомпоновкеРезультата), проверьте код на предмет добавления элементов условного оформления, которые могут скрывать нашу колонку.

4. Другие возможные причины

Если вышеперечисленные шаги не помогли, рассмотрим менее очевидные, но не менее важные причины, которые могут привести к невидимости колонки.

  1. Функциональные опции (ФО): На форуме было предложение проверить функциональные опции. Если наша колонка связана с данными, доступность которых управляется функциональной опцией (например, отображение дополнительных реквизитов, специфичного учета), убедитесь, что эта опция включена в настройках программы. Если она выключена, соответствующие данные (и, как следствие, колонка) могут не отображаться в отчете.
  2. Права доступа: Убедитесь, что у пользователя, под которым запускается отчет, есть необходимые права доступа к данным, которые отображаются в новой колонке. Если колонка берет данные из объекта (например, реквизита справочника или документа), на который у пользователя нет прав на чтение, СКД может не отображать это поле или оно будет пустым. Проверьте роли пользователя и соответствующие права на чтение полей и объектов метаданных.
  3. Вычисляемые поля: Если добавленная колонка является вычисляемым полем в СКД, проверьте корректность выражения, по которому она вычисляется. Ошибки в выражении могут привести к тому, что поле не будет вычисляться и отображаться. Также важно помнить, что в выражениях вычисляемых полей в СКД нельзя напрямую использовать другие вычисляемые поля, определенные в той же схеме; они должны ссылаться на поля, которые являются частью набора данных.
  4. Роли полей: В наборах данных СКД для полей существуют роли, например, "Поле", "Период", "Измерение", "Ресурс". Если полю назначена специфическая роль, это может влиять на его доступность и отображение в отчете. Например, если полю случайно присвоена роль, которая не подразумевает его прямое отображение (например, скрытое поле для фильтрации), оно может не выводиться.
  5. Связи наборов данных: Если в отчете используется несколько наборов данных, необходимо проверить корректность установленных между ними связей. Неправильно настроенная связь может приводить к тому, что данные для новой колонки не выбираются из связанного набора данных, и в результате колонка остается пустой и может не выводиться.

Заключение:

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

← На главную