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