Как автоматически сформировать наименование в 1С на основе специальности и номера группы?

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

В процессе разработки в среде 1С:Предприятие 8 часто возникает задача автоматизации рутинных операций. Одной из таких задач является формирование понятного пользователю наименования элемента справочника на основе введенных им данных. Например, когда при указании специальности «Экономика» и номера группы «19» система сама подставляет в поле «Наименование» строку «ЭК-19». В этой статье мы подробно разберем, как реализовать этот функционал, проанализируем типичные ошибки начинающих и рассмотрим профессиональные подходы к решению задачи.

Разбор основной проблемы: почему переменная не определена?

Типичная ситуация для начинающего программиста — написание кода в модуле формы, который ссылается на реквизиты напрямую, например, Наименование = Специальность + Номер. При попытке выполнить такой код система выдает ошибку «Переменная не определена». Давайте выясним причину этой ситуации.

В современных управляемых формах 1С все данные, с которыми работает форма элемента справочника или документа, обычно сгруппированы в одном основном реквизите формы, который называется Объект. Этот реквизит имеет тип СправочникОбъект. Следовательно, все поля, которые мы видим на экране (код, наименование, специальность, номер), физически являются свойствами этого объекта. Чтобы обратиться к ним из программного кода формы, мы обязательно должны использовать префикс Объект..

Проанализируем правильное обращение к данным:


// Неправильно:
Наименование = Специальность + Номер; 

// Правильно:
Объект.Наименование = Объект.Специальность + Объект.Номер;

Реализация автоматического формирования строки

Согласно условию задачи, наименование должно состоять из двух первых букв специальности в верхнем регистре, тире и номера группы. Для работы со строками в 1С предусмотрен богатый набор функций. Рассмотрим пошагово, как собрать нужную строку.

  1. Извлечение первых букв: Используем функцию Лев(Строка, КоличествоСимволов). Если специальность является ссылкой на другой справочник, нам нужно обратиться к её наименованию через точку: Объект.Специальность.Наименование.
  2. Приведение к верхнему регистру: Для этого идеально подходит функция ВРег().
  3. Очистка пробелов: Чтобы лишние пробелы не испортили результат, применим функцию СокрЛП().
  4. Объединение (конкатенация): Сложим все части с помощью оператора «+».

Рассмотрим пример кода, который решает поставленную задачу:


&НаКлиенте
Процедура СформироватьНаименование()
    
    // Получаем первые 2 буквы специальности
    ТекстСпециальности = СокрЛП(Объект.Специальность); // Если это строка
    // Если Специальность - это ссылка, то нужно получить её наименование (через сервер)
    
    ПервыеБуквы = ВРег(Лев(ТекстСпециальности, 2));
    Объект.Наименование = ПервыеБуквы + "-" + СокрЛП(Объект.Номер);
    
КонецПроцедуры

Работа с событиями формы

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

Разберем, как это выглядит в модуле формы:


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

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

&НаСервере
Процедура ОбновитьНаименованиеНаФорме()
    // Проверяем, заполнены ли данные, чтобы не получить пустые строки
    Если ЗначениеЗаполнено(Объект.Специальность) И ЗначениеЗаполнено(Объект.Номер) Тогда
        // Обращаемся к наименованию ссылки через сервер
        КраткаяСпец = ВРег(Лев(Объект.Специальность.Наименование, 2));
        Объект.Наименование = КраткаяСпец + "-" + Объект.Номер;
    КонецЕсли;
КонецПроцедуры

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

Использование функции СтрШаблон

В современных версиях платформы 1С 8.3 (начиная с 8.3.6) для формирования сложных строк рекомендуется использовать функцию СтрШаблон. Она делает код более читаемым и позволяет избежать путаницы с кавычками и плюсами. Проанализируем ситуацию на примере:


Шаблон = "%1-%2";
КраткоеНазвание = ВРег(Лев(СокрЛП(Объект.Специальность.Наименование), 2));
Объект.Наименование = СтрШаблон(Шаблон, КраткоеНазвание, Объект.Номер);

Здесь %1 и %2 — это маркеры, в которые подставляются соответствующие параметры. Это гораздо удобнее, если формат наименования в будущем изменится (например, добавятся скобки или пробелы).

Обеспечение целостности данных в Модуле Объекта

Рассмотрим ситуацию: данные в справочник могут загружаться не только вручную через форму, но и программно (через импорт из Excel или обмен данными). Код, написанный только в форме, в этом случае не сработает, и наименования останутся пустыми или некорректными.

Чтобы гарантировать правильность наименования всегда, логику формирования следует продублировать или полностью перенести в Модуль объекта справочника в процедуру ПередЗаписью. Это обеспечит автоматическое обновление данных непосредственно перед сохранением в базу данных.

Посмотрим, как выглядит код в модуле объекта:


Процедура ПередЗаписью(Отказ)
    
    // Проверка на заполнение реквизитов перед формированием названия
    Если ЗначениеЗаполнено(Специальность) И ЗначениеЗаполнено(Номер) Тогда
        
        // В модуле объекта префикс "Объект" не нужен!
        НазваниеСпец = Специальность.Наименование;
        КраткаяСпец = ВРег(Лев(СокрЛП(НазваниеСпец), 2));
        
        Наименование = КраткаяСпец + "-" + СокрЛП(Номер);
        
    КонецЕсли;
    
КонецПроцедуры

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

Для создания качественного интерфейса и предотвращения ошибок стоит учесть следующие моменты:

Таким образом, мы выяснили, что автоматизация формирования наименования требует понимания структуры Объект в управляемых формах, использования строковых функций ВРег, Лев и СокрЛП, а также правильного выбора событий для запуска кода. Применение этих правил позволит вам создавать надежные и удобные конфигурации на платформе 1С.

← На главную