В процессе разработки на платформе 1С:Предприятие 8 часто возникает необходимость динамически изменять визуальное представление данных. Типичный пример: в зависимости от определенных условий (настроек пользователя или вида документа) нам нужно скрыть или показать время в поле даты, либо изменить разрядность чисел. Рассмотрим подробно, как это реализовать программно, и разберем типичные ошибки, с которыми сталкиваются разработчики.
Первое, с чем необходимо разобраться — это разделение ответственности между двумя ключевыми свойствами элемента формы. Проанализируем, почему простое изменение свойства Формат часто не дает ожидаемого результата.
Если мы хотим, чтобы интерфейс вел себя предсказуемо, нам необходимо устанавливать оба этих свойства одновременно. В противном случае пользователь столкнется с эффектом «прыгающих данных», когда при входе в режим редактирования состав даты или точность числа внезапно меняются.
Рассмотрим ситуацию из практики: у нас есть реквизит ДатаНачала с типом Дата (состав даты: Дата и время). Нам нужно программно переключать видимость времени. Выясним причину, по которой стандартный код может не срабатывать, и приведем правильный вариант.
Для корректной работы рекомендуется использовать латинские коды локализации. Хотя платформа поддерживает русский язык, практика показывает, что английские сокращения работают стабильнее в веб-клиенте и мобильных приложениях.
Разберем пример кода для переключения формата:
Если Объект.УказыватьВремя Тогда
// Устанавливаем формат отображения и редактирования: Дата + Время
Элементы.ДатаНачала.Формат = "ДЛФ=ДВ";
Элементы.ДатаНачала.ФорматРедактирования = "DLF=DT";
Иначе
// Устанавливаем формат отображения и редактирования: Только Дата
Элементы.ДатаНачала.Формат = "ДЛФ=Д";
Элементы.ДатаНачала.ФорматРедактирования = "DLF=D";
КонецЕсли;
Обратите внимание на используемые коды:
DLF=D (Date) соответствует ДЛФ=Д (Дата);DLF=T (Time) соответствует ДЛФ=В (Время);DLF=DT (DateTime) соответствует ДЛФ=ДВ (ДатаВремя).Важно помнить, что программная установка формата не может расширить возможности хранения данных, заложенные в конфигураторе. Проанализируем ситуацию: если у реквизита в метаданных (в дереве конфигурации) свойство «Состав даты» установлено как «Дата», то время в базе данных попросту не сохраняется. Даже если вы программно пропишете DLF=DT, поле ввода не покажет время, так как его нет в источнике данных. Для гибкого управления всегда устанавливайте в метаданных «Дата и время».
Рассмотрим более сложный случай, связанный с числовыми данными. Часто разработчики сталкиваются с тем, что даже при установке формата ЧЦ=15 (без указания дробной части), при редактировании в поле все равно появляются знаки после запятой. Посмотрим на пример настройки для поля Количество:
Элементы.ТоварыКоличество.Формат = "ЧЦ=15; ЧДЦ=0";
Элементы.ТоварыКоличество.ФорматРедактирования = "ЧЦ=15; ЧДЦ=0";
Если после выполнения этого кода при вводе числа все равно отображается «0,000», следует проверить дополнительные параметры:
Маска. Если она содержит разделитель дробной части, платформа будет принудительно его показывать.ЧН=0 (представление нуля), чтобы поле не выглядело пустым.Проанализируем ситуацию, когда код выполняется в расширении конфигурации. Приоритет программной установки свойств всегда выше, чем настроек в конфигураторе, однако важно место вызова кода. Рекомендуется выполнять установку формата в процедуре ПриСозданииНаСервере или ПриЧтенииНаСервере. Если вы меняете формат в процессе работы (например, при изменении другого поля), убедитесь, что вы обращаетесь к элементам формы через ЭтаФорма.Элементы.
В редких случаях, когда визуальные изменения не применяются мгновенно, можно использовать принудительное обновление интерфейса, хотя для свойств элементов это требуется крайне редко:
ЭтаФорма.ОбновитьОтображениеДанных();
Для надежного программного управления форматом в 1С всегда следуйте трем правилам:
Во-первых, меняйте одновременно Формат и ФорматРедактирования.
Во-вторых, используйте английские коды локализации (DLF) для обеспечения кроссплатформенности.
В-третьих, всегда проверяйте, позволяют ли метаданные реквизита отображать те данные, которые вы пытаетесь настроить программно.