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

В этой статье разберём три ключевых подхода: использование конструктора запросов с параметром Представление, программное создание виртуального справочника через МенеджерВременныхТаблиц, а также нюансы работы с полями и реквизитами. Особое внимание уделим производительности при больших объёмах данных — почему иногда лучше отказаться от виртуальных справочников в пользу альтернативных решений. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.22 и актуальны для конфигураций на управляемых формах.

Что такое "представление запроса как справочник" и зачем оно нужно

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

Основные сценарии применения:

  • 📊 Динамические списки — когда нужно показать данные, которые часто меняются (например, курсы валют из внешнего API) без создания реального справочника.
  • 🔄 Обмен данными — при импорте из Excel или XML, когда требуется предварительный просмотр перед записью в базу.
  • 🔍 Фильтрация — когда пользователю нужно выбрать значение из большого списка, сформированного по сложным критериям (например, "товары с остатками на складе N").
  • 🛠️ Отладка — для визуального контроля промежуточных данных в процессе разработки.

Главное преимущество — отсутствие необходимости изменять конфигурацию. Виртуальный справочник создаётся "на лету" и не требует обновления базы. Однако есть и ограничения: такие справочники нельзя использовать в отчётах как источники данных, а при большом объёме строк может падать производительность.

📊 Как часто вы используете виртуальные справочники в 1С?
Постоянно, в большинстве отчётов
Иногда, для специфических задач
Раньше пробовал, но отказался
Никогда не пользовался

Способ 1: Конструктор запросов с параметром "Представление"

Самый простой способ — использовать встроенный конструктор запросов с настройкой представления результата. Этот метод подходит для быстрого прототипирования или когда нужно показать данные пользователю без глубокой проработки кода.

Алгоритм действий:

  1. Откройте конструктор запросов в 1С:Предприятие (например, через меню Файл → Новый → Запрос).
  2. Сформируйте текст запроса. Пример:
    ВЫБРАТЬ
    

    Номенклатура.Ссылка КАК Ссылка,

    Номенклатура.Наименование КАК Наименование,

    Номенклатура.Артикул КАК Артикул

    ИЗ

    Справочник.Номенклатура КАК Номенклатура

    ГДЕ

    Номенклатура.ПометкаУдаления = ЛОЖЬ

  3. В панели свойств запроса найдите параметр Представление результата и выберите КакСправочник.
  4. Укажите Имя справочника (любое, например, ВиртуальныйСправочникНоменклатуры) и Имя реквизита для отображения (обычно Наименование).

После выполнения запроса результат откроется в форме, аналогичной стандартному справочнику. Пользователь сможет:

  • 🔎 Искать по наименованию (если указан реквизит для отображения).
  • 📋 Копировать данные в буфер обмена.
  • 🖱️ Выбирать элементы двойным кликом (если запрос используется в диалоге выбора).
💡

Если в результате запроса есть поле типа Ссылка, его обязательно нужно включить в выборку — иначе 1С не сможет корректно отобразить элементы как объекты справочника.

Способ 2: Программное создание виртуального справочника через МенеджерВременныхТаблиц

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

Пример кода для создания виртуального справочника на основе запроса:

// 1. Создаём временную таблицу

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка,

| Контрагенты.Наименование КАК Наименование,

| Контрагенты.ИНН КАК ИНН

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.ЭтоГруппа = ЛОЖЬ";

РезультатЗапроса = Запрос.Выполнить();

ВременнаяТаблица = РезультатЗапроса.Выгрузить();

// 2. Регистрируем как виртуальный справочник

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

ИмяВременнойТаблицы = "ВиртуальныеКонтрагенты";

МенеджерВременныхТаблиц.Вставить(ИмяВременнойТаблицы, ВременнаяТаблица);

// 3. Создаём описание структуры справочника

ОписаниеСправочника = Новый ОписаниеТипов("СправочникСсылка.ВиртуальныеКонтрагенты");

ОписаниеСправочника.ДобавитьТип("Наименование", Новый ОписаниеТипов("Строка"));

ОписаниеСправочника.ДобавитьТип("ИНН", Новый ОписаниеТипов("Строка"));

// 4. Отображаем справочник в форме

Форма = ПолучаемФормуСправочника(ИмяВременнойТаблицы, ОписаниеСправочника);

Форма.Открыть();

Ключевые моменты:

  • 🔹 Имя временной таблицы должно быть уникальным в пределах сеанса.
  • 🔹 Для корректного отображения нужно указать ОписаниеТипов с структурами полей.
  • 🔹 Виртуальный справочник будет доступен только в текущем сеансе работы.
Как получить форму справочника программно?

Функция ПолучаемФормуСправочника() — это упрощённый пример. В реальной конфигурации нужно использовать метод ПолучитьФорму() с параметрами, например:

Форма = ПолучаемФорму("Справочник.ВиртуальныйСправочник.ФормаСписка", Истина);

Форма.Объект = МенеджерВременныхТаблиц.Получить(ИмяВременнойТаблицы);

Сравнение методов: какой способ выбрать

Выбор между конструктором запросов и программным созданием зависит от задачи. Ниже таблица сравнения ключевых параметров:

Критерий Конструктор запросов МенеджерВременныхТаблиц
Скорость разработки ⚡ Быстро (настройка в интерфейсе) 🐢 Дольше (требуется код)
Гибкость ❌ Ограничена настройками конструктора ✅ Полный контроль над структурой
Производительность ⚠️ Может тормозить при >1000 строк ✅ Оптимизируется через индексы
Интеграция с формой ✅ Автоматическая ⚙️ Требует ручной привязки
Поддержка группировки ❌ Нет ✅ Да (через иерархию)

