Как правильно передать значение в запрос к регистру сведений «ДополнительныеСведения»?

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

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

Понимание архитектуры данных

Первое, что нам необходимо осознать — это то, что регистр ДополнительныеСведения использует колонку Значение с типом Характеристика.ДополнительныеРеквизитыИСведения. Это означает, что в одной и той же колонке могут храниться данные абсолютно разных типов: логические (Булево), числа, строки, даты или ссылки на справочники.

Если в настройках свойства в режиме «1С:Предприятие» вы установили тип «Булево» (флажок), то в базе данных это значение сохраняется именно как Истина или Ложь. Попытка сравнить его со строкой «Да» или «Истина» в коде запроса приведет к тому, что условие никогда не выполнится.

Шаг 1: Диагностика типа значения через отладку

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


// Предположим, мы нашли нужную запись
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(ТипЗнч(Выборка.Значение));
    Сообщить(ЗначениеВСтрокуВнутр(Выборка.Значение));
КонецЦикла;

Этот простой шаг позволит вам увидеть истинный тип данных. Если вы увидите что-то вроде {"#",57052928-d6e6-424b-970d-f076c8c83e1e,1}, значит, перед вами логический тип данных, где 1 соответствует Истина, а 0 — Ложь.

Шаг 2: Правильное формирование запроса

Когда мы убедились, что тип значения — Булево, запрос к регистру должен быть максимально прямым и простым. Нам не нужно искать это значение в справочниках или приводить его к строке через ВЫРАЗИТЬ. Мы просто передаем в параметр логический тип 1С.

Давайте посмотрим, как должен выглядеть корректный код:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ДополнительныеСведения.Объект КАК Объект
    |ИЗ
    |   РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
    |ГДЕ
    |   ДополнительныеСведения.Объект = &Объект
    |   И ДополнительныеСведения.Свойство = &Свойство
    |   И ДополнительныеСведения.Значение = &Значение";

Запрос.УстановитьПараметр("Объект", ОбъектСсылка);
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ХХХ_РеестрЛимитовПДО"));
// Передаем логическое значение, а не строку!
Запрос.УстановитьПараметр("Значение", Истина); 

Важные рекомендации при работе со свойствами

  1. Избегайте поиска по наименованию в цикле. Если вы делаете выборку в цикле, поиск свойства методом НайтиПоНаименованию сильно замедлит работу системы. Лучше получить ссылку на свойство заранее, перед выполнением запроса.
  2. Не используйте ВЫРАЗИТЬ без необходимости. Попытки привести значение к Справочник.ЗначенияСвойствОбъектов оправданы только тогда, когда тип свойства — «Дополнительное значение». Для примитивных типов, таких как Булево или Число, это приведет к ошибкам или пустым выборкам.
  3. Используйте функции БСП. В профессиональной разработке рекомендуется обращаться к свойствам через функции общего модуля УправлениеСвойствами. Эти механизмы учитывают особенности конфигурации и кэширование, что делает ваш код более надежным и универсальным.
  4. Будьте внимательны к типам. Если запрос не находит данные, в 90% случаев проблема заключается в несоответствии типов: вы передаете строку там, где ожидается логическое значение, или ссылку на справочник там, где ожидается число.

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

← На главную