В разработке на платформе 1С часто возникает вопрос о поведении объектов при граничных или "пустых" значениях. Один из таких вопросов касается регистров сведений: что произойдет с записью, если ее ведущее измерение имеет простой тип (например, Число или Дата) и ему присвоено значение по умолчанию (0 или пустая дата)? Сработает ли механизм автоматического удаления, как это происходит со ссылочными типами? Давайте разберемся в этом вопросе подробно.
Основная путаница возникает из-за определения свойства Ведущее, которое гласит: "Ведущее — свойство измерения, подразумевающее под собой информацию о том, что без значения этого измерения запись регистра не имеет смысл. На деле это означает что система при удалении значения из измерения удаляет еще и запись регистра с «Ведущим» измерением."
Ключевая фраза здесь — "при удалении значения". Проанализируем, как это работает для разных типов данных.
Свойство Ведущее было в первую очередь создано для поддержания ссылочной целостности базы данных. Когда измерение регистра сведений ссылается на какой-либо объект (элемент справочника, документ), установка флага Ведущее дает платформе два важных указания:
Таким образом, для ссылочных типов механизм работает четко: нет объекта — нет и связанных с ним записей в регистре.
Теперь вернемся к главному вопросу: что происходит с простыми (примитивными) типами? Будет ли значение 0 для числового измерения или пустая дата ('01.01.0001') расценено платформой как "отсутствие значения", которое повлечет удаление записи?
Короткий ответ — нет, не будет.
Рассмотрим, почему это так. Значения простых типов, такие как 0, "" (пустая строка) или пустая дата, не являются ссылками на какие-либо объекты в базе данных. Их нельзя "физически удалить из базы", как можно удалить документ.
0 — это такое же полноценное число, как 1, -10 или 500.01.01.0001 00:00:00.Поскольку "удалить" само по себе число 0 из системы невозможно, то и механизм контроля ссылочной целостности, заложенный в свойство Ведущее, для этих типов просто не применяется. Запись с ведущим числовым измерением, равным 0, будет существовать в регистре как любая другая обычная запись и не будет автоматически удалена платформой.
Итог: свойство Ведущее для примитивных типов данных фактически не несет той функциональной нагрузки по очистке данных, которую оно выполняет для ссылочных типов.
Если ваша бизнес-логика требует, чтобы определенное измерение не было равно нулю или пустой дате, использовать для этого свойство Ведущее — неверный подход. Для таких задач в платформе 1С существуют другие, предназначенные для этого механизмы.
Разберем два основных способа.
1. Свойство "Проверка заполнения"
Это самый простой и декларативный способ. В свойствах нужного измерения в конфигураторе достаточно установить для свойства Проверка заполнения значение Выдавать ошибку. В этом случае платформа сама при попытке записи набора записей регистра проверит, заполнено ли поле. Если поле содержит значение по умолчанию для своего типа (0 для числа, пустая дата для даты и т.д.), запись не будет выполнена, а пользователю будет показано стандартное сообщение об ошибке.
2. Программный контроль в событии "ПередЗаписью"
Если требуется более сложная логика проверки (например, поле должно быть заполнено только при определенном условии), следует использовать обработчик события ПередЗаписью в модуле набора записей регистра сведений.
Посмотрим на пример. Допустим, у нас есть регистр сведений "ТарифыСотрудников" с числовым измерением "Тариф". Мы хотим запретить установку нулевого тарифа.
Процедура ПередЗаписью(Отказ, Замещать)
// Перебираем все записи в наборе, который пытаются записать
Для Каждого Запись Из ЭтотОбъект Цикл
// Проверяем наше условие
Если Запись.Тариф = 0 Тогда
// Если условие не выполнено, информируем пользователя
ОбщегоНазначения.СообщитьПользователю("Для сотрудника " + Запись.Сотрудник + " указан нулевой тариф. Запись невозможна.");
// И отменяем всю транзакцию записи
Отказ = Истина;
// Прерываем дальнейшую проверку, так как одна ошибка уже найдена
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В этом коде мы перебираем все изменяемые записи. Если находим запись с нулевым тарифом, мы устанавливаем параметр Отказ в значение Истина. Это говорит платформе, что запись всего набора записей должна быть отменена.
Таким образом, мы добиваемся нужного контроля над данными, не полагаясь на свойство Ведущее, которое предназначено для других целей.