Как в 1С реализовать выбор даты или значения «Без даты» в табличной части?

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

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

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

Почему не стоит использовать составной тип данных?

Проанализируем основные ограничения и проблемы составных типов в табличных частях:

Способ 1. Единый реквизит типа Дата с условным оформлением (Рекомендуемый)

Разберем наиболее эффективный и простой способ. Реквизит табличной части остается со строгим типом Дата. Пустое значение даты (01.01.0001 00:00:00) будет интерпретироваться системой как «Без даты».

Пошагово настроим элемент формы:

  1. В свойствах элемента формы, связанного с колонкой даты, установим флажок Кнопка очистки (КнопкаОчистки = Истина). Это позволит пользователю быстро очищать поле.
  2. Настроим вывод текста «Без даты» для пустых значений с помощью условного оформления формы.

Для настройки условного оформления перейдем в свойства формы на вкладку Условное оформление и создадим новый элемент со следующими параметрами:

Также можно настроить свойство элемента формы Формат или ФорматРедактирования, указав представление пустой даты: ДП='Без даты'.

Способ 2. Разделение на реквизит даты и флажок «Без даты»

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

  1. ДатаОкончания (тип Дата).
  2. БезДаты (тип Булево).

В событии ПриИзменении для колонки с флажком очистим значение даты:


&НаКлиенте
Процедура ТабличнаяЧастьБезДатыПриИзменении(Элемент)
    СтрокаТЧ = Элементы.ТабличнаяЧасть.ТекущиеДанные;
    Если СтрокаТЧ <> Неопределено И СтрокаТЧ.БезДаты Тогда
        СтрокаТЧ.ДатаОкончания = '00010101000000';
    КонецЕсли;
КонецПроцедуры

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

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

← На главную