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

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

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

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

Выясняем причину: почему очищается поле?

Проанализируем ситуацию с технической точки зрения. Начиная с версий платформы 8.3.15 и выше, интерфейс «Такси» стал более требователен к точному соответствию типов и форматов данных. Когда мы задаем список доступных значений в схеме СКД, платформа создает внутреннюю привязку между значением и его представлением.

Основная причина «очистки» поля заключается в несоответствии формата значения, хранящегося в списке, и формата, который ожидает увидеть элемент управления (поле ввода) на форме. Для типа Дата это критично: если в доступных значениях дата указана с временем (например, 01.01.2023 00:00:00), а формат редактирования параметра настроен только на дату (ДФ=dd.MM.yyyy), то при попытке визуального сопоставления выбранного элемента со списком система может не найти «идеального» соответствия. В результате значение устанавливается в объект настроек, но контрол на форме сбрасывает текст, так как не может его идентифицировать.

Похожая ситуация наблюдается и с типом Число. Если точность числа в параметре и в списке доступных значений различается (например, 20 и 20.00), визуальная связь может разорваться.

Решение 1: Использование параметров редактирования (Формат)

Рассмотрим первый и самый простой способ — приведение форматов к единому знаменателю. Чтобы система корректно отображала дату, нужно убедиться, что Формат редактирования совпадает с тем, как данные представлены в списке.

  1. Откроем схему компоновки данных и перейдем на закладку Параметры.
  2. Найдем наш параметр и перейдем в колонку Параметры редактирования.
  3. В поле Формат редактирования (и желательно в поле Формат) установим жесткую маску, например: ДФ=dd.MM.yyyy.
  4. Важно: в списке Доступных значений даты также должны быть введены без произвольного времени, строго на начало дня.

Этот метод помогает в простых случаях, но, как показывает практика, не всегда является стабильным из-за особенностей платформенного кэширования форм.

Решение 2: Обходной путь через тип «Строка» и «Выражение»

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

Разберем этот процесс по шагам:

  1. Создадим в СКД вспомогательный параметр, например, ВыбранныйПериодСтрокой с типом Строка.
  2. В списке Доступных значений для этого строкового параметра добавим нужные варианты (например, "Январь 2024", "Февраль 2024" и т.д.). В колонку Значение запишем строковое представление даты в формате ГГГГММДД.
  3. Основной параметр (который используется в запросе, например ДатаНачала) сделаем Ограничением доступности (скроем от пользователя).
  4. В поле Выражение для основного параметра ДатаНачала пропишем код преобразования:

ДатаВремя(Лев(&ВыбранныйПериодСтрокой, 4), Сред(&ВыбранныйПериодСтрокой, 5, 2), Сред(&ВыбранныйПериодСтрокой, 7, 2))

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

Решение 3: Использование вычисляемых параметров для выбора Месяца и Года

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

Посмотрим на пример реализации:

  1. Создаем параметр Месяц (тип Число, доступные значения от 1 до 12 с представлениями "Январь", "Февраль"...).
  2. Создаем параметр Год (тип Число, список доступных значений, например, 2023, 2024, 2025).
  3. В параметре ПериодОтчета, который используется в условиях запроса, пишем Выражение:

ДобавитьКДате(ДобавитьКДате(ДатаВремя(1, 1, 1), "Год", &Год - 1), "Месяц", &Месяц - 1)

Такой подход делает интерфейс профессиональным и исключает любые «глюки» с очисткой полей, так как работа идет с простыми числами.

Решение 4: Программное управление списком выбора на форме

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

В модуле формы отчета проанализируем событие ПриСозданииНаСервере или создадим обработчик для конкретного поля:


&НаСервере
Процедура ЗаполнитьСписокВыбораПараметра()
    ЭлементФормы = ЭтаФорма.Элементы.НастройкиОтчетаПараметрыДанныхЗначение; // Уточните имя элемента
    Если ЭлементФормы.ПутьКДанным = "Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Период" Тогда
        ЭлементФормы.РежимВыбораИзСписка = Истина;
        ЭлементФормы.СписокВыбора.Очистить();
        ЭлементФормы.СписокВыбора.Добавить('20230101', "Январь 2023");
        ЭлементФормы.СписокВыбора.Добавить('20230201', "Февраль 2023");
    КонецЕсли;
КонецПроцедуры

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

Рекомендации по работе с типом «Число»

Если вы столкнулись с аналогичной проблемой для числовых значений (например, выбор ставки НДС 20% или 25%), выполните следующие действия:

Резюме

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

← На главную