Программная таблица в запросе

25.06.25

Разработка - Инструментарий разработчика

Есть временная, есть виртуальная таблицы. А что такое программная?

Друзья, давайте разбираться! 

Обычно документы или объекты в системе существуют взаимосвязанно, они могут менять состояния друг друга и растянуты во времени. Ничего сложного, добавляем периодический регистр сведений, подчиненный регистратору, называем "История состояний документов" и спокойно понимаем: кто, когда и что изменил.

Все хорошо ровно до тех пор, пока не появляется еще один ресурс, который могут заполнять не все регистраторы. Но мы молодцы, вовремя реагируем и данный ресурс выносим в отдельный регистр сведений "История заказов".

И снова все хорошо, и так продолжается бесконечно. Растет количество однотипных регистров и растет количество ресурсов в них. 


А что если:

1. Создать 1 регистр сведений: 2 измерения ("Свойство", "Объект"), 1 ресурс ("Значение")

2. Проиндексировать все поля для максимального легкого попадания в индекс при поиске

 


Классно, но использование данного регистра в запросах максимально не дружелюбно, это будет так:

// Пример 1
///////////

"ВЫБРАТЬ
|	Валюты.Ссылка КАК Ссылка,
|	Валюты.Код КАК Код,
|	СведенияОбъектов_Страна.Значение КАК Страна,
|	СведенияОбъектов_Город.Значение КАК Город
|ИЗ
|	Справочник.Валюты КАК Валюты
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОбъектов.СрезПоследних КАК СведенияОбъектов_Страна
|		ПО Валюты.Ссылка = СведенияОбъектов_Страна.Объект
|			И (СведенияОбъектов_Страна.Свойство = ""Страна"")
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОбъектов.СрезПоследних КАК СведенияОбъектов_Город
|		ПО Валюты.Ссылка = СведенияОбъектов_Город.Объект
|			И (СведенияОбъектов_Город.Свойство = ""Город"")";

Или так:

// Пример 2
///////////

"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	Валюты.Ссылка КАК Ссылка,
|	Валюты.Код КАК Код
|ПОМЕСТИТЬ Валюты
|ИЗ
|	Справочник.Валюты КАК Валюты
|
|ИНДЕКСИРОВАТЬ ПО
|	Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	СведенияОбъектов.Период КАК Период,
|	СведенияОбъектов.Объект КАК Объект,
|	СведенияОбъектов.Свойство КАК Свойство,
|	СведенияОбъектов.Значение КАК Значение
|ПОМЕСТИТЬ СведенияОбъектов
|ИЗ
|	РегистрСведений.СведенияОбъектов.СрезПоследних(
|			,
|			Объект В
|				(ВЫБРАТЬ
|					ВладельцыСвойств.Ссылка КАК Ссылка
|				ИЗ
|					Валюты КАК ВладельцыСвойств)) КАК СведенияОбъектов
|ГДЕ
|	СведенияОбъектов.Свойство В (""Страна"", ""Город"")
|
|ИНДЕКСИРОВАТЬ ПО
|	Объект
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	Валюты.Ссылка КАК Ссылка,
|	Валюты.Код КАК Код,
|	СведенияОбъектов_Страна.Значение КАК Страна,
|	СведенияОбъектов_Город.Значение КАК Город
|ИЗ
|	Валюты КАК Валюты
|		ЛЕВОЕ СОЕДИНЕНИЕ СведенияОбъектов КАК СведенияОбъектов_Страна
|		ПО Валюты.Ссылка = СведенияОбъектов_Страна.Объект
|			И (СведенияОбъектов_Страна.Свойство = ""Страна"")
|		ЛЕВОЕ СОЕДИНЕНИЕ СведенияОбъектов КАК СведенияОбъектов_Город
|		ПО Валюты.Ссылка = СведенияОбъектов_Город.Объект
|			И (СведенияОбъектов_Город.Свойство = ""Город"")";

А можно использовать программные таблицы реализованные в Редакторе запросов, и будет так:

// Пример 3
///////////

"ВЫБРАТЬ
|	Валюты.Ссылка КАК Ссылка,
|	Валюты.Код КАК Код,
|	СведенияОбъектов.Страна КАК Страна,
|	СведенияОбъектов.Город КАК Город
|ИЗ
|	Справочник.Валюты КАК Валюты
|		ЛЕВОЕ СОЕДИНЕНИЕ ПрограммнаяТаблицаСведенияОбъектовСрезПоследних КАК СведенияОбъектов
|		ПО Валюты.Ссылка = СведенияОбъектов.Объект";

Программные таблицы - это временные таблицы со служебным именем заданным в тексте запроса, которые Редактор запросов находит и модифицирует через редактирование схемы запроса, реализуя выборку сведений, применяя подходы, описанные в примере 1 и 2. Использование данной программной таблицы ничем не отличается от работы с обычной временной таблицей и не ограничивает редактирование текста запроса конструктором запросов. 

Программная таблица "Сведения объектов" поддерживает:

  • Фильтрацию - для этого необходимо использовать "ВНУТРЕННЕЕ СОЕДИНЕНИЕ", тогда будет реализован подход из примера 1
  • Выборка значений - для этого необходимо использовать "ЛЕВОЕ СОЕДИНЕНИЕ", тогда будет реализован подход из примера 2 
  • СрезПервых, СрезПоследних на дату, для этого нужно установить отбор по программному полю "СрезНаДату"
  • Получение значений свойств из разных ресурсов, т.е. каждое свойство может хранить свое значение в разных ресурсах. Здесь необходимо выполнить сопоставление свойства и ресурса в экспортной функции "СвойствоЗначениеКлючПолучить(Свойство)" в менеджере соответсвующего регистра сведений.
  • Использование множественных физических таблиц, т.е. связь с физической таблицей определяется по имени программной таблицы. "ПрограммнаяТаблица[СведенияОбъектов]СрезПоследних" связана с регистром сведений "СведенияОбъектов", а "ПрограммнаяТаблица[СведенияЗаказов]СрезПоследних" связана уже с регистром сведений "СведенияЗаказов".

Наиболее полный пример:

ЗапросТекст = 
	"ВЫБРАТЬ
	|	Валюты.Ссылка КАК Ссылка,
	|	СведенияОбъектов.Регион КАК Регион,
	|	СведенияОбъектов.Город КАК Город
	|ИЗ
	|	Справочник.Валюты КАК Валюты
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрограммнаяТаблицаСведенияОбъектовСрезПервых КАК СведенияОбъектовФильтр
	|		ПО Валюты.Ссылка = СведенияОбъектовФильтр.Объект
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПрограммнаяТаблицаСведенияОбъектовСрезПоследних КАК СведенияОбъектов
	|		ПО Валюты.Ссылка = СведенияОбъектов.Объект
	|ГДЕ
	|	СведенияОбъектовФильтр.СрезНаДату = &СрезНаДату
	|	И СведенияОбъектовФильтр.Страна = &Страна
	|	И СведенияОбъектов.СрезНаДату = &СрезНаДату";

Запрос = Новый Запрос(ЗапросТекст);
Запрос.Параметры.Вставить("СрезНаДату"	, ТекущаяДатаСеанса());
Запрос.Параметры.Вставить("Страна"		, Неопределено);

РедакторЗапроса = Обработки.сп_РедакторЗапросов.Инициализировать(Запрос);

Выборка = РедакторЗапроса.СкомпоноватьИВыбрать();
Пока Выборка.Следующий() Цикл

КонецЦикла;

На момент выполнения запроса текст запроса приобретет вид:

"ВЫБРАТЬ
|	Валюты.Ссылка КАК Ссылка,
|	Валюты.Код КАК Код
|ПОМЕСТИТЬ БазовыйЗапрос_1_ВыборкаСвойств
|ИЗ
|	Справочник.Валюты КАК Валюты
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОбъектов.СрезПервых(&СрезНаДату, ) КАК СведенияОбъектовФильтр_Страна
|		ПО Валюты.Ссылка = СведенияОбъектовФильтр_Страна.Объект
|ГДЕ
|	СведенияОбъектовФильтр_Страна.ЗначениеСсылка = &Страна
|
|ИНДЕКСИРОВАТЬ ПО
|	Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	СведенияОбъектов.Период КАК Период,
|	СведенияОбъектов.Объект КАК Объект,
|	СведенияОбъектов.Свойство КАК Свойство,
|	СведенияОбъектов.ЗначениеСсылка КАК ЗначениеСсылка,
|	СведенияОбъектов.ЗначениеЧисло КАК ЗначениеЧисло,
|	СведенияОбъектов.ЗначениеСтрока КАК ЗначениеСтрока,
|	СведенияОбъектов.ЗначениеДата КАК ЗначениеДата,
|	СведенияОбъектов.ЗначениеБулево КАК ЗначениеБулево
|ПОМЕСТИТЬ БазовыйЗапрос_1_ВыборкаСвойств_Сведения
|ИЗ
|	РегистрСведений.СведенияОбъектов.СрезПоследних(
|			&СрезНаДату,
|			Объект В
|				(ВЫБРАТЬ
|					ВладельцыСвойств.Ссылка КАК Ссылка
|				ИЗ
|					БазовыйЗапрос_1_ВыборкаСвойств КАК ВладельцыСвойств)) КАК СведенияОбъектов
|ГДЕ
|	СведенияОбъектов.Свойство В(&Свойство_1)
|
|ИНДЕКСИРОВАТЬ ПО
|	Объект
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
|	СведенияТаблица.Объект КАК Объект
|ПОМЕСТИТЬ БазовыйЗапрос_1_ВыборкаСвойств_Объекты
|ИЗ
|	БазовыйЗапрос_1_ВыборкаСвойств_Сведения КАК СведенияТаблица
|
|ИНДЕКСИРОВАТЬ ПО
|	Объект
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	ОбъектыТаблица.Объект КАК Объект,
|	БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Регион.ЗначениеСсылка КАК Регион,
|	БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Город.ЗначениеСтрока КАК Город
|ПОМЕСТИТЬ БазовыйЗапрос_1_ВыборкаСвойств_ОбъектыИСведения
|ИЗ
|	БазовыйЗапрос_1_ВыборкаСвойств_Объекты КАК ОбъектыТаблица
|		ЛЕВОЕ СОЕДИНЕНИЕ БазовыйЗапрос_1_ВыборкаСвойств_Сведения КАК БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Регион
|		ПО ОбъектыТаблица.Объект = БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Регион.Объект
|			И (БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Регион.Свойство = ""Регион"")
|		ЛЕВОЕ СОЕДИНЕНИЕ БазовыйЗапрос_1_ВыборкаСвойств_Сведения КАК БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Город
|		ПО ОбъектыТаблица.Объект = БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Город.Объект
|			И (БазовыйЗапрос_1_ВыборкаСвойств_Сведения_Город.Свойство = ""Город"")
|
|ИНДЕКСИРОВАТЬ ПО
|	Объект
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	БазовыйЗапрос_1_ВыборкаСвойств.Ссылка КАК Ссылка,
|	БазовыйЗапрос_1_ВыборкаСвойств.Код КАК Код,
|	БазовыйЗапрос_1_ВыборкаСвойств_ОбъектыИСведения.Регион КАК Регион,
|	БазовыйЗапрос_1_ВыборкаСвойств_ОбъектыИСведения.Город КАК Город
|ИЗ
|	БазовыйЗапрос_1_ВыборкаСвойств КАК БазовыйЗапрос_1_ВыборкаСвойств
|		ЛЕВОЕ СОЕДИНЕНИЕ БазовыйЗапрос_1_ВыборкаСвойств_ОбъектыИСведения КАК БазовыйЗапрос_1_ВыборкаСвойств_ОбъектыИСведения
|		ПО БазовыйЗапрос_1_ВыборкаСвойств.Ссылка = БазовыйЗапрос_1_ВыборкаСвойств_ОбъектыИСведения.Объект";

Как видите, все просто, Редактор запросов в помощь!

 

-----

Ссылки:
- Обработка на Инфостарт

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.

24900 руб.

20.08.2024    73833    377    170    

321

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    265989    1482    421    

1177

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    61761    127    36    

136

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26

22570 руб.

06.10.2023    39637    111    48    

125

Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Программист Бизнес-аналитик Руководитель проекта 1С 8.3 Платные (руб)

Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.

14000 руб.

17.04.2026    7886    33    45    

49

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

17000 руб.

10.11.2023    26145    97    46    

104

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

6000 руб.

25.02.2026    4565    16    1    

20

Информационная безопасность Инструменты администратора БД Инструментарий разработчика Учет документов Системный администратор Программист Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта 1С 8.3 1С 8.5 Розничная и сетевая торговля (FMCG) Платные (руб)

Контроль ввода данных в 1С: проверка заполнения реквизитов, обязательные поля, контроль перед записью и проведением, запрет проведения документа. Позволяет настраивать любые проверки данных в 1С 8.3/8.5 от обязательных полей до сложных условий – без открытия конфигуратора и написания кода. Готовое расширение, которое подключается и работает сразу.

6000 руб.

15.04.2026    2391    6    0    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1104 25.06.25 12:12 Сейчас в теме
на таком велосипеде надо ехать в фирму 1с )
2. ixijixi 2156 25.06.25 12:22 Сейчас в теме
(1) Там уже ЗУПеры обосновались со своим механизмом представлений )
Для отправки сообщения требуется регистрация/авторизация