Как автоматически сформировать Наименование из Фамилии, Имени и Отчества в справочнике 1С?

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

При разработке справочников (например, «Сотрудники» или «Физические лица») часто возникает задача автоматизировать заполнение стандартного реквизита Наименование. Это позволяет избежать ошибок ручного ввода и обеспечить единообразие данных в информационной базе. Рассмотрим подробно, как реализовать механизм, при котором программа самостоятельно собирает полное ФИО из отдельных реквизитов: Фамилия, Имя и Отчество.

Разберем типичную проблему новичка

Часто начинающие программисты сталкиваются с ошибкой «Переменная не определена», пытаясь напрямую обратиться к именам реквизитов в модуле формы. Проанализируем ситуацию: на форме управляемого приложения все данные объекта находятся в основном реквизите, который по умолчанию называется Объект. Поэтому, когда мы пишем код в модуле формы, обращение должно идти через эту структуру. Если мы просто напишем Наименование = Фамилия + Имя, система не поймет, откуда брать эти переменные.

Вариант 1. Реализация логики в модуле формы

Этот метод хорош тем, что пользователь сразу видит результат формирования строки Наименование при заполнении полей ФИО. Посмотрим на алгоритм реализации:

  1. Выберем на форме элементы управления для реквизитов Фамилия, Имя и Отчество.
  2. Для каждого из этих элементов в свойствах создадим событие ПриИзменении.
  3. Создадим общую процедуру на сервере, которая будет объединять строки.

Рассмотрим пример кода, который вызывается в обработчике события:


&НаСервере
Процедура ОбновитьНаименованиеНаСервере()
    // Используем СтрШаблон для удобной склейки строк с пробелами
    Объект.Наименование = СтрШаблон("%1 %2 %3", Объект.Фамилия, Объект.Имя, Объект.Отчество);
КонецПроцедуры

&НаКлиенте
Процедура ФамилияПриИзменении(Элемент)
    ОбновитьНаименованиеНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ИмяПриИзменении(Элемент)
    ОбновитьНаименованиеНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ОтчествоПриИзменении(Элемент)
    ОбновитьНаименованиеНаСервере();
КонецПроцедуры

Важный нюанс: при таком подходе Наименование обновится на экране сразу, но запишется в базу данных только тогда, когда пользователь нажмет кнопку «Записать» или «Записать и закрыть».

Вариант 2. Использование модуля объекта (Золотой стандарт)

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

Выясним преимущества этого метода: код выполняется непосредственно перед фиксацией данных в базе данных. Здесь нам уже не нужно использовать приставку Объект, так как мы находимся внутри самого объекта справочника.

Пример кода в модуле объекта:


Процедура ПередЗаписью(Отказ)
    // Простейшая конкатенация
    Наименование = СокрЛП(Фамилия) + " " + СокрЛП(Имя) + " " + СокрЛП(Отчество);
КонецПроцедуры

Профессиональный подход: обработка пустых значений

Посмотрим на ситуацию критически: что будет, если у сотрудника нет отчества? При обычной конкатенации со строкой пробела + " " + в конце или в середине имени может появиться лишний пробел. Чтобы сделать код более чистым и профессиональным, рекомендуется использовать массив и функцию СтрСоединить. Это позволит автоматически исключить пустые элементы и лишние разделители.

Разберем этот пример подробнее:


Процедура ПередЗаписью(Отказ)
    
    МассивФИО = Новый Массив;
    
    Если ЗначениеЗаполнено(Фамилия) Тогда
        МассивФИО.Добавить(СокрЛП(Фамилия));
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Имя) Тогда
        МассивФИО.Добавить(СокрЛП(Имя));
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Отчество) Тогда
        МассивФИО.Добавить(СокрЛП(Отчество));
    КонецЕсли;
    
    // Соединяем все заполненные части через один пробел
    Наименование = СтрСоединить(МассивФИО, " ");
    
КонецПроцедуры

Дополнительные рекомендации по оформлению формы

Выясним, как сделать интерфейс более дружелюбным для пользователя. Если мы автоматизировали расчет Наименования, то ручное редактирование этого поля пользователем может привести к путанице (программа все равно перезапишет его при сохранении).

Рекомендуем выполнить следующие настройки в конфигураторе для элемента формы Наименование:

Использование Библиотеки стандартных подсистем (БСП)

Если вы работаете в современной конфигурации (например, 1С:ERP, УТ 11 или БП 3.0), рассмотрите возможность использования готовых функций БСП. В общем модуле ФизическиеЛицаКлиентСервер (или аналогичных) часто уже реализованы функции для формирования ФИО и даже для генерации краткого представления вида «Иванов И.И.». Использование типовых функций 1С делает ваш код более устойчивым к обновлениям системы и соответствующим стандартам разработки.

Таким образом, мы рассмотрели различные способы автоматизации: от простых манипуляций на форме до архитектурно правильной реализации в модуле объекта. Выбор метода зависит от конкретных задач вашего проекта, но для обеспечения целостности данных всегда рекомендуется дублировать или полностью переносить логику формирования ключевых полей в модуль объекта.

← На главную