Почему не отображается заголовок параметра СКД с типом "Стандартный период" в отчетах 1С на управляемых формах?

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

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

Выясняем причины отсутствия заголовка

Основная причина такого поведения кроется не в ошибках платформы или кэша, а в заложенной логике БСП. В типовых конфигурациях (таких как 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей, 1С:Зарплата и Управление Персоналом) используется специфический механизм. Если в отчете присутствует только один параметр с типом "Стандартный период", система БСП автоматически считает его основным периодом отчета. С точки зрения UX-дизайна 1С, подписывать единственное поле с датами словом "Период" считается избыточным, поскольку контекст для пользователя и так очевиден. В результате, заголовок принудительно скрывается программным кодом для экономии места на форме.

Нюансы идентификатора параметра. Механизмы БСП часто привязываются к идентификатору (имени) параметра в схеме компоновки данных. Если параметр имеет имя Период (предопределенное имя), система применяет к нему особые правила отрисовки: она может выносить его в отдельную кнопку в командной панели или отображать в быстрых настройках без заголовка. Если изменить Имя (не только заголовок) параметра в СКД на любое другое (например, ПериодОтчета), стандартная логика БСП может перестать считать его "тем самым главным периодом". В этом случае заголовок может появиться, но при этом мы можем потерять часть стандартной функциональности, например, удобный выбор периода через кнопку на командной панели формы.

Первоначальные шаги и диагностика проблемы

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

  1. Проверяем заголовок на вкладке "Параметры" СКД. Убедимся, что заголовок указан именно здесь. Это базовое требование для отображения. В сообщениях на форуме пользователи часто указывали заголовок во многих местах, но ключевым является вкладка "Параметры" самой схемы компоновки данных. Некоторые рекомендуют убрать заголовки везде, кроме этой вкладки, чтобы исключить конфликты.
  2. Чистим кэш 1С. Проблема с кэшированием – одна из самых частых причин необъяснимого поведения в 1С. Мы можем попробовать удалить кэш пользователя (в меню "Сервис и настройки" -> "Параметры" -> "Настройки пользователя" -> "Очистить кэш" или вручную удалить папки кэша 1С) и кэш конфигурации.
  3. Переименовываем параметр СКД. Если параметр называется Период, попробуем изменить его Имя (а не только Заголовок) в СКД на что-то уникальное, например, ПериодОтчета или ПериодБ. Иногда это помогает обойти специфическую логику БСП, которая обрабатывает предопределенные имена.
  4. Анализируем форму отчета. Важно понять, какую форму использует наш отчет. Если конфигурация базируется на БСП, то отчет часто берет общую форму, которая уже содержит свои настройки по умолчанию, в том числе правила отображения заголовков. Это часто бывает причиной, когда, казалось бы, все настройки верны, но заголовок все равно не выводится. Как отмечали пользователи, проблема может быть "с формой отчета", когда она берет общую форму, где уже "была настройка с заголовком".
  5. Проверяем отображение у других пользователей/на других базах. Если у вас параметр отображается корректно на другой машине или у другого пользователя, это однозначно указывает на проблему локального кэша или индивидуальных настроек.

Решение 1: Детальная модификация логики БСП через расширение (Решение из Сообщения 22)

Если простые методы не помогли, наиболее надежный способ решить проблему с отображением заголовков стандартных периодов на БСПшных формах отчетов – это модификация процедуры ВывестиПериодыНастроек общего модуля ОтчетыСервер. Эта процедура в БСП отвечает за программное формирование и вывод элементов управления для периодов на форме отчета, и именно здесь может быть заложена логика скрытия заголовков. Мы будем использовать механизм расширений, чтобы безопасно изменить поведение типовой конфигурации.

  1. Создаем расширение конфигурации. Открываем конфигуратор, переходим в "Конфигурация" -> "Расширения конфигурации" -> "Добавить расширение".
  2. Заимствуем общий модуль. В расширении находим общий модуль ОтчетыСервер, правой кнопкой мыши выбираем "Добавить в расширение".
  3. Модифицируем процедуру. В заимствованном модуле находим процедуру ВывестиПериодыНастроек. Нам нужно будет скопировать её целиком и изменить, добавив специальный код для принудительного вывода заголовка.

