Как правильно добавить предопределенный элемент справочника в поле выражения СКД?

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

При работе с Системой Компоновки Данных (СКД) мы часто сталкиваемся с необходимостью использовать в отчетах ссылки на конкретные элементы справочников или перечислений. Особенно это актуально, когда нам нужно отфильтровать данные или вычислить какое-либо значение на основе предопределенных элементов. Давайте вместе разберем, как эффективно решать эту задачу, избегая распространенных ошибок и используя лучшие практики.

Понимание предопределенных элементов в 1С

Прежде чем мы перейдем к работе с СКД, давайте выясним, что такое предопределенные элементы в 1С и почему они так важны.

  1. Что это такое? Предопределенные элементы – это особые элементы справочников, планов видов характеристик, планов счетов или планов видов расчета, которые создаются разработчиком в конфигураторе. Они предназначены для постоянного обращения к ним из программного кода или выражений запросов.
  2. Имя против Наименования:
    • Каждый предопределенный элемент имеет свое уникальное внутреннее Имя, которое задается разработчиком в конфигураторе. Это Имя должно соответствовать правилам именования объектов метаданных (без пробелов, специальных символов, кроме подчеркивания). Именно по этому Имени мы будем обращаться к элементу из кода или СКД.
    • Пользователи же видят Наименование элемента, которое может содержать пробелы и другие символы, быть изменено в пользовательском режиме. Важно помнить: функция ЗНАЧЕНИЕ() и прямое обращение к предопределенному элементу всегда используют его внутреннее Имя, а не пользовательское Наименование.
  3. Как найти предопределенный элемент в конфигураторе? Чтобы посмотреть внутреннее Имя предопределенного элемента, откройте конфигуратор, найдите нужный справочник (или другой объект метаданных), нажмите на нем правой кнопкой мыши и выберите пункт "Предопределенные". Мы увидим список всех предопределенных элементов с их Именем и Наименованием.
  4. Визуальное отличие: В пользовательском режиме предопределенные элементы часто отличаются золотистой точкой в иконке элемента, что помогает визуально их идентифицировать.
  5. Надежность: Обращение к предопределенным элементам по их внутреннему Имени является наиболее надежным способом, так как Код или Наименование могут быть изменены пользователем, что может привести к неработоспособности алгоритмов, использующих НайтиПоКоду() или НайтиПоНаименованию().

Использование функции ЗНАЧЕНИЕ() в запросах СКД

Функция ЗНАЧЕНИЕ() – это основной инструмент для получения ссылки на предопределенный элемент в языке запросов 1С, который активно используется в СКД.

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

Ключевое ограничение: Функция ЗНАЧЕНИЕ() работает только с предопределенными элементами. Если вы попытаетесь использовать ее с обычным элементом справочника, который не является предопределенным, вы получите ошибку.

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

Давайте посмотрим на пример: Предположим, у нас есть предопределенный элемент справочника "РазрядыКатегории" с внутренним Именем "РуководительСтруктурногоПодразделения1КУ" и Наименованием "Руков структ подр 1 КУ". Если мы хотим сравнить поле отчета с этим предопределенным элементом, мы напишем следующее выражение:


РазрядКатегория = ЗНАЧЕНИЕ(Справочник.РазрядыКатегории.РуководительСтруктурногоПодразделения1КУ)

В этом примере РазрядКатегория – это поле нашего набора данных, которое ссылается на элемент справочника "РазрядыКатегории". Мы сравниваем его со ссылкой на предопределенный элемент, полученной с помощью ЗНАЧЕНИЕ().

Альтернативные подходы к сравнению элементов

Что делать, если элемент не является предопределенным или нам нужна более гибкая логика сравнения? Рассмотрим другие варианты.

Сравнение по наименованию или коду

Если элемент, с которым мы хотим сравнить, не является предопределенным, или если нам нужно реализовать более сложную логику, мы можем использовать сравнение по Наименованию или Коду элемента справочника.

Пример: Предположим, мы хотим выделить элементы, Наименование которых равно "Руков структ подр 1 КУ". Мы можем написать такое выражение:


РазрядКатегория.Наименование = "Руков структ подр 1 КУ"

Недостатки этого подхода: Мы должны помнить, что сравнение по Наименованию или Коду менее надежно, чем по ссылке на предопределенный элемент. Пользователь может изменить Код или Наименование элемента в режиме предприятия, что приведет к некорректной работе нашего отчета. Поэтому этот метод лучше использовать, когда альтернативы нет, или когда мы уверены, что Наименование/Код не будут меняться.

Для реализации условной логики непосредственно в запросе СКД или в вычисляемых полях мы можем использовать конструкцию ВЫБОР КОГДА ТОГДА КОНЕЦ. Это аналог оператора Если...Тогда...Иначе.

Давайте посмотрим на пример:


ВЫБОР КОГДА РазрядКатегория.Наименование = "Руков структ подр 1 КУ" ТОГДА "Руководитель"
ИНАЧЕ "Другой"
КОНЕЦ

В этом случае мы создаем вычисляемое поле, которое будет принимать значение "Руководитель", если Наименование категории совпадает, и "Другой" в противном случае. Условия в ВЫБОР КОГДА проверяются последовательно, и как только одно из них выполняется, проверка прекращается.

Обращение через точку (неявные соединения)

Часто возникает дискуссия о том, стоит ли использовать обращение через точку к полям связанных объектов (например, РазрядКатегория.Наименование) непосредственно в запросах СКД. Некоторые разработчики опасаются "неявных левых соединений", которые могут возникать при таком подходе и потенциально влиять на производительность.

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

Когда это уместно?

  1. Читабельность: Код становится намного понятнее, когда мы напрямую обращаемся к Наименованию связанного объекта, вместо того чтобы городить сложные конструкции с явными соединениями, когда это не требуется.
  2. Объем данных: Если справочник, к которому мы обращаемся, невелик, влияние неявного соединения на производительность будет минимальным.
  3. Разовые отчеты: Для отчетов, которые выполняются нечасто или не критичны к микросекундам производительности, такой подход значительно экономит время разработки.

Таким образом, не стоит бояться использовать обращение через точку, если это не приводит к очевидным проблемам с производительностью на больших объемах данных. Оно делает наши выражения более лаконичными и понятными.

Общие рекомендации и лучшие практики

Подведем итоги и сформулируем несколько рекомендаций, которые помогут вам эффективно работать с элементами справочников в СКД:

  1. Используйте ЗНАЧЕНИЕ() для предопределенных элементов: Это наиболее надежный и производительный способ обращения к предопределенным элементам. Всегда используйте внутреннее Имя элемента из конфигуратора.
  2. Избегайте сравнения по Наименованию/Коду для критичных алгоритмов: Если есть возможность, старайтесь не полагаться на Наименование или Код для идентификации элементов, так как они могут быть изменены пользователем. Если это единственный вариант, убедитесь, что изменения этих полей маловероятны или предусмотрены механизмы обновления логики.
  3. Не бойтесь обращения через точку: Для доступа к полям связанных объектов в запросах и выражениях СКД, особенно для небольших справочников, смело используйте точку. Это улучшит читабельность вашего кода и упростит разработку.
  4. Используйте ВЫБОР КОГДА ТОГДА КОНЕЦ для условной логики: Эта конструкция очень мощна и позволяет реализовывать сложную логику прямо в выражениях СКД, создавая гибкие вычисляемые поля.

Надеемся, что этот подробный разбор поможет вам уверенно работать с предопределенными и обычными элементами справочников в СКД, создавая надежные и эффективные отчеты.

← К списку