Как при записи элемента справочника автоматически добавить код в наименование в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие часто возникают ситуации, когда требуется автоматизировать заполнение реквизита Наименование на основе других данных, например, на основе Кода элемента. Разберем, как правильно реализовать эту задачу в управляемом приложении, какие существуют архитектурные риски и как сделать решение максимально надежным.

Почему не стоит использовать форму для изменения данных объекта?

В начале пути многие разработчики пытаются реализовать логику записи в модуле управляемой формы, используя обработчик ПриЗаписиНаСервере. Однако этот подход имеет существенный недостаток: форма — это лишь инструмент отображения данных, а основной бизнес-логикой по изменению данных самого объекта должен управлять модуль объекта. Внесение изменений в ТекущийОбъект внутри формы может привести к рассинхронизации данных, если объект будет записываться из другого места (например, программно или через обмен данными).

Решение задачи в модуле объекта

Самым надежным местом для изменения реквизитов перед сохранением в базу данных является обработчик ПередЗаписью в модуле объекта справочника. Давайте рассмотрим, как это реализовать по шагам.

Важные нюансы реализации:

  1. Инициализация кода: Платформа присваивает код новому объекту в момент записи. Если мы хотим использовать Код в наименовании для нового объекта, нам необходимо вызвать УстановитьНовыйКод() принудительно.
  2. Проверка заполненности: Обязательно проверяйте, не заполнено ли наименование ранее, чтобы избежать лишней перезаписи данных при каждом открытии и сохранении элемента.

Разберем пример кода, который необходимо разместить в модуле объекта справочника:


Процедура ПередЗаписью(Отказ)
    // Для новых элементов принудительно получаем код
    Если ЭтоНовый() Тогда
        ЭтотОбъект.УстановитьНовыйКод();
    КонецЕсли; 

    // Проверяем, пустое ли наименование, чтобы не перезаписывать его лишний раз
    Если НЕ ЗначениеЗаполнено(Наименование) Тогда
        Если ЗначениеЗаполнено(Код) Тогда
            Наименование = "Наименование - " + СокрЛП(Код);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Альтернативные и более правильные подходы

Хотя вышеуказанное решение работает, оно создает избыточность в базе данных: мы храним в реквизите Наименование значение, которое производно от Кода. Это приводит к лишним записям в таблицу БД и риску устаревания данных. Рассмотрим более современные подходы:

Использование «Основного представления»

Если ваша цель — сделать так, чтобы в списках, полях ввода и отчетах пользователь видел Код вместо Наименования, не обязательно программно заполнять реквизит. Вы можете изменить архитектуру справочника:

  1. Откройте справочник в Конфигураторе.
  2. Перейдите на вкладку Данные.
  3. Найдите свойство Основное представление.
  4. Установите значение Код.

После этой настройки платформа автоматически будет подставлять Код во всех интерфейсных формах, избавляя вас от необходимости хранить дублирующую информацию в Наименовании.

Механизм «Обработка получения представления»

Если логика формирования представления сложнее (например, добавление префикса или объединение нескольких реквизитов), используйте обработчик ОбработкаПолученияПредставления в модуле менеджера справочника. Этот метод позволяет динамически «подменять» отображаемое значение без изменения содержимого реквизитов в базе данных.


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Представление = "Наименование - " + Данные.Код;
КонецПроцедуры

Итог: Если вы хотите отказаться от использования наименования как обязательного поля, лучше всего настроить Основное представление в свойствах объекта. Если же вам необходимо именно физическое заполнение реквизита, используйте ПередЗаписью в модуле объекта с обязательной проверкой ЭтоНовый() и ЗначениеЗаполнено(), чтобы обеспечить корректную работу системы и чистоту данных.

← На главную