Рассмотрим подробнее код, предложенный одним из пользователей (Сообщение 22):


&ИзменениеИКонтроль("ВывестиПериодыНастроек")
Процедура Лот_ВывестиПериодыНастроек(Форма, ЭлементыНастроек, ИменаРеквизитов)

    НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ЭтоПериод, СвойствоНастройки", Истина, "Значение"));
    Если НайденныеЭлементы.Количество = 0 Тогда
        Возврат;
    КонецЕсли;

    Элементы = Форма.Элементы;
    ИменаРеквизитовПредопределенных = ИменаРеквизитов.Предопределенных.Период;
    ВариантПредставления = Форма.НастройкиОтчета.ВариантПредставленияПериода;
    ЭтоСтандартноеПредставление = (ВариантПредставления = Перечисления.ВариантыПредставленияПериода.Стандартный);

    Для Каждого Элемент Из НайденныеЭлементы Цикл
        СвязанныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ИндексНастройки", Элемент.ИндексНастройки));
        Для Каждого СвязанныйЭлемент Из СвязанныеЭлементы Цикл
            СвязанныйЭлемент.Поле.Видимость = (СвязанныйЭлемент.СвойствоНастройки = "Использование");
        КонецЦикла;

        Период = ИнициализироватьПериод(Форма, Элемент.ИндексНастройки);
        Поле = Элемент.Поле;
        Родитель = Поле.Родитель; // ГруппаФормы

        СледующийЭлемент = Неопределено;
        ИндексЭлемента = Родитель.ПодчиненныеЭлементы.Индекс(Поле);
        Если Родитель.ПодчиненныеЭлементы.Количество > ИндексЭлемента + 1 Тогда
            СледующийЭлемент = Родитель.ПодчиненныеЭлементы.Получить(ИндексЭлемента + 1);
        КонецЕсли;

        ИмяРеквизита = Форма.ПутьКДаннымЭлементов.ПоИндексу[Элемент.ИндексНастройки];
        Если ИменаРеквизитовПредопределенных.Найти(ИмяРеквизита) <> Неопределено Тогда
            НайденныйЭлемент = Элементы.Найти(ИмяРеквизита);
            Элементы.Переместить(НайденныйЭлемент, Родитель, СледующийЭлемент);
            НайденныйЭлемент.Видимость = Истина;

            Для Каждого ЭлементПериода Из НайденныйЭлемент.ПодчиненныеЭлементы Цикл
                ТипЭлементаПериода = ТипЗнч(ЭлементПериода);
                Если ТипЭлементаПериода = Тип("ПолеФормы") Тогда
                    ЭлементПериода.Заголовок = ЗаголовокЭлементаПериода(ЭлементПериода.Имя, Поле.Заголовок);
                    ЭлементПериода.Подсказка = ЭлементПериода.Заголовок;
                    ЭлементПериода.ПодсказкаВвода = ЭлементПериода.Заголовок;
                    // #Вставка - Здесь начинается модификация
                    Если НЕ СтрНайти(ЭлементПериода.Имя, "ДатаНачала") = 0 Тогда
                        ЭлементПериода.Заголовок = Поле.Заголовок;
                        ЭлементПериода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
                    КонецЕсли;
                    // #КонецВставки - Здесь заканчивается модификация
                КонецЕсли;

                Если ЭтоСтандартноеПредставление Тогда
                    ЭлементПериода.Видимость = ТипЭлементаПериода <> Тип("КнопкаФормы") Или (ТипЭлементаПериода = Тип("КнопкаФормы") И СтрНачинаетсяС(ЭлементПериода.ИмяКоманды, "ВыбратьПериод"));
                Иначе
                    ЭлементПериода.Видимость = (ТипЭлементаПериода = Тип("КнопкаФормы") Или ТипЭлементаПериода = Тип("ГруппаФормы"));
                КонецЕсли;
                УстановитьСвойстваКнопкиВыбораПериода(ЭлементПериода, Период, ЭтоСтандартноеПредставление);
            КонецЦикла;
            Продолжить;
        КонецЕсли;

        ШаблонИмениЭлемента = СтрЗаменить(Поле.Имя, "Значение", "%1%2");
        Группа = ГруппаЭлементовПериода(Элементы, Родитель, СледующийЭлемент, ШаблонИмениЭлемента, Поле.Заголовок);
        ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмениЭлемента, ЭтоСтандартноеПредставление, -1);
        ДобавитьПолеПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаНачала", Поле.Заголовок, ЭтоСтандартноеПредставление);
        ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениЭлемента, "Разделитель");
        Разделитель = Элементы.Найти(ИмяЭлемента);
        Если Разделитель = Неопределено Тогда
            Разделитель = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), Группа);
        КонецЕсли;
        Разделитель.Вид = ВидДекорацииФормы.Надпись;
        Разделитель.Заголовок = Символ(8211); // Среднее тире (en dash).
        Разделитель.Видимость = ЭтоСтандартноеПредставление;
        ДобавитьПолеПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаОкончания", Поле.Заголовок, ЭтоСтандартноеПредставление);
        ДобавитьКомандуВыбораПериода(Форма, Группа, ШаблонИмениЭлемента, Период, ЭтоСтандартноеПредставление);
        ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмениЭлемента, ЭтоСтандартноеПредставление);
    КонецЦикла;

