Довольно часто при разработке в 1С возникает ситуация, когда числовой реквизит формы или объекта по умолчанию инициализируется нулем, а бизнес-логика требует, чтобы начальное значение начиналось с единицы. Разберем по шагам, почему так происходит и какие существуют правильные способы решения этой задачи. Проанализируем различные ситуации: от простой установки значения на форме до глобального контроля записи данных.
Если мы работаем с обычным реквизитом, который существует только в рамках управляемой формы, задать ему дефолтное значение через палитру свойств не получится. Платформа 1С не имеет для реквизитов формы отдельного визуального свойства начальной инициализации. Посмотрим на пример, как это сделать программно.
Для инициализации мы используем обработчик события ПриСозданииНаСервере. Рассмотрим код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Если это просто реквизит формы (без привязки к объекту)
НазваниеВашегоРеквизита = 1;
// Если это реквизит основного объекта (например, документа или справочника)
Объект.НазваниеВашегоРеквизита = 1;
КонецПроцедуры
Этот метод отлично подходит для простых интерфейсных задач, когда значение должно заполняться единицей только при ручном открытии окна пользователем.
Если речь идет о реквизите самого объекта конфигурации (справочника, документа и т.д.), то писать код в форме не обязательно. Разберем встроенный механизм платформы. В конфигураторе, в палитре свойств реквизита объекта есть специальное поле ЗначениеЗаполнения.
Если в этом свойстве указать единицу, то при интерактивном создании нового элемента (когда пользователь нажимает кнопку создания в списке) платформа автоматически подставит это значение в реквизит. Это избавляет разработчика от необходимости писать дополнительный код в модуле формы.
Выясним причину, почему предыдущие способы не всегда идеальны. Если новый документ или справочник создается не пользователем через интерфейс, а программно фоновым заданием (с помощью методов СоздатьЭлемент или СоздатьДокумент), то ни форма, ни свойство интерактивного заполнения могут не отработать должным образом. Реквизит снова останется равным нулю.
Рассмотрим более надежный и правильный подход. Чтобы значение заполнялось всегда, независимо от способа создания объекта, необходимо использовать модуль самого объекта. Проанализируем событие ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Устанавливаем значение по умолчанию при любом программном или ручном создании объекта
НазваниеВашегоРеквизита = 1;
КонецПроцедуры
Этот подход соответствует стандартам разработки 1С и гарантирует стопроцентную целостность начальных данных.
Часто разработчики пытаются решить проблему ввода нуля с помощью формата редактирования на форме, например, используя строку ЧН=1. Разберем, почему это является грубой ошибкой. Формат редактирования меняет только визуальное отображение числа на экране. В базе данных все равно сохранится ноль. Более того, пользователь не сможет нормально ввести числа, содержащие единицы или нули (например, 10, 11, 100), так как визуальное форматирование будет мешать вводу.
Рассмотрим правильные способы ограничения ввода нуля:
МинимальноеЗначение. Установите его равным 1. Платформа 1С на базовом уровне запретит ввод любых чисел, которые меньше единицы.ПроверкаЗаполнения в значение "Выдавать ошибку". Для числовых типов в 1С ноль по умолчанию трактуется как незаполненное (пустое) значение. Система автоматически не даст сохранить объект, требуя ввести корректное число.ОбработкаПроверкиЗаполнения в модуле объекта. Посмотрим на пример реализации:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если НазваниеВашегоРеквизита < 1 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Числовое значение реквизита должно быть больше нуля!";
Сообщение.Поле = "НазваниеВашегоРеквизита";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Применяя эти методы в комплексе, вы создадите надежную систему, где числа по умолчанию инициализируются нужным значением, а случайный ввод нулевых или отрицательных данных физически исключается на уровне платформы.