При работе с механизмом дополнительных реквизитов и сведений в 1С часто возникает путаница, связанная с тем, как именно хранятся данные в базе. Рассмотрим типичную ситуацию: вы пытаетесь отфильтровать записи в запросе к регистру ДополнительныеСведения, используя логическое условие «Да» (Истина), но запрос не возвращает никаких данных. Давайте разберем, почему так происходит и как научиться правильно работать с этим регистром.
Первое, что нам необходимо осознать — это то, что регистр ДополнительныеСведения использует колонку Значение с типом Характеристика.ДополнительныеРеквизитыИСведения. Это означает, что в одной и той же колонке могут храниться данные абсолютно разных типов: логические (Булево), числа, строки, даты или ссылки на справочники.
Если в настройках свойства в режиме «1С:Предприятие» вы установили тип «Булево» (флажок), то в базе данных это значение сохраняется именно как Истина или Ложь. Попытка сравнить его со строкой «Да» или «Истина» в коде запроса приведет к тому, что условие никогда не выполнится.
Прежде чем писать запрос, давайте научимся «видеть», что именно находится в регистре. Чтобы не гадать, мы можем воспользоваться методом ЗначениеВСтрокуВнутр(). Создайте временную обработку и выполните следующий код, чтобы вывести тип данных в окно сообщений:
// Предположим, мы нашли нужную запись
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(ТипЗнч(Выборка.Значение));
Сообщить(ЗначениеВСтрокуВнутр(Выборка.Значение));
КонецЦикла;
Этот простой шаг позволит вам увидеть истинный тип данных. Если вы увидите что-то вроде {"#",57052928-d6e6-424b-970d-f076c8c83e1e,1}, значит, перед вами логический тип данных, где 1 соответствует Истина, а 0 — Ложь.
Когда мы убедились, что тип значения — Булево, запрос к регистру должен быть максимально прямым и простым. Нам не нужно искать это значение в справочниках или приводить его к строке через ВЫРАЗИТЬ. Мы просто передаем в параметр логический тип 1С.
Давайте посмотрим, как должен выглядеть корректный код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Объект
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект
| И ДополнительныеСведения.Свойство = &Свойство
| И ДополнительныеСведения.Значение = &Значение";
Запрос.УстановитьПараметр("Объект", ОбъектСсылка);
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ХХХ_РеестрЛимитовПДО"));
// Передаем логическое значение, а не строку!
Запрос.УстановитьПараметр("Значение", Истина);
НайтиПоНаименованию сильно замедлит работу системы. Лучше получить ссылку на свойство заранее, перед выполнением запроса.ВЫРАЗИТЬ без необходимости. Попытки привести значение к Справочник.ЗначенияСвойствОбъектов оправданы только тогда, когда тип свойства — «Дополнительное значение». Для примитивных типов, таких как Булево или Число, это приведет к ошибкам или пустым выборкам.УправлениеСвойствами. Эти механизмы учитывают особенности конфигурации и кэширование, что делает ваш код более надежным и универсальным.Теперь, когда мы проанализировали структуру регистра и способы диагностики, вы можете легко интегрировать этот механизм в свои задачи, избегая классических ошибок новичка.