КонецПроцедуры

Объяснение: Ключевая часть этого кода находится внутри цикла, где обрабатывается каждый элемент периода. Строки с #Вставка и #КонецВставки принудительно устанавливают заголовок элементам формы, чье имя содержит "ДатаНачала", используя заголовок родительского поля, и устанавливают положение заголовка в ПоложениеЗаголовкаЭлементаФормы.Авто. Это обходит стандартную логику БСП, которая могла бы его скрыть.

Решение 2: Упрощенная модификация логики БСП через расширение (Решение из Сообщения 28)

Альтернативный, более лаконичный способ модификации того же общего модуля ОтчетыСервер предлагает Сообщение 28. Он нацелен на устранение конкретного условия, которое, предположительно, скрывает заголовок, если в отчете только один параметр типа "Стандартный период". В БСП часто используется условие НайденныеЭлементы.Количество >= 2, которое означает, что заголовки отображаются только если параметров периода несколько. Мы просто удаляем это условие.

  1. Создаем или используем существующее расширение. Как и в предыдущем решении, нам потребуется расширение.
  2. Заимствуем общий модуль ОтчетыСервер.
  3. Модифицируем процедуру ВывестиПериодыНастроек. Ищем строки, отвечающие за определение переменной ВыводитьЗаголовкиПериодов, и корректируем их.

Пример кода для расширения:


&ИзменениеИКонтроль("ВывестиПериодыНастроек")
Процедура Расш1_ВывестиПериодыНастроек(Форма, ЭлементыНастроек, ИменаРеквизитов)

    НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ЭтоПериод, СвойствоНастройки", Истина, "Значение"));
    Если НайденныеЭлементы.Количество = 0 Тогда
        Возврат;
    КонецЕсли;

    Элементы = Форма.Элементы;
    ИменаРеквизитовПредопределенных = ИменаРеквизитов.Предопределенных.Период;
    ВариантПредставления = Форма.НастройкиОтчета.ВариантПредставленияПериода;
    ЭтоСтандартноеПредставление = (ВариантПредставления = Перечисления.ВариантыПредставленияПериода.Стандартный);

    // #Удаление - удаляем оригинальную строку
    // ВыводитьЗаголовкиПериодов = ВыводитьЗаголовкиНастроек(Форма) И НайденныеЭлементы.Количество >= 2;
    // #КонецУдаления

    // #Вставка - заменяем на новую логику
    ВыводитьЗаголовкиПериодов = ВыводитьЗаголовкиНастроек(Форма); // Удаляем условие "И НайденныеЭлементы.Количество >= 2"
    // #КонецВставки

    // ... Остальной код процедуры остается без изменений
    // (здесь мы опускаем его для краткости, в расширении он будет полным)

    Для Каждого Элемент Из НайденныеЭлементы Цикл
        // ... (Остальной код процедуры)
    КонецЦикла;

