Мы сталкиваемся с достаточно распространённой ситуацией в 1С, когда заголовок параметра "Стандартный период" в отчете, построенном на Системе Компоновки Данных (СКД) и использующем Библиотеку Стандартных Подсистем (БСП), по умолчанию не отображается. Это может вызывать недоумение, ведь заголовок явно указан в настройках. Давайте разберем, почему так происходит, и какие шаги мы можем предпринять для решения этой проблемы, начиная от простых проверок и заканчивая глубокой модификацией логики БСП.
Основная причина такого поведения кроется не в ошибках платформы или кэша, а в заложенной логике БСП. В типовых конфигурациях (таких как 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей, 1С:Зарплата и Управление Персоналом) используется специфический механизм. Если в отчете присутствует только один параметр с типом "Стандартный период", система БСП автоматически считает его основным периодом отчета. С точки зрения UX-дизайна 1С, подписывать единственное поле с датами словом "Период" считается избыточным, поскольку контекст для пользователя и так очевиден. В результате, заголовок принудительно скрывается программным кодом для экономии места на форме.
Нюансы идентификатора параметра. Механизмы БСП часто привязываются к идентификатору (имени) параметра в схеме компоновки данных. Если параметр имеет имя Период (предопределенное имя), система применяет к нему особые правила отрисовки: она может выносить его в отдельную кнопку в командной панели или отображать в быстрых настройках без заголовка. Если изменить Имя (не только заголовок) параметра в СКД на любое другое (например, ПериодОтчета), стандартная логика БСП может перестать считать его "тем самым главным периодом". В этом случае заголовок может появиться, но при этом мы можем потерять часть стандартной функциональности, например, удобный выбор периода через кнопку на командной панели формы.
Прежде чем приступать к более сложным решениям, давайте пройдемся по базовым шагам диагностики и попробуем простые методы, которые часто помогают в подобных ситуациях.
Период, попробуем изменить его Имя (а не только Заголовок) в СКД на что-то уникальное, например, ПериодОтчета или ПериодБ. Иногда это помогает обойти специфическую логику БСП, которая обрабатывает предопределенные имена.Если простые методы не помогли, наиболее надежный способ решить проблему с отображением заголовков стандартных периодов на БСПшных формах отчетов – это модификация процедуры ВывестиПериодыНастроек общего модуля ОтчетыСервер. Эта процедура в БСП отвечает за программное формирование и вывод элементов управления для периодов на форме отчета, и именно здесь может быть заложена логика скрытия заголовков. Мы будем использовать механизм расширений, чтобы безопасно изменить поведение типовой конфигурации.
ОтчетыСервер, правой кнопкой мыши выбираем "Добавить в расширение".ВывестиПериодыНастроек. Нам нужно будет скопировать её целиком и изменить, добавив специальный код для принудительного вывода заголовка.Рассмотрим подробнее код, предложенный одним из пользователей (Сообщение 22):
&ИзменениеИКонтроль("ВывестиПериодыНастроек")
Процедура Лот_ВывестиПериодыНастроек(Форма, ЭлементыНастроек, ИменаРеквизитов)
НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ЭтоПериод, СвойствоНастройки", Истина, "Значение"));
Если НайденныеЭлементы.Количество = 0 Тогда
Возврат;
КонецЕсли;
Элементы = Форма.Элементы;
ИменаРеквизитовПредопределенных = ИменаРеквизитов.Предопределенных.Период;
ВариантПредставления = Форма.НастройкиОтчета.ВариантПредставленияПериода;
ЭтоСтандартноеПредставление = (ВариантПредставления = Перечисления.ВариантыПредставленияПериода.Стандартный);
Для Каждого Элемент Из НайденныеЭлементы Цикл
СвязанныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ИндексНастройки", Элемент.ИндексНастройки));
Для Каждого СвязанныйЭлемент Из СвязанныеЭлементы Цикл
СвязанныйЭлемент.Поле.Видимость = (СвязанныйЭлемент.СвойствоНастройки = "Использование");
КонецЦикла;
Период = ИнициализироватьПериод(Форма, Элемент.ИндексНастройки);
Поле = Элемент.Поле;
Родитель = Поле.Родитель; // ГруппаФормы
СледующийЭлемент = Неопределено;
ИндексЭлемента = Родитель.ПодчиненныеЭлементы.Индекс(Поле);
Если Родитель.ПодчиненныеЭлементы.Количество > ИндексЭлемента + 1 Тогда
СледующийЭлемент = Родитель.ПодчиненныеЭлементы.Получить(ИндексЭлемента + 1);
КонецЕсли;
ИмяРеквизита = Форма.ПутьКДаннымЭлементов.ПоИндексу[Элемент.ИндексНастройки];
Если ИменаРеквизитовПредопределенных.Найти(ИмяРеквизита) <> Неопределено Тогда
НайденныйЭлемент = Элементы.Найти(ИмяРеквизита);
Элементы.Переместить(НайденныйЭлемент, Родитель, СледующийЭлемент);
НайденныйЭлемент.Видимость = Истина;
Для Каждого ЭлементПериода Из НайденныйЭлемент.ПодчиненныеЭлементы Цикл
ТипЭлементаПериода = ТипЗнч(ЭлементПериода);
Если ТипЭлементаПериода = Тип("ПолеФормы") Тогда
ЭлементПериода.Заголовок = ЗаголовокЭлементаПериода(ЭлементПериода.Имя, Поле.Заголовок);
ЭлементПериода.Подсказка = ЭлементПериода.Заголовок;
ЭлементПериода.ПодсказкаВвода = ЭлементПериода.Заголовок;
// #Вставка - Здесь начинается модификация
Если НЕ СтрНайти(ЭлементПериода.Имя, "ДатаНачала") = 0 Тогда
ЭлементПериода.Заголовок = Поле.Заголовок;
ЭлементПериода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
КонецЕсли;
// #КонецВставки - Здесь заканчивается модификация
КонецЕсли;
Если ЭтоСтандартноеПредставление Тогда
ЭлементПериода.Видимость = ТипЭлементаПериода <> Тип("КнопкаФормы") Или (ТипЭлементаПериода = Тип("КнопкаФормы") И СтрНачинаетсяС(ЭлементПериода.ИмяКоманды, "ВыбратьПериод"));
Иначе
ЭлементПериода.Видимость = (ТипЭлементаПериода = Тип("КнопкаФормы") Или ТипЭлементаПериода = Тип("ГруппаФормы"));
КонецЕсли;
УстановитьСвойстваКнопкиВыбораПериода(ЭлементПериода, Период, ЭтоСтандартноеПредставление);
КонецЦикла;
Продолжить;
КонецЕсли;
ШаблонИмениЭлемента = СтрЗаменить(Поле.Имя, "Значение", "%1%2");
Группа = ГруппаЭлементовПериода(Элементы, Родитель, СледующийЭлемент, ШаблонИмениЭлемента, Поле.Заголовок);
ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмениЭлемента, ЭтоСтандартноеПредставление, -1);
ДобавитьПолеПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаНачала", Поле.Заголовок, ЭтоСтандартноеПредставление);
ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениЭлемента, "Разделитель");
Разделитель = Элементы.Найти(ИмяЭлемента);
Если Разделитель = Неопределено Тогда
Разделитель = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), Группа);
КонецЕсли;
Разделитель.Вид = ВидДекорацииФормы.Надпись;
Разделитель.Заголовок = Символ(8211); // Среднее тире (en dash).
Разделитель.Видимость = ЭтоСтандартноеПредставление;
ДобавитьПолеПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаОкончания", Поле.Заголовок, ЭтоСтандартноеПредставление);
ДобавитьКомандуВыбораПериода(Форма, Группа, ШаблонИмениЭлемента, Период, ЭтоСтандартноеПредставление);
ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмениЭлемента, ЭтоСтандартноеПредставление);
КонецЦикла;
КонецПроцедуры
Объяснение: Ключевая часть этого кода находится внутри цикла, где обрабатывается каждый элемент периода. Строки с #Вставка и #КонецВставки принудительно устанавливают заголовок элементам формы, чье имя содержит "ДатаНачала", используя заголовок родительского поля, и устанавливают положение заголовка в ПоложениеЗаголовкаЭлементаФормы.Авто. Это обходит стандартную логику БСП, которая могла бы его скрыть.
Альтернативный, более лаконичный способ модификации того же общего модуля ОтчетыСервер предлагает Сообщение 28. Он нацелен на устранение конкретного условия, которое, предположительно, скрывает заголовок, если в отчете только один параметр типа "Стандартный период". В БСП часто используется условие НайденныеЭлементы.Количество >= 2, которое означает, что заголовки отображаются только если параметров периода несколько. Мы просто удаляем это условие.
ОтчетыСервер.ВывестиПериодыНастроек. Ищем строки, отвечающие за определение переменной ВыводитьЗаголовкиПериодов, и корректируем их.Пример кода для расширения:
&ИзменениеИКонтроль("ВывестиПериодыНастроек")
Процедура Расш1_ВывестиПериодыНастроек(Форма, ЭлементыНастроек, ИменаРеквизитов)
НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ЭтоПериод, СвойствоНастройки", Истина, "Значение"));
Если НайденныеЭлементы.Количество = 0 Тогда
Возврат;
КонецЕсли;
Элементы = Форма.Элементы;
ИменаРеквизитовПредопределенных = ИменаРеквизитов.Предопределенных.Период;
ВариантПредставления = Форма.НастройкиОтчета.ВариантПредставленияПериода;
ЭтоСтандартноеПредставление = (ВариантПредставления = Перечисления.ВариантыПредставленияПериода.Стандартный);
// #Удаление - удаляем оригинальную строку
// ВыводитьЗаголовкиПериодов = ВыводитьЗаголовкиНастроек(Форма) И НайденныеЭлементы.Количество >= 2;
// #КонецУдаления
// #Вставка - заменяем на новую логику
ВыводитьЗаголовкиПериодов = ВыводитьЗаголовкиНастроек(Форма); // Удаляем условие "И НайденныеЭлементы.Количество >= 2"
// #КонецВставки
// ... Остальной код процедуры остается без изменений
// (здесь мы опускаем его для краткости, в расширении он будет полным)
Для Каждого Элемент Из НайденныеЭлементы Цикл
// ... (Остальной код процедуры)
КонецЦикла;
КонецПроцедуры
Объяснение: Мы удаляем часть условия И НайденныеЭлементы.Количество >= 2 из строки, которая определяет, нужно ли выводить заголовки. Таким образом, заголовки будут выводиться всегда, если функция ВыводитьЗаголовкиНастроек(Форма) возвращает Истина, независимо от количества параметров периода. Это значительно проще, но требует понимания, что именно эта строка влияет на видимость заголовка.
Существует способ заставить систему показать заголовок без написания кода и расширений, который использует саму логику проверки количества параметров БСП. Этот метод часто называют "фиктивным периодом".
НайденныеЭлементы.Количество >= 2, которое мы обсуждали), и система начинает выводить заголовки для обоих полей, чтобы пользователь мог их различить.Ложь в пользовательских настройках или настроив видимость на форме, если отчет имеет свою форму. Однако само его наличие в СКД меняет режим отрисовки формы.Для внешних отчетов, которые не встраиваются в конфигурацию, и где прямое изменение модулей БСП через расширение может быть нежелательным или затруднительным, мы можем использовать программный подход в модуле объекта отчета. Этот метод позволяет динамически изменять свойства элементов формы.
ПараметрыРегистрации.ОпределитьНастройкиФормы = Истина;
ОпределитьНастройкиФормы. Эта процедура вызывается перед открытием формы отчета и позволяет нам влиять на её поведение.
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.Вставить("ПослеЗаполненияПанелиБыстрыхНастроек", Истина);
КонецПроцедуры
Объяснение: Здесь мы подписываемся на событие ПослеЗаполненияПанелиБыстрыхНастроек, которое происходит после того, как БСП уже сформировала панель быстрых настроек. Это позволяет нам вмешаться в процесс отрисовки.
// Параметры:
// Форма - ФормаКлиентскогоПриложения
// ПараметрыЗаполнения - Структура
Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
Для каждого ТекЭлемент Из Форма.Элементы Цикл
Если НЕ СтрНайти(ТекЭлемент.Имя, "ДатаНачала") = 0 И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ТекЭлемент, "ПоложениеЗаголовка") Тогда
ТекЭлемент.Заголовок = СтрЗаменить(ТекЭлемент.Заголовок, "(дата начала)", "");
ТекЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Объяснение: В этом коде мы перебираем все элементы формы. Если имя элемента содержит строку "ДатаНачала" (что характерно для полей, относящихся к началу периода), мы принудительно устанавливаем его заголовок, удаляя лишний текст "(дата начала)", если он есть, и устанавливаем ПоложениеЗаголовка в Авто. Это позволяет добиться корректного отображения.
Помимо рассмотренных решений, мы можем обратить внимание на несколько дополнительных моментов, которые могут влиять на отображение заголовков:
ВывестиПериодыНастроек.ОтчетыКлиентСерверПереопределяемый), где разработчики конкретной конфигурации могут задавать глобальные настройки для всех отчетов. Если проблема носит массовый характер и затрагивает много отчетов, иногда целесообразнее внести изменение в общую функцию ВыводитьЗаголовкиНастроек (упомянутую в коде Сообщения 28), чтобы включить отображение заголовков глобально для всей системы, а не править каждый отчет по отдельности или использовать расширения для каждого модуля. Однако это требует изменения самой конфигурации, что не всегда желательно.Мы видим, что проблема с невидимым заголовком параметра "Стандартный период" в отчетах 1С на БСП имеет несколько слоев и решений. Начиная с простых проверок и заканчивая глубокой модификацией системных процедур через расширения, у нас есть арсенал средств для восстановления желаемого поведения. Выбор конкретного метода зависит от специфики отчета (внешний или встроенный), требований к стабильности конфигурации и уровня вашей готовности к программным изменениям. Главное – понять, что за этим поведением стоит целенаправленная логика БСП, которую можно обойти или изменить.