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

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

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

В этой статье мы подробно проанализируем, почему возникает данная проблема, как устроена внутренняя логика платформы «1С:Предприятие 8.2 / 8.3» при работе с обычными формами и рассмотрим несколько эффективных способов решения — от простого изменения настроек в схеме компоновки данных до профессионального программного выноса параметров на форму.

Выясняем причину: как свойство «Представление» ломает интерфейс обычных форм

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

В этот момент и проявляется специфическая логика платформы 1С:

  1. Концепция «Фиксированного» отбора: Задавая элементу пользовательского отбора собственное текстовое «Представление», мы даем платформе сигнал, что данный отбор должен работать в упрощенном режиме. Платформа предполагает, что пользователю достаточно лишь включать или выключать предопределенное условие (ставить галочку «Использование»), но не требуется изменять левое значение, вид сравнения или само правое значение. Типичный пример применения такого подхода — отбор Проведен = Истина с представлением «Только проведенные». Пользователю не нужно видеть технические детали вроде «Равно» и «Да», ему нужна только одна галочка.
  2. Ограничения механизма обычных форм: В отличие от управляемых форм, где этот механизм работает более гибко, на обычных формах при заполнении свойства «Представление» платформа жестко блокирует колонки «Вид сравнения» и «Правое значение» в связанном табличном поле. В результате поле ввода даты визуально присутствует на форме, но полностью теряет интерактивность: вызвать стандартный календарь или диалог выбора периода становится физически невозможно.

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

Решение 1: Очистка свойства «Представление» в настройках СКД

Самый быстрый и простой способ вернуть работоспособность стандартному календарю — это полностью очистить пользовательское представление для проблемного отбора. Рассмотрим этот процесс:

  1. Откроем схему компоновки данных (СКД) вашего отчета.
  2. Перейдем на вкладку «Настройки», затем выберем вкладку «Отбор» в нижней части экрана.
  3. Найдем строку с отбором по дате или периоду, у которого заблокирован выбор значения.
  4. Посмотрим на колонку «Представление». Если там указан пользовательский текст, просто сотрем его, оставив поле абсолютно пустым.
  5. Сохраним отчет и проверим его работу в режиме «1С:Предприятие». Поле выбора значения (календарь) снова станет активным.

Решение 2: Использование «Заголовка» поля вместо «Представления» отбора

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

Проанализируем этот альтернативный вариант:

  1. В схеме компоновки данных перейдем на вкладку «Наборы данных» (или на вкладку «Поля»).
  2. Найдем наше поле (например, ДатаДокумента или Период).
  3. В колонке «Заголовок» введем то имя, которое мы хотим видеть на форме отчета (например, Дата оформления).
  4. В настройках отбора на вкладке «Настройки» оставим свойство «Представление» пустым.

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

Решение 3: Вынос параметров периода на форму отдельными реквизитами

Использование стандартного табличного поля компоновщика настроек для выбора дат — не всегда самое удобное решение для конечного пользователя в обычных формах. Гораздо профессиональнее и надежнее вынести параметры периода на форму в виде отдельных элементов управления. Рассмотрим, как реализовать этот подход программно.

Для начала создадим на нашей обычной форме два реквизита с типом Дата: ДатаНачала и ДатаКонца. Разместим их на форме в виде полей ввода.

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


Процедура ДатаНачалаПриИзменении(Элемент)
    // Устанавливаем параметр "НачалоПериода" в настройках компоновщика
    ПараметрНачало = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
    Если ПараметрНачало <> Неопределено Тогда
        ПараметрНачало.Значение = НачалоДня(ДатаНачала);
        ПараметрНачало.Использование = Истина;
    КонецЕсли;
КонецПроцедуры

Процедура ДатаКонцаПриИзменении(Элемент)
    // Устанавливаем параметр "КонецПериода" в настройках компоновщика
    ПараметрКонец = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
    Если ПараметрКонец <> Неопределено Тогда
        ПараметрКонец.Значение = КонецДня(ДатаКонца);
        ПараметрКонец.Использование = Истина;
    КонецЕсли;
КонецПроцедуры

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

Решение 4: Использование стандартного объекта «НастройкаПериода»

Для еще более удобного выбора интервалов времени в обычных формах 1С предоставляет встроенный интерактивный диалог НастройкаПериода. Давайте разберем, как его использовать совместно с СКД.

Разместим на форме кнопку выбора периода (например, с картинкой или текстом «...») рядом с полями дат и пропишем в обработчике ее нажатия следующий алгоритм:


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

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

Решение 5: Принудительное обновление настроек компоновщика при открытии формы

Иногда разработчики сталкиваются с сопутствующим поведением обычных форм: настройки отборов или параметров изменяются на форме, но компоновщик СКД «не подхватывает» новые значения при формировании отчета, либо некорректно инициализирует элементы управления при запуске.

Чтобы гарантировать корректную синхронизацию данных между формой и внутренними механизмами СКД, рекомендуется выполнять принудительную перезагрузку настроек в событии формы ПриОткрытии:


Процедура ПриОткрытии()
    // Принудительно инициализируем и перезагружаем настройки компоновщика
    КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроек.Настройки);
КонецПроцедуры

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

Резюме и рекомендации

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

← На главную