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