КонецПроцедуры

Объяснение: Мы удаляем часть условия И НайденныеЭлементы.Количество >= 2 из строки, которая определяет, нужно ли выводить заголовки. Таким образом, заголовки будут выводиться всегда, если функция ВыводитьЗаголовкиНастроек(Форма) возвращает Истина, независимо от количества параметров периода. Это значительно проще, но требует понимания, что именно эта строка влияет на видимость заголовка.

Решение 3: Обходной путь "фиктивного периода" (без кода)

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

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

Решение 4: Код для внешних отчетов (без расширения БСП)

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

  1. Определяем настройки формы. В модуле объекта нашего внешнего отчета нам необходимо указать, что мы будем определять настройки формы.
  2. ПараметрыРегистрации.ОпределитьНастройкиФормы = Истина;
  3. Обрабатываем процедуру ОпределитьНастройкиФормы. Эта процедура вызывается перед открытием формы отчета и позволяет нам влиять на её поведение.
  4. 
    Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
        Настройки.События.Вставить("ПослеЗаполненияПанелиБыстрыхНастроек", Истина);
    КонецПроцедуры
    

    Объяснение: Здесь мы подписываемся на событие ПослеЗаполненияПанелиБыстрыхНастроек, которое происходит после того, как БСП уже сформировала панель быстрых настроек. Это позволяет нам вмешаться в процесс отрисовки.

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

    Объяснение: В этом коде мы перебираем все элементы формы. Если имя элемента содержит строку "ДатаНачала" (что характерно для полей, относящихся к началу периода), мы принудительно устанавливаем его заголовок, удаляя лишний текст "(дата начала)", если он есть, и устанавливаем ПоложениеЗаголовка в Авто. Это позволяет добиться корректного отображения.

Дополнительные рекомендации и нюансы

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

  1. Особенности работы с Пользовательскими настройками. Важно различать "Быстрые настройки" (которые выводятся прямо на форму) и форму "Все настройки" (полный список настроек). Часто заголовок пропадает именно в панели быстрых настроек. В некоторых версиях БСП может помочь изменение режима редактирования параметра в настройках СКД: если переключить свойство "Включать в доступные поля" или изменить режим отображения с "Быстрый доступ" на "Обычный", поведение отрисовки может измениться, так как параметр перестанет попадать в коллекцию элементов, обрабатываемых процедурой ВывестиПериодыНастроек.
  2. Влияние переопределяемых модулей. В конфигурациях на БСП часто существуют переопределяемые модули (например, ОтчетыКлиентСерверПереопределяемый), где разработчики конкретной конфигурации могут задавать глобальные настройки для всех отчетов. Если проблема носит массовый характер и затрагивает много отчетов, иногда целесообразнее внести изменение в общую функцию ВыводитьЗаголовкиНастроек (упомянутую в коде Сообщения 28), чтобы включить отображение заголовков глобально для всей системы, а не править каждый отчет по отдельности или использовать расширения для каждого модуля. Однако это требует изменения самой конфигурации, что не всегда желательно.

Мы видим, что проблема с невидимым заголовком параметра "Стандартный период" в отчетах 1С на БСП имеет несколько слоев и решений. Начиная с простых проверок и заканчивая глубокой модификацией системных процедур через расширения, у нас есть арсенал средств для восстановления желаемого поведения. Выбор конкретного метода зависит от специфики отчета (внешний или встроенный), требований к стабильности конфигурации и уровня вашей готовности к программным изменениям. Главное – понять, что за этим поведением стоит целенаправленная логика БСП, которую можно обойти или изменить.

← На главную