Для разовых задач (например, показать пользователю список для выбора) хватит конструктора. Если нужна сложная логика (фильтрация, связь с другими объектами, динамическое обновление), лучше использовать МенеджерВременныхТаблиц.

💡

Для больших объёмов данных (>5000 строк) виртуальные справочники могут тормозить интерфейс. В таких случаях рассмотрите альтернативы: отчёты с отбором или реальные справочники с периодическим обновлением.

Типичные ошибки и как их избежать

При работе с виртуальными справочниками разработчики часто сталкиваются с типичными проблемами. Вот самые распространённые:

⚠️ Внимание: Если в результате запроса нет поля типа Ссылка, 1С не сможет корректно отобразить элементы как объекты справочника. Всегда включайте ссылку на исходный объект (например, Номенклатура.Ссылка).

Другие ошибки:

  • 🚫 Неуникальные имена — если имя временной таблицы совпадёт с существующим, данные перезапишутся.
  • 🚫 Отсутствие описания типов — без ОписаниеТипов поля отобразятся как строки, даже если должны быть числами или датами.
  • 🚫 Игнорирование прав доступа — виртуальный справочник наследует права текущего пользователя. Если у него нет прав на исходные данные, возникнет ошибка.
  • 🚫 Чрезмерная вложенность — если в запросе много соединений (ЛЕВОЕ СОЕДИНЕНИЕ), формирование таблицы займёт много времени.

Пример ошибки с неуникальным именем:

// Плохо: имя таблицы жёстко задано

МенеджерВременныхТаблиц.Вставить("ВременнаяТаблица", Данные);

// Хорошо: добавляем уникальный суффикс

ИмяТаблицы = "ВременнаяТаблица_" + Формат(ТекущаяДата(), "ДМГГммсс");

МенеджерВременныхТаблиц.Вставить(ИмяТаблицы, Данные);

Оптимизация производительности

Виртуальные справочники могут значительно нагружать систему, если не оптимизировать запросы. Основные правила:

  1. Ограничивайте выборку — используйте ПЕРВЫЕ 1000 или фильтры по дате, если не нужны все данные.
  2. Индексируйте временные таблицы — для больших объёмов создавайте индексы по ключевым полям:
    ВременнаяТаблица.Индексы.Добавить("ИндексПоНаименованию", Новый ИндексКоллекции("Наименование"));
  3. Избегайте вложенных запросов — замените их соединениями (СОЕДИНИТЬ).
  4. Кэшируйте результаты — если данные редко меняются, сохраняйте их в ХранилищеЗначения.

Пример оптимизированного запроса:

ВЫБРАТЬ ПЕРВЫЕ 500

Товары.Ссылка КАК Ссылка,

Товары.Наименование КАК Наименование,

Товары.Артикул КАК Артикул,

ОстаткиТоваров.КоличествоОстаток КАК Остаток

ИЗ

Справочник.Товары КАК Товары

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров

ПО Товары.Ссылка = ОстаткиТоваров.Товар

ГДЕ

ОстаткиТоваров.КоличествоОстаток > 0

И Товары.ПометкаУдаления = ЛОЖЬ

Добавил ПЕРВЫЕ N для ограничения строк|Создал индексы по ключевым полям|Заменил вложенные запросы на соединения|Проверял права доступа текущего пользователя|Кэшировал данные при повторном использовании-->

Альтернативные подходы: когда виртуальный справочник не подходит

Иногда вместо виртуальных справочников лучше использовать другие механизмы :

  • 📄 Отчёты с отбором — если нужно только показать данные без возможности выбора.
  • 🔄 Реальные справочники с обновлением — для часто используемых данных (например, курсы валют).
  • 🖥️ Динамические списки — если требуется сложная фильтрация и группировка.
  • 📎 Внешние обработки — для разовых задач (например, миграция данных).

Пример замены виртуального справочника на динамический список:

// В модуле формы

&НаКлиенте

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ... "; // Ваш запрос

Результат = Запрос.Выполнить();

ЭлементыФормы.СписокТоваров.Список = Результат.Выгрузить();

КонецПроцедуры

Преимущество динамического списка — нет ограничений на количество строк и можно использовать стандартные элементы управления (ПолеВвода, Кнопка).

FAQ: Ответы на частые вопросы

Можно ли редактировать данные в виртуальном справочнике?

Нет, виртуальный справочник предназначен только для чтения. Для редактирования нужно использовать реальные справочники или формы с привязкой к временным таблицам.

Почему при открытии виртуального справочника вылетает ошибка "Недопустимое значение типа"?

Это происходит, если в ОписаниеТипов указан неверный тип поля. Например, вы объявили поле как Число, а в данных строка. Проверьте соответствие типов в запросе и описании.

Как обновить данные в виртуальном справочнике без перезагрузки формы?

Нужно повторно выполнить запрос, обновить временную таблицу через МенеджерВременныхТаблиц.Обновить() и вызвать Обновить() у формы справочника.

Можно ли использовать виртуальный справочник в мобильном приложении 1С?

Технически да, но производительность будет ниже из-за ограничений мобильной платформы. Рекомендуем тестировать на реальных устройствах.

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

Используйте конструкцию Запрос.УстановитьПараметр("ИмяПараметра", Значение) перед выполнением. Пример:

Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));

Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Дата >= &ДатаНачала";