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

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_ВыборкаСвойств_ОбъектыИСведения.Объект";

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

 

-----

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

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

См. также

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

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

15500 руб.

02.09.2020    203685    1120    410    

1024

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

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

8400 руб.

20.08.2024    36029    208    104    

197

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

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

16000 руб.

10.11.2023    16587    71    39    

89

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 руб.

06.10.2023    24139    63    28    

92

Инструментарий разработчика Программист 1С v8.3 Платные (руб)

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

9360 руб.

17.05.2024    34890    124    53    

166

SALE! 30%

Инструментарий разработчика WEB-интеграция 1С v8.3 1C v8.2 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Инструмент для генерации OpenApi (Swagger) спецификаций на основании файлов конфигураций 1С. Это консольное и десктопное приложение на языке Rust с полноценным редактором кода, содержащим автозамену и подсвечивание ошибок для быстрого и безошибочного написания документирующего комментария.

18000 12600 руб.

22.11.2024    1866    1    0    

8

Инструментарий разработчика Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

6000 руб.

07.02.2018    107382    249    100    

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