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