При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с неприятным визуальным эффектом: если для параметра типа Дата (или иногда Число) задать список Доступных значений, то при выборе конкретного пункта в режиме «1С:Предприятие» значение в поле ввода визуально исчезает. При этом сам отчет формируется корректно, что подтверждает — данные в параметр передаются, но интерфейс их «теряет».
В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизмы работы платформы 1С и рассмотрим несколько надежных способов решения проблемы, чтобы интерфейс отчета был удобным и понятным для пользователя.
Проанализируем ситуацию с технической точки зрения. Начиная с версий платформы 8.3.15 и выше, интерфейс «Такси» стал более требователен к точному соответствию типов и форматов данных. Когда мы задаем список доступных значений в схеме СКД, платформа создает внутреннюю привязку между значением и его представлением.
Основная причина «очистки» поля заключается в несоответствии формата значения, хранящегося в списке, и формата, который ожидает увидеть элемент управления (поле ввода) на форме. Для типа Дата это критично: если в доступных значениях дата указана с временем (например, 01.01.2023 00:00:00), а формат редактирования параметра настроен только на дату (ДФ=dd.MM.yyyy), то при попытке визуального сопоставления выбранного элемента со списком система может не найти «идеального» соответствия. В результате значение устанавливается в объект настроек, но контрол на форме сбрасывает текст, так как не может его идентифицировать.
Похожая ситуация наблюдается и с типом Число. Если точность числа в параметре и в списке доступных значений различается (например, 20 и 20.00), визуальная связь может разорваться.
Рассмотрим первый и самый простой способ — приведение форматов к единому знаменателю. Чтобы система корректно отображала дату, нужно убедиться, что Формат редактирования совпадает с тем, как данные представлены в списке.
ДФ=dd.MM.yyyy.Этот метод помогает в простых случаях, но, как показывает практика, не всегда является стабильным из-за особенностей платформенного кэширования форм.
Проанализируем наиболее надежный метод, который гарантированно решает проблему «исчезновения» текста. Если платформа плохо справляется с отображением дат из списка, мы можем использовать тип Строка для выбора, а затем преобразовывать ее обратно в Дата на уровне СКД.
Разберем этот процесс по шагам:
ВыбранныйПериодСтрокой с типом Строка.ГГГГММДД.ДатаНачала) сделаем Ограничением доступности (скроем от пользователя).ДатаНачала пропишем код преобразования:
ДатаВремя(Лев(&ВыбранныйПериодСтрокой, 4), Сред(&ВыбранныйПериодСтрокой, 5, 2), Сред(&ВыбранныйПериодСтрокой, 7, 2))
Поскольку параметр ВыбранныйПериодСтрокой имеет строковый тип, платформа не будет пытаться применять к нему логику форматирования дат, и выбранное значение всегда будет оставаться видимым в шапке отчета.
Если задача стоит в том, чтобы пользователь выбирал месяц и год отдельно, мы можем создать два независимых параметра. Это избавит пользователя от необходимости выбирать конкретное число месяца и решит проблему со списком доступных значений.
Посмотрим на пример реализации:
Месяц (тип Число, доступные значения от 1 до 12 с представлениями "Январь", "Февраль"...).Год (тип Число, список доступных значений, например, 2023, 2024, 2025).ПериодОтчета, который используется в условиях запроса, пишем Выражение:
ДобавитьКДате(ДобавитьКДате(ДатаВремя(1, 1, 1), "Год", &Год - 1), "Месяц", &Месяц - 1)
Такой подход делает интерфейс профессиональным и исключает любые «глюки» с очисткой полей, так как работа идет с простыми числами.
В некоторых случаях мы не хотим менять структуру СКД, но нам нужно исправить поведение формы. Мы можем вмешаться в процесс создания формы отчета и программно заполнить Список выбора для элемента управления.
В модуле формы отчета проанализируем событие ПриСозданииНаСервере или создадим обработчик для конкретного поля:
&НаСервере
Процедура ЗаполнитьСписокВыбораПараметра()
ЭлементФормы = ЭтаФорма.Элементы.НастройкиОтчетаПараметрыДанныхЗначение; // Уточните имя элемента
Если ЭлементФормы.ПутьКДанным = "Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Период" Тогда
ЭлементФормы.РежимВыбораИзСписка = Истина;
ЭлементФормы.СписокВыбора.Очистить();
ЭлементФормы.СписокВыбора.Добавить('20230101', "Январь 2023");
ЭлементФормы.СписокВыбора.Добавить('20230201', "Февраль 2023");
КонецЕсли;
КонецПроцедуры
Важный момент: списки выбора, заданные программно на уровне элементов формы, работают гораздо стабильнее, чем механизмы «Доступных значений» внутри самой схемы компоновки, так как они напрямую управляют визуальным контролом ПолеВвода.
Если вы столкнулись с аналогичной проблемой для числовых значений (например, выбор ставки НДС 20% или 25%), выполните следующие действия:
Число() в выражении СКД.Мы рассмотрели проблему визуального исчезновения значений в параметрах СКД. Выяснили, что основной причиной является конфликт между механизмом хранения данных и их представлением в управляемом интерфейсе. Для решения этой задачи мы рекомендуем использовать либо строковые параметры с последующим преобразованием в дату, либо раздельные параметры для года и месяца. Это не только решит техническую проблему, но и сделает работу пользователя с отчетом более комфортной.