Как использовать значения типа «Тип» во временных таблицах при отладке запросов?

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

При отладке сложных механизмов в конфигурациях уровня 1С:ERP Управление предприятием или ЗУП 3.1 разработчики часто сталкиваются с необходимостью перехватить и проанализировать запрос, который выполняется в контексте какого-либо регламентного задания или сложного проведения документа. Одной из самых неприятных проблем в этой ситуации является использование в запросах временных таблиц, содержащих колонки с типом Тип.

Рассмотрим ситуацию подробнее: вы пытаетесь выгрузить содержимое временных таблиц из менеджера временных таблиц в консоль запросов, но при попытке выполнить этот же запрос повторно (или загрузить данные обратно) платформа выдает ошибку. Выясним, почему это происходит и как мы можем обойти это ограничение.

Причина ограничения платформы

Проанализируем техническую природу проблемы. В системе 1С:Предприятие тип данных Тип является специфическим объектом метаданных. В отличие от простых типов, таких как Строка, Число или Дата, он не имеет прямого соответствия в типах данных СУБД (SQL Server, PostgreSQL и др.).

Когда мы передаем одиночный параметр с типом Тип в обычный запрос, платформа успешно обрабатывает его. Однако, как только мы пытаемся использовать метод Загрузить() для помещения таблицы значений во временную таблицу, возникает ошибка. Платформа 1С не умеет выполнять маппинг (сопоставление) колонки Тип из объекта ТаблицаЗначений в физическую таблицу на стороне SQL-сервера. Это фундаментальное ограничение механизма работы с временными таблицами, которое актуально даже для последних релизов платформы 8.3.23 и 8.3.24.

Интересный факт: аналогичное ограничение ранее существовало для типа УникальныйИдентификатор, но, начиная с версии платформы 8.3.12, оно было снято. Для типа Тип пожелание на реализацию функционала записано в реестр 1С, но на данный момент разработчикам приходится использовать обходные пути.

Способ 1: Динамическое формирование текста запроса (UNION ALL)

Рассмотрим первый и самый доступный способ обхода ограничения. Если мы не можем загрузить таблицу целиком через менеджер временных таблиц, мы можем «собрать» её непосредственно в тексте запроса. Этот метод заключается в генерации длинной последовательности операторов ОБЪЕДИНИТЬ ВСЕ, где каждая строка таблицы задается отдельными параметрами.

Разберем, как это выглядит на примере. Предположим, у нас есть список типов, который нам нужно поместить во временную таблицу. Вместо стандартной загрузки, мы формируем следующий текст запроса:


ВЫБРАТЬ &П1 КАК НужныйТип
ПОМЕСТИТЬ ВТ_Типы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ &П2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Типы.НужныйТип
ИЗ
    ВТ_Типы КАК ВТ_Типы

В данном случае параметры &П1 и &П2 будут содержать обычные значения типа Тип (например, Тип("Справочник.Номенклатура")). Поскольку платформа разрешает передачу одиночных параметров этого типа, запрос выполнится успешно.

Важное ограничение: этот метод отлично подходит для небольших таблиц (до нескольких сотен строк). Если таблица содержит тысячи записей, количество параметров и длина текста запроса могут превысить допустимые пределы СУБД, что приведет к падению системы или крайне низкой производительности.

Способ 2: Использование «Инструментария разработчика» (ИР)

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

Механизм работы консоли ИР при обнаружении типа Тип во временной таблице следующий:

  1. Программа анализирует структуру таблицы значений, которую пользователь пытается передать в запрос.
  2. Если обнаруживается колонка с типом Тип, консоль отказывается от стандартного метода МенеджерВременныхТаблиц.Загрузить().
  3. Вместо этого она динамически модифицирует текст запроса, вставляя в начало конструкцию построчного формирования таблицы (как было описано в Способе 1), и автоматически сопоставляет значения ячеек с параметрами запроса.

Для разработчика это выглядит прозрачно: вы просто нажимаете кнопку «Выполнить», и консоль берет на себя всю рутину по «протаскиванию» нетипизированных данных в SQL-контекст. Это практически единственный эффективный способ отладки сложных запросов в ERP, где временные таблицы с типами используются повсеместно (например, при определении правил корреспонденции счетов).

Способ 3: Ручная сериализация в строку или число

Проанализируем ситуацию, когда у нас нет возможности использовать сторонние консоли. В этом случае мы можем прибегнуть к «хаку» с преобразованием типов. Суть метода заключается в том, чтобы передавать в запрос не сам Тип, а его строковое представление или числовой идентификатор.

Шаги реализации:

  1. В исходной ТаблицеЗначений добавим вспомогательную колонку ИмяТипаСтрокой (тип Строка).
  2. Заполним её значениями, используя функцию XMLСтрока() или просто сохраняя имя метаданных.
  3. В самом тексте запроса будем использовать конструкцию ВЫБОР КОГДА для обратного преобразования (если это необходимо для логики сравнения).

Пример логики в запросе:


ВЫБРАТЬ
    ТЗ.Значение,
    ВЫБОР 
        КОГДА ТЗ.ИмяТипаСтрокой = "Справочник.Номенклатура" ТОГДА ТИП(Справочник.Номенклатура)
        КОГДА ТЗ.ИмяТипаСтрокой = "Документ.РеализацияТоваровУслуг" ТОГДА ТИП(Документ.РеализацияТоваровУслуг)
    КОНЕЦ КАК РеальныйТип
ИЗ
    ВТ_ДанныеИзТЗ КАК ТЗ

Хотя этот метод кажется громоздким, он позволяет работать с огромными объемами данных, так как передача строк через временные таблицы не имеет платформенных ограничений. Этот способ часто применяется архитекторами при проектировании высоконагруженных систем, где нужно передавать метаданные в пакетные запросы.

Резюме и рекомендации

Подведем итоги нашего анализа. Проблема использования типа Тип во временных таблицах — это известная особенность платформы 1С, связанная с отсутствием прямого маппинга в СУБД.

Для эффективной работы мы рекомендуем следующий алгоритм выбора решения:

Будем надеяться, что в будущих версиях платформы 1С разработчики реализуют нативную поддержку типа Тип для временных таблиц, как это было сделано для уникальных идентификаторов, что значительно упростит жизнь программистам 1С.

← На главную