Как реализовать автоматическую подстановку базовой единицы измерения в справочнике Номенклатура?

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

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

Способ 1: Использование свойств формы «Путь к данным» (без программирования)

Если вы работаете на управляемых формах (платформа 8.3), наиболее эффективным и «чистым» способом будет использование механизма расширения реквизитов через точку. Рассмотрим этот процесс по шагам:

  1. Откройте конфигуратор и перейдите к форме элемента справочника Номенклатура.
  2. В правой части окна редактора формы найдите дерево реквизитов. Разверните основной реквизит Объект.
  3. Найдите в списке реквизит БазоваяЕдиница (он должен иметь тип СправочникСсылка.ЕдиницыИзмерения).
  4. Нажмите на «плюс» слева от БазоваяЕдиница. Система покажет вам все доступные поля связанного справочника.
  5. Найдите поле Наименование и просто перетащите его мышкой в левую часть окна — в дерево элементов формы.

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

Способ 2: Программное заполнение в обработчике «ПриЧтенииНаСервере»

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

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

Разберем пример кода для этого метода:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Устанавливаем заголовок для декорации или текст строкового реквизита
    Если ЗначениеЗаполнено(ТекущийОбъект.БазоваяЕдиница) Тогда
        Элементы.НадписьБазоваяЕдиница.Заголовок = Строка(ТекущийОбъект.БазоваяЕдиница);
    КонецЕсли;
КонецПроцедуры

В данном примере НадписьБазоваяЕдиница — это имя элемента формы (декорации типа «Надпись»). Использование функции Строка() позволяет быстро получить наименование ссылки без лишних обращений к свойствам через точку.

Способ 3: Динамическое обновление при изменении реквизита

Проанализируем ситуацию, когда пользователь меняет значение базовой единицы непосредственно в процессе редактирования карточки. Если мы использовали первый способ (путь к данным), поле обновится автоматически. Однако, если мы используем программный вывод, нам необходимо создать обработчик события ПриИзменении для поля выбора единицы измерения.

Выполним следующие действия:

  1. Выберите на форме поле, где пользователь выбирает базовую единицу.
  2. В палитре свойств создайте обработчик события ПриИзменении.
  3. Напишите код, который будет обновлять вашу надпись.

&НаКлиенте
Процедура БазоваяЕдиницаПриИзменении(Элемент)
    // Обновляем текст надписи на форме при смене значения
    Если ЗначениеЗаполнено(Объект.БазоваяЕдиница) Тогда
        // Обращаемся к серверной функции для получения наименования
        Элементы.НадписьБазоваяЕдиница.Заголовок = ПолучитьНаименованиеЕдиницы(Объект.БазоваяЕдиница);
    Иначе
        Элементы.НадписьБазоваяЕдиница.Заголовок = "Единица не выбрана";
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьНаименованиеЕдиницы(СсылкаЕдиница)
    Возврат СсылкаЕдиница.Наименование;
КонецФункции

Обратите внимание на использование &НаСервереБезКонтекста. Это позволяет максимально быстро получить данные из базы, не передавая на сервер всю тяжелую форму.

Способ 4: Оптимизация получения данных через «ОбщегоНазначения»

В типовых конфигурациях (УТ 11, ERP, БП 3.0) существует специальный механизм для эффективного получения реквизитов. Вместо того чтобы обращаться к объекту через точку (что порождает неявный запрос ко всем полям таблицы), рекомендуется использовать функции общего модуля.

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


&НаСервере
Процедура ОбновитьПредставлениеЕдиницы()
    НаименованиеЕдиницы = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.БазоваяЕдиница, "Наименование");
    Элементы.НадписьБазоваяЕдиница.Заголовок = ?(НаименованиеЕдиницы = Неопределено, "", НаименованиеЕдиницы);
КонецПроцедуры

Этот метод считается наиболее профессиональным, так как он кэширует результаты и работает быстрее при больших объемах данных.

Важные замечания по логике учета

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

Рекомендации по реализации логики:

Особенности реализации для «Обычных форм»

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

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

← На главную