При разработке справочников (например, «Сотрудники» или «Физические лица») часто возникает задача автоматизировать заполнение стандартного реквизита Наименование. Это позволяет избежать ошибок ручного ввода и обеспечить единообразие данных в информационной базе. Рассмотрим подробно, как реализовать механизм, при котором программа самостоятельно собирает полное ФИО из отдельных реквизитов: Фамилия, Имя и Отчество.
Часто начинающие программисты сталкиваются с ошибкой «Переменная не определена», пытаясь напрямую обратиться к именам реквизитов в модуле формы. Проанализируем ситуацию: на форме управляемого приложения все данные объекта находятся в основном реквизите, который по умолчанию называется Объект. Поэтому, когда мы пишем код в модуле формы, обращение должно идти через эту структуру. Если мы просто напишем Наименование = Фамилия + Имя, система не поймет, откуда брать эти переменные.
Этот метод хорош тем, что пользователь сразу видит результат формирования строки Наименование при заполнении полей ФИО. Посмотрим на алгоритм реализации:
Фамилия, Имя и Отчество.ПриИзменении.Рассмотрим пример кода, который вызывается в обработчике события:
&НаСервере
Процедура ОбновитьНаименованиеНаСервере()
// Используем СтрШаблон для удобной склейки строк с пробелами
Объект.Наименование = СтрШаблон("%1 %2 %3", Объект.Фамилия, Объект.Имя, Объект.Отчество);
КонецПроцедуры
&НаКлиенте
Процедура ФамилияПриИзменении(Элемент)
ОбновитьНаименованиеНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ИмяПриИзменении(Элемент)
ОбновитьНаименованиеНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ОтчествоПриИзменении(Элемент)
ОбновитьНаименованиеНаСервере();
КонецПроцедуры
Важный нюанс: при таком подходе Наименование обновится на экране сразу, но запишется в базу данных только тогда, когда пользователь нажмет кнопку «Записать» или «Записать и закрыть».
Проанализируем более надежный способ. Если мы реализуем логику только в модуле формы, то при программном создании элементов (например, при загрузке данных из внешнего файла Excel или обмене с другой базой) Наименование останется пустым, так как форма в этот момент не открывается. Чтобы логика работала всегда, воспользуемся предопределенным событием модуля объекта ПередЗаписью.
Выясним преимущества этого метода: код выполняется непосредственно перед фиксацией данных в базе данных. Здесь нам уже не нужно использовать приставку Объект, так как мы находимся внутри самого объекта справочника.
Пример кода в модуле объекта:
Процедура ПередЗаписью(Отказ)
// Простейшая конкатенация
Наименование = СокрЛП(Фамилия) + " " + СокрЛП(Имя) + " " + СокрЛП(Отчество);
КонецПроцедуры
Посмотрим на ситуацию критически: что будет, если у сотрудника нет отчества? При обычной конкатенации со строкой пробела + " " + в конце или в середине имени может появиться лишний пробел. Чтобы сделать код более чистым и профессиональным, рекомендуется использовать массив и функцию СтрСоединить. Это позволит автоматически исключить пустые элементы и лишние разделители.
Разберем этот пример подробнее:
Процедура ПередЗаписью(Отказ)
МассивФИО = Новый Массив;
Если ЗначениеЗаполнено(Фамилия) Тогда
МассивФИО.Добавить(СокрЛП(Фамилия));
КонецЕсли;
Если ЗначениеЗаполнено(Имя) Тогда
МассивФИО.Добавить(СокрЛП(Имя));
КонецЕсли;
Если ЗначениеЗаполнено(Отчество) Тогда
МассивФИО.Добавить(СокрЛП(Отчество));
КонецЕсли;
// Соединяем все заполненные части через один пробел
Наименование = СтрСоединить(МассивФИО, " ");
КонецПроцедуры
Выясним, как сделать интерфейс более дружелюбным для пользователя. Если мы автоматизировали расчет Наименования, то ручное редактирование этого поля пользователем может привести к путанице (программа все равно перезапишет его при сохранении).
Рекомендуем выполнить следующие настройки в конфигураторе для элемента формы Наименование:
Наименование. По умолчанию она может быть 25 или 50 символов. Если ФИО длинное, программа может обрезать строку или выдать ошибку. Рекомендуется устанавливать длину не менее 100-150 символов для справочников физических лиц.Если вы работаете в современной конфигурации (например, 1С:ERP, УТ 11 или БП 3.0), рассмотрите возможность использования готовых функций БСП. В общем модуле ФизическиеЛицаКлиентСервер (или аналогичных) часто уже реализованы функции для формирования ФИО и даже для генерации краткого представления вида «Иванов И.И.». Использование типовых функций 1С делает ваш код более устойчивым к обновлениям системы и соответствующим стандартам разработки.
Таким образом, мы рассмотрели различные способы автоматизации: от простых манипуляций на форме до архитектурно правильной реализации в модуле объекта. Выбор метода зависит от конкретных задач вашего проекта, но для обеспечения целостности данных всегда рекомендуется дублировать или полностью переносить логику формирования ключевых полей в модуль объекта.