В разработке на платформе 1С часто возникает задача ограничить ввод данных определенным форматом. Одной из таких задач является работа с «модельным годом» продукции. Пользователю удобно видеть и вводить только две или четыре цифры года, при этом система должна корректно обрабатывать эти данные для сортировки, отчетов и хранения. Рассмотрим подробно, как реализовать этот функционал в обычных формах, проанализируем различные подходы к хранению данных и настроим удобный интерфейс.
Если вы решили хранить модельный год в реквизите с типом Дата (состав даты — Дата), это дает преимущество при построении стандартных временных отчетов. Однако стандартное поле ввода даты требует ввода дня и месяца, что неудобно для пользователя. Разберем, как это исправить.
Для настройки визуального отображения воспользуемся свойством Формат (или Форматная строка). Проанализируем основные параметры:
ДФ=yy.ДФ=yyyy.Важный нюанс: при использовании типа Дата пустое значение по умолчанию выглядит как «01.01.0001». Чтобы в поле не отображались лишние символы, когда год не задан, добавим параметр ДП (представление пустой даты). Итоговая строка будет выглядеть так: ДФ=yy; ДП=' '.
Рассмотрим проблему ввода. Когда пользователь вводит две цифры (например, «21») в поле типа Дата, система должна понять, к какому веку относится этот год. Проанализируем системную настройку Год начала рабочего столетия в конфигурации. Если там установлено значение «1950», то числа от 50 до 99 будут интерпретированы как 20 век, а от 00 до 49 — как 21 век. Обязательно проверьте этот параметр перед использованием сокращенного формата.
Чтобы данные в базе были единообразными (например, всегда первое января выбранного года), рекомендуется использовать обработчик события ПриИзменении:
Процедура МодельныйГодПриИзменении(Элемент)
Если ЗначениеЗаполнено(Объект.МодельныйГод) Тогда
// Устанавливаем дату на начало выбранного года
Объект.МодельныйГод = НачалоГода(Объект.МодельныйГод);
КонецЕсли;
КонецПроцедуры
Многие разработчики предпочитают хранить год как Число (длина 4, точность 0). Это упрощает написание запросов и исключает сложности с «началом столетия». Посмотрим, как сделать работу с числом максимально комфортной.
Для числового поля также важна настройка формата. Чтобы 1С не добавляла разделитель групп разрядов (например, «2 021» вместо «2021»), используйте форматную строку ЧГ=0. Если же вам нужно отображать только две последние цифры, мы можем программно преобразовывать число при выводе, но лучше оставить четыре цифры для однозначности в базе данных.
Для удобства пользователя в обычных формах идеально подходит Поле регулирования (Spin Button). Разберем шаги настройки:
КнопкаРегулирования в значение Истина.Регулирование пропишите логику изменения значения.Пример кода для изменения года кнопками «вверх-вниз»:
Процедура МодельныйГодРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный механизм, если нужно кастомное поведение
Если Направление = 1 Тогда
Объект.МодельныйГод = Объект.МодельныйГод + 1;
ИначеЕсли Направление = -1 Тогда
Объект.МодельныйГод = Объект.МодельныйГод - 1;
КонецЕсли;
КонецПроцедуры
Если ассортимент продукции ограничен конкретными годами, лучше всего использовать Список выбора. Это исключит возможность ввода некорректных данных (например, 2099 год). Выясним, как это реализовать:
КнопкаСпискаВыбора.РежимВыбораИзСписка в значение Истина, чтобы пользователь не мог вводить произвольный текст.
Процедура ПриОткрытии()
ТекущийГод = ДатаГод(ТекущаяДата());
ЭлементыФормы.МодельныйГод.СписокВыбора.Очистить();
ЭлементыФормы.МодельныйГод.СписокВыбора.Добавить(0, " "); // Для возможности очистки поля
Для г = ТекущийГод - 5 По ТекущийГод + 1 Цикл
ЭлементыФормы.МодельныйГод.СписокВыбора.Добавить(г, Строка(г));
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию: какой метод выбрать? Если ваша задача — просто отобразить год в карточке товара, Число с кнопками регулирования является наиболее эргономичным вариантом. Если же год является частью сложной периодической системы (например, графики производства), тип Дата будет более оправдан.
Независимо от выбранного способа, всегда добавляйте проверку на логичность в процедуре ПередЗаписью. Выясним причины возможных ошибок: пользователь может случайно ввести слишком маленькое число или дату из далекого будущего. Пример простой валидации:
Процедура ПередЗаписью(Отказ)
Если ЗначениеЗаполнено(МодельныйГод) Тогда
Если МодельныйГод < 1900 Или МодельныйГод > 2100 Тогда
Сообщить("Проверьте правильность ввода модельного года!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Подведем итог: для красивой реализации в обычных формах используйте комбинацию форматной строки ДФ=yy (для дат) или ЧГ=0 (для чисел) вместе с элементами управления, такими как кнопки регулирования или выпадающие списки. Это сделает интерфейс профессиональным и удобным для конечного пользователя.