Как сопоставить строковое поле регистра с числовым полем справочника в запросе 1С?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

Почему не получается связать поля напрямую?

Язык запросов 1С спроектирован так, чтобы обеспечить максимальную производительность и целостность данных. Операции сравнения, такие как =, В или ПОДОБНО, требуют совместимости типов. Попытка сравнить Строка и Число приведет к ошибке выполнения. Использование оператора ПОДОБНО также не является панацеей, так как он предназначен исключительно для строковых выражений и не выполняет автоматического приведения типов.

Решение через механизмы СКД: пошаговое руководство

Оптимальным подходом в данной ситуации является использование Наборов данных в СКД. Этот метод позволяет нам логически связать две разные таблицы, даже если их типы данных изначально не совпадают.

  1. Создание наборов данных: В схеме компоновки данных создадим два набора данных:
    • Набор данных «Регистр»: запрос к РегистрСведений.Поступления платежей, из которого мы получаем наш «Код дохода» (тип Строка).
    • Набор данных «Справочник»: запрос к Справочник.Коды доходов, из которого мы выбираем ссылку и числовой код.
  2. Настройка связей наборов данных: Перейдем на вкладку «Связи наборов данных». Здесь нам нужно определить правило, по которому СКД будет соединять записи.

    Чтобы привести Число к Строка для корректного сравнения, мы воспользуемся функцией ФОРМАТ. Настроим выражение связи следующим образом:

    
    // Выражение для связи
    ФОРМАТ(Справочник.Код, "ЧГ=")
    

    Этот параметр ЧГ= указывает системе, что число нужно преобразовать в строку без использования разделителей групп разрядов (пробелов), что является критически важным для точного соответствия строковому значению из регистра.

  3. Фильтрация и параметры: Теперь, когда связь установлена, СКД будет автоматически фильтровать данные регистра при выборе пользователем кода из справочника на форме отчета.

Решение задачи с учетом разницы в структуре (коды с префиксом)

Часто в бюджетных классификаторах возникают ситуации, когда одна строка длиннее другой (например, добавлена информация об администраторе). Если вам нужно сопоставить часть строки, используйте встроенную функцию ПОДСТРОКА:


// В выражении связи наборов данных:
ПОДСТРОКА(Регистр.КодДохода, 4, 10) 
// Это позволит отсечь лишние символы и сравнить оставшуюся часть 
// с кодом из справочника.

Рекомендация по архитектуре данных

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

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

← На главную