Работа с запросами в 1С:Предприятие 8.3 часто требует не только получения данных, но и их удобного представления — особенно когда результат нужно вывести в виде справочника. Типичная задача: вы грузите данные из внешнего источника, формируете временную таблицу или нужно показать пользователю отфильтрованный список в привычном интерфейсе. Вместо того чтобы создавать реальный справочник в базе, можно динамически представить результат запроса как справочник — это экономит ресурсы и упрощает код.
В этой статье разберём три ключевых подхода: использование конструктора запросов с параметром Представление, программное создание виртуального справочника через МенеджерВременныхТаблиц, а также нюансы работы с полями и реквизитами. Особое внимание уделим производительности при больших объёмах данных — почему иногда лучше отказаться от виртуальных справочников в пользу альтернативных решений. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.22 и актуальны для конфигураций на управляемых формах.
Что такое "представление запроса как справочник" и зачем оно нужно
В 1С представление запроса как справочник — это механизм, позволяющий отобразить результат запроса в интерфейсе так, будто это стандартный справочник конфигурации. Пользователь видит знакомую форму со списком, фильтрами и возможностью выбора элементов, хотя на самом деле данные берутся из временной таблицы или внешнего источника.
Основные сценарии применения:
- 📊 Динамические списки — когда нужно показать данные, которые часто меняются (например, курсы валют из внешнего API) без создания реального справочника.
- 🔄 Обмен данными — при импорте из Excel или XML, когда требуется предварительный просмотр перед записью в базу.
- 🔍 Фильтрация — когда пользователю нужно выбрать значение из большого списка, сформированного по сложным критериям (например, "товары с остатками на складе N").
- 🛠️ Отладка — для визуального контроля промежуточных данных в процессе разработки.
Главное преимущество — отсутствие необходимости изменять конфигурацию. Виртуальный справочник создаётся "на лету" и не требует обновления базы. Однако есть и ограничения: такие справочники нельзя использовать в отчётах как источники данных, а при большом объёме строк может падать производительность.
Способ 1: Конструктор запросов с параметром "Представление"
Самый простой способ — использовать встроенный конструктор запросов с настройкой представления результата. Этот метод подходит для быстрого прототипирования или когда нужно показать данные пользователю без глубокой проработки кода.
Алгоритм действий:
- Откройте конструктор запросов в 1С:Предприятие (например, через меню
Файл → Новый → Запрос). - Сформируйте текст запроса. Пример:
ВЫБРАТЬНоменклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ПометкаУдаления = ЛОЖЬ
- В панели свойств запроса найдите параметр
Представление результатаи выберитеКакСправочник. - Укажите
Имя справочника(любое, например,ВиртуальныйСправочникНоменклатуры) иИмя реквизита для отображения(обычноНаименование).
После выполнения запроса результат откроется в форме, аналогичной стандартному справочнику. Пользователь сможет:
- 🔎 Искать по наименованию (если указан реквизит для отображения).
- 📋 Копировать данные в буфер обмена.
- 🖱️ Выбирать элементы двойным кликом (если запрос используется в диалоге выбора).
Если в результате запроса есть поле типа Ссылка, его обязательно нужно включить в выборку — иначе 1С не сможет корректно отобразить элементы как объекты справочника.
Способ 2: Программное создание виртуального справочника через МенеджерВременныхТаблиц
Для более гибкой работы используйте МенеджерВременныхТаблиц. Этот метод позволяет создавать виртуальные справочники прямо в коде, управлять их структурой и связывать с другими объектами.
Пример кода для создания виртуального справочника на основе запроса:
// 1. Создаём временную таблицу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ЭтоГруппа = ЛОЖЬ";
РезультатЗапроса = Запрос.Выполнить();
ВременнаяТаблица = РезультатЗапроса.Выгрузить();
// 2. Регистрируем как виртуальный справочник
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ИмяВременнойТаблицы = "ВиртуальныеКонтрагенты";
МенеджерВременныхТаблиц.Вставить(ИмяВременнойТаблицы, ВременнаяТаблица);
// 3. Создаём описание структуры справочника
ОписаниеСправочника = Новый ОписаниеТипов("СправочникСсылка.ВиртуальныеКонтрагенты");
ОписаниеСправочника.ДобавитьТип("Наименование", Новый ОписаниеТипов("Строка"));
ОписаниеСправочника.ДобавитьТип("ИНН", Новый ОписаниеТипов("Строка"));
// 4. Отображаем справочник в форме
Форма = ПолучаемФормуСправочника(ИмяВременнойТаблицы, ОписаниеСправочника);
Форма.Открыть();
Ключевые моменты:
- 🔹 Имя временной таблицы должно быть уникальным в пределах сеанса.
- 🔹 Для корректного отображения нужно указать
ОписаниеТиповс структурами полей. - 🔹 Виртуальный справочник будет доступен только в текущем сеансе работы.
Как получить форму справочника программно?
Функция ПолучаемФормуСправочника() — это упрощённый пример. В реальной конфигурации нужно использовать метод ПолучитьФорму() с параметрами, например:
Форма = ПолучаемФорму("Справочник.ВиртуальныйСправочник.ФормаСписка", Истина);
Форма.Объект = МенеджерВременныхТаблиц.Получить(ИмяВременнойТаблицы);
Сравнение методов: какой способ выбрать
Выбор между конструктором запросов и программным созданием зависит от задачи. Ниже таблица сравнения ключевых параметров:
| Критерий | Конструктор запросов | МенеджерВременныхТаблиц |
|---|---|---|
| Скорость разработки | ⚡ Быстро (настройка в интерфейсе) | 🐢 Дольше (требуется код) |
| Гибкость | ❌ Ограничена настройками конструктора | ✅ Полный контроль над структурой |
| Производительность | ⚠️ Может тормозить при >1000 строк | ✅ Оптимизируется через индексы |
| Интеграция с формой | ✅ Автоматическая | ⚙️ Требует ручной привязки |
| Поддержка группировки | ❌ Нет | ✅ Да (через иерархию) |
Для разовых задач (например, показать пользователю список для выбора) хватит конструктора. Если нужна сложная логика (фильтрация, связь с другими объектами, динамическое обновление), лучше использовать МенеджерВременныхТаблиц.
Для больших объёмов данных (>5000 строк) виртуальные справочники могут тормозить интерфейс. В таких случаях рассмотрите альтернативы: отчёты с отбором или реальные справочники с периодическим обновлением.
Типичные ошибки и как их избежать
При работе с виртуальными справочниками разработчики часто сталкиваются с типичными проблемами. Вот самые распространённые:
⚠️ Внимание: Если в результате запроса нет поля типаСсылка, 1С не сможет корректно отобразить элементы как объекты справочника. Всегда включайте ссылку на исходный объект (например,Номенклатура.Ссылка).
Другие ошибки:
- 🚫 Неуникальные имена — если имя временной таблицы совпадёт с существующим, данные перезапишутся.
- 🚫 Отсутствие описания типов — без
ОписаниеТиповполя отобразятся как строки, даже если должны быть числами или датами. - 🚫 Игнорирование прав доступа — виртуальный справочник наследует права текущего пользователя. Если у него нет прав на исходные данные, возникнет ошибка.
- 🚫 Чрезмерная вложенность — если в запросе много соединений (
ЛЕВОЕ СОЕДИНЕНИЕ), формирование таблицы займёт много времени.
Пример ошибки с неуникальным именем:
// Плохо: имя таблицы жёстко задано
МенеджерВременныхТаблиц.Вставить("ВременнаяТаблица", Данные);
// Хорошо: добавляем уникальный суффикс
ИмяТаблицы = "ВременнаяТаблица_" + Формат(ТекущаяДата(), "ДМГГммсс");
МенеджерВременныхТаблиц.Вставить(ИмяТаблицы, Данные);
Оптимизация производительности
Виртуальные справочники могут значительно нагружать систему, если не оптимизировать запросы. Основные правила:
- Ограничивайте выборку — используйте
ПЕРВЫЕ 1000или фильтры по дате, если не нужны все данные. - Индексируйте временные таблицы — для больших объёмов создавайте индексы по ключевым полям:
ВременнаяТаблица.Индексы.Добавить("ИндексПоНаименованию", Новый ИндексКоллекции("Наименование")); - Избегайте вложенных запросов — замените их соединениями (
СОЕДИНИТЬ). - Кэшируйте результаты — если данные редко меняются, сохраняйте их в
ХранилищеЗначения.
Пример оптимизированного запроса:
ВЫБРАТЬ ПЕРВЫЕ 500
Товары.Ссылка КАК Ссылка,
Товары.Наименование КАК Наименование,
Товары.Артикул КАК Артикул,
ОстаткиТоваров.КоличествоОстаток КАК Остаток
ИЗ
Справочник.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров
ПО Товары.Ссылка = ОстаткиТоваров.Товар
ГДЕ
ОстаткиТоваров.КоличествоОстаток > 0
И Товары.ПометкаУдаления = ЛОЖЬ
Добавил ПЕРВЫЕ N для ограничения строк|Создал индексы по ключевым полям|Заменил вложенные запросы на соединения|Проверял права доступа текущего пользователя|Кэшировал данные при повторном использовании-->
Альтернативные подходы: когда виртуальный справочник не подходит
Иногда вместо виртуальных справочников лучше использовать другие механизмы 1С:
- 📄 Отчёты с отбором — если нужно только показать данные без возможности выбора.
- 🔄 Реальные справочники с обновлением — для часто используемых данных (например, курсы валют).
- 🖥️ Динамические списки — если требуется сложная фильтрация и группировка.
- 📎 Внешние обработки — для разовых задач (например, миграция данных).
Пример замены виртуального справочника на динамический список:
// В модуле формы
&НаКлиенте
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... "; // Ваш запрос
Результат = Запрос.Выполнить();
ЭлементыФормы.СписокТоваров.Список = Результат.Выгрузить();
КонецПроцедуры
Преимущество динамического списка — нет ограничений на количество строк и можно использовать стандартные элементы управления (ПолеВвода, Кнопка).
FAQ: Ответы на частые вопросы
Можно ли редактировать данные в виртуальном справочнике?
Нет, виртуальный справочник предназначен только для чтения. Для редактирования нужно использовать реальные справочники или формы с привязкой к временным таблицам.
Почему при открытии виртуального справочника вылетает ошибка "Недопустимое значение типа"?
Это происходит, если в ОписаниеТипов указан неверный тип поля. Например, вы объявили поле как Число, а в данных строка. Проверьте соответствие типов в запросе и описании.
Как обновить данные в виртуальном справочнике без перезагрузки формы?
Нужно повторно выполнить запрос, обновить временную таблицу через МенеджерВременныхТаблиц.Обновить() и вызвать Обновить() у формы справочника.
Можно ли использовать виртуальный справочник в мобильном приложении 1С?
Технически да, но производительность будет ниже из-за ограничений мобильной платформы. Рекомендуем тестировать на реальных устройствах.
Как передать параметры в запрос для виртуального справочника?
Используйте конструкцию Запрос.УстановитьПараметр("ИмяПараметра", Значение) перед выполнением. Пример:
Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Дата >= &ДатаНачала";