Умножение матриц пакетным запросом

Публикация № 195848 29.07.13

Разработка - Запросы

Функция для умножения матриц, заданных ТаблицамиЗначений. Все вычисления в одном пакетном запросе.

Разместите в теле модуля нижеприведенные функции.

Предварительно подготовьте две числовые мартрицы с типом значения ТаблицаЗначений  (условно А и В). Либо программно, либо на форме с помощью элементов управления ТабличноеПоле.  Имена колонок могут быть любыми. Размерности таблиц должны удовлетворять условию  А(n x m) , В(m x k).

Осуществите вызов функции ПроизведениеМатриц(А, Б).
В результате будет получена таблица произведения двух  матриц С(n x k). Результат можно загрузить в ТабличноеПоле, как и показано на рисунке.

 

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

Функция ПодготовитьИсходнуюТаблицу(ТЗ, Литера)

    ИсходнаяТ = ТЗ.Скопировать();	
	ш = 1;
	Для каждого Колонка Из ИсходнаяТ.Колонки Цикл Колонка.Имя = "elem" + ш;	ш = ш + 1; КонецЦикла;
	ИсходнаяТ.Колонки.Добавить("i", Новый ОписаниеТипов("Число", , ,Новый КвалификаторыЧисла(12,0)));
	ш = 1;
	Для каждого Стр Из ИсходнаяТ Цикл Стр.i = ш; ш = ш + 1;	КонецЦикла;

	Возврат ИсходнаяТ
	
КонецФункции

Функция ПолучитьЗапросДекомпозиция(м, Литера)

	ЗапросДекомпозиция = "//";
	Для ш = 1 По м Цикл
		
		ЗапросДекомпозиция = ЗапросДекомпозиция +  " Объединить все 
		|ВЫБРАТЬ Таб.i как i, "+ш+"  как j, Таб.elem"+ш+" как elem 
		|"+?(ш=1, "Поместить Таб", "")+"
		| ИЗ Исходная"+Литера+" КАК Таб
		|";
	
	КонецЦикла;
	
	ЗапросДекомпозиция = СтрЗаменить(ЗапросДекомпозиция, "Таб", "Таб"+Литера);
	ЗапросДекомпозиция = СтрЗаменить(ЗапросДекомпозиция, "// Объединить все", "") +";";
	
	Возврат ЗапросДекомпозиция

КонецФункции // ()

Функция ПолучитьЗапросКомпозиция(м)

	ЗапросКомпозицияСоединения = ""; ЗапросКомпозицияПоля = "";	ЗапросКомпозиция = "";
	ЗапросНумерацияСтрок = "Выбрать ИсходнаяА.i Поместить НумерацияСтрок Из ИсходнаяА как ИсходнаяА;";
	Для ш = 1 По м Цикл
		ЗапросКомпозицияПоля = ЗапросКомпозицияПоля + ", РезультатТаблица"+ш+".c  как c" +ш;
		ЗапросКомпозицияСоединения = ЗапросКомпозицияСоединения +  "
		|Левое Соединение РезультатТаблица как РезультатТаблица"+ш+"  По РезультатТаблица"+ш+".j = "+ш+" И РезультатТаблица"+ш+".i = НумерацияСтрок.i";
	КонецЦикла; 
	
	ЗапросКомпозиция = " Выбрать " + ЗапросКомпозицияПоля+ " Из НумерацияСтрок Как НумерацияСтрок " + ЗапросКомпозицияСоединения;

	Возврат ЗапросНумерацияСтрок + СтрЗаменить(ЗапросКомпозиция,"Выбрать ,", "Выбрать ")

КонецФункции // ()


Функция ПроизведениеМатриц(ТабА, ТабБ)
	
    мА = ТабА.Колонки.Количество(); мБ = ТабБ.Колонки.Количество();
	
	Если Не мА = ТабБ.Количество() Тогда
		Сообщить("Неверные размерности матриц!", СтатусСообщения.Важное); Возврат Неопределено;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	ЗапросТекст =  //Исходные матрицы с колонкой с нумерацией строк
	"ВЫБРАТЬ * ПОМЕСТИТЬ ИсходнаяА ИЗ &ТабА КАК ТабА; ВЫБРАТЬ * ПОМЕСТИТЬ ИсходнаяБ ИЗ &ТабБ КАК ТабБ;";
	//Разбор матрицы                                          
	ЗапросТекст = ЗапросТекст + ПолучитьЗапросДекомпозиция(мА, "А") + ПолучитьЗапросДекомпозиция(мБ, "Б");
	//Умножение
	ЗапросТекст = ЗапросТекст +   
	"ВЫБРАТЬ ТабА.i КАК i, ТабБ.j КАК j, СУММА(ТабА.elem * ТабБ.elem) КАК c
	|Поместить РезультатТаблица	
	|ИЗ ТабА КАК ТабА ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабБ КАК ТабБ ПО ТабА.j = ТабБ.i
	|СГРУППИРОВАТЬ ПО ТабА.i, ТабБ.j;  ";   
	//Сбор матрицы
	Запрос.Текст = ЗапросТекст + ПолучитьЗапросКомпозиция(мБ); 
	
	Запрос.УстановитьПараметр("ТабА", ПодготовитьИсходнуюТаблицу(T1, "а"));                                                                                                    
	Запрос.УстановитьПараметр("ТабБ", ПодготовитьИсходнуюТаблицу(T2, "б"));
	
	Возврат Запрос.Выполнить().Выгрузить();

КонецФункции // ()

 

На данный момент вопрос быстродействия не исследовался.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ildarovich 7702 29.07.13 23:55 Сейчас в теме
Качественное решение непростой задачи. Но я не совсем согласен с самой идеей использования таблиц значений для работы с матрицами. Таблица значений "заточены" под работу со строками-записями. И рано или поздно это даст о себе знать. В том числе и при вводе и выводе. Матрицы лучше хранить и обрабатывать в виде, получаемом в Вашем случае после функции "декомпозиции", убрав нулевые значения.
2. zaxarovsky 108 30.07.13 08:47 Сейчас в теме
(1) ildarovich, спасибо!
Да, я понял, что хранить и обрабатывать так будет удобно. Тут как раз-таки проблемки с вводом-выводом имеются. А как иначе, если нужно допустим вручную вводить значения да еще чтобы это выглядело привычно?
Полагаю, только для матриц большой размерности это будет играть роль в плане быстродействия.
3. Synoecium 762 28.11.13 15:15 Сейчас в теме
само умножение конечно выглядит элегантно)
а вот по поводу ввода матрицы в запрос, советую использовать подготовленную на встроенном языке таблицу значений. Что-то вроде:
Для Строка=0 По ИсходнаяТаблица.Количество() Цикл
Для Столбец=0 По ИсходнаяТаблица.Колонки.Количество() Цикл
новСтрока = ТаблицаЗапроса.Добавить();
новСтрока.i = Строка;
новСтрока.j = Столбец;
новСтрока.Значение = ИсходнаяТаблица[i][j];
КонецЦикла
КонецЦикла

а затем работать в запросе с "уплощенной" таблицей. На собственном опыте убедился что объединение большого количества подзапросов очень медленно работает. Например, в УПП, запрос к табличной части документа "Табель учета рабочего времени" работает в несколько раз медленнее (объединение 120 таблиц), чем запрос к подготовленной таблице значений.
4. zaxarovsky 108 28.11.13 15:40 Сейчас в теме
(3) Synoecium,
Тут вроде это не особо критично, так как всего (м) таблиц объединяется.
Хотя, в конкретных приложениях, может так и следует поступить. Спасибо!
Оставьте свое сообщение

См. также

Все консоли запросов для 1С

Запросы Бесплатно (free)

Список всех популярных обработок.

17.03.2023    11285    kuzyara    66    

113

Обработка результатов запроса произвольными вычисляемыми полями. Обзор некоторых новых функций СКД

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

07.02.2023    3290    quazare    7    

36

Идентификатор объекта в запросе. Вы этого хотели?

Запросы Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    13240    dsdred    17    

68

Избавиться от скана таблицы в плане запроса

HighLoad оптимизация Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

Для запросов, содержащих "LIKE %СтрокаПоиска%". Справедливо для MS SQL и Postgres.

20.12.2022    3084    vasilev2015    31    

25

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    16419    quazare    34    

113

Новые возможности языка запросов в платформе 8.3.20

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

С платформы 8.3.20 анонсировали ряд изменений в языке запросов, с которыми интересно было повозиться на практике, что и было проделано. Результатом этих изысканий решил поделиться с вами.

27.09.2022    10718    zeltyr    17    

75

Делаем свой интервальный регистр в ЗУП

Механизмы типовых конфигураций Запросы Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Бесплатно (free)

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

09.09.2022    2496    vazelin    4    

30

Ускорим проведение в 1С:Управление холдингом

HighLoad оптимизация Запросы Платформа 1С v8.3 1С:Управление холдингом Бесплатно (free)

В 1С:Управление холдингом есть "нехороший" запрос, который съедает значительную часть времени проведения документов. Если его подправить, то проведение заметно ускорится.

10.08.2022    5341    sapervodichka    64    

74

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье хотим рассказать об одном нашем непростом расследовании, в котором удалось собрать сразу несколько проблем на разных уровнях инфраструктуры заказчика и изначальной методологии ведения учета. Само расследование в какой-то момент стало напоминать детективную историю, с роялями в кустах, ошибками платформы, странным поведением пользователей и магическим поведением хорошо знакомых механизмов. Но мы реалисты, поэтому все проблемы были выявлены и устранены ;)

11.07.2022    5782    it-expertise    27    

57

Консоль запросов к двум базам (общий менеджер временных таблиц)

Инструментарий разработчика Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

07.07.2022    6054    50    acces969    21    

48

Кратность в Юанях (CNY) 10 и 1

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Обратите внимание на обмены данными с Юанями. Кратность там меняется между 10 и 1, в зависимости от значения курса > 10 или < 10. Т.е. НЕ ВСЕГДА равна 1. А многие разработчики (в том числе и я) грешат, ставя Кратность = 1 по умолчанию в обменах и выгрузках. P.S. Идём на Восток, становимся хитрее.

10.06.2022    9503    sapervodichka    13    

37

Генератор текста запроса

Инструментарий разработчика Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Простой инструмент для быстрой подготовки данных для демонстрации.

20.05.2022    5467    159    echo77    4    

64

Консоль запросов SQL (управляемые формы)

Инструменты администратора БД Инструментарий разработчика Внешние источники данных Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Иногда требуется подключиться к другим базам данных для обменов, например: MySQL (сайты, интернет магазины), MS SQL, PostgreSQL (базы данных такие как 1С, WMS, других приложений) и т.д. Данная консоль поможет настроить и проверить подключение, выполнить любые запросы на языке SQL, а также если подключить обработку в конфигуратор использовать для обменов между базами данных с помощью языка SQL.

2 стартмани

04.05.2022    7531    39    nikolasx    12    

28

Визуальная структура запроса (УФ)

Запросы Запросы Конфигурации 1cv8 Абонемент ($m)

Анализирует текст запроса и строит визуальную структуру источников данных (наподобие дерева).

1 стартмани

14.04.2022    4602    34    ildary    2    

20

Экспертный кейс. Расследование фатального замедления времени расчета себестоимости в 1С:ERP 2

HighLoad оптимизация Механизмы типовых конфигураций Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

При выполнении нагрузочного тестирования информационной системы на базе 1С:ERP для одного из клиентов с целью оценки возможности миграции системы на PostgreSQL и Astra Linux мы столкнулись с неприемлемым увеличением времени выполнения расчета себестоимости. Строго говоря, сценарий тестирования закрытия месяца не был выполнен вообще – он не укладывался в таймаут выполнения теста, 24 часа. По прошествии 18 часов всё ещё шло выполнение операции «Распределение затрат и расчет себестоимости». Более 16 часов выполнялся подэтап “Расчет партий и себестоимости. Этап. Расчет себестоимости: РассчитатьСтоимость”. Всё это время выполнялся запрос, который в текущей инфраструктуре клиента (СУБД MS SQL Server) выполняется чуть более 3 минут на аналогичных данных.

25.03.2022    5904    it-expertise    92    

68

Экспертный кейс. Расследование деградации производительности системы. Проведение документа “Поступление товаров и услуг” (1С:ERP 2)

Механизмы платформы 1С Запросы HighLoad оптимизация Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В ходе проведения нагрузочного тестирования одним из наших клиентов была выявлена сильная деградация производительности системы в целом и, в частности, выполнения ключевой операции “Проведение документа поступление товаров и услуг” в течение выполнения теста. Согласно данным подсистемы БСП “Оценка производительности”, время выполнения ключевой операции “Проведение документа поступление товаров и услуг” возрастало в процессе тестирования с 15-20 секунд в начале тестирования до 150-200 секунд в его финале.

02.03.2022    4314    it-expertise    50    

31

Конвертер для преобразования текстов запросов и планов SQL в представления языка 1С

Инструментарий разработчика Запросы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Преобразует текст запроса на языке SQL или план запроса, подставляя представления метаданных конфигурации для удобства последующего анализа.

2 стартмани

07.02.2022    10519    127    ivanov660    7    

89

Готовые механизмы 1С: ЗУП, представления

Механизмы типовых конфигураций Запросы Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Бухгалтерский учет Бесплатно (free)

Здесь будет храниться архив запросов, которые могут помочь разработчику правильно строить отчеты и получать данные в 1С: ЗУП. Статью буду периодически дополнять.

03.11.2021    7802    Margo462    19    

92

Работа с SQL. Шаблон общего модуля

Запросы Платформа 1С v8.3 Бесплатно (free)

Шаблон общего модуля для работы с MS/PG SQL из 1С.

21.10.2021    4482    mrChOP93    3    

67

Как читать чужой код? Часть 3. Разбор и доработка запросов

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во всех вакансиях есть требование - умение читать чужой код. Но ни на одних курсах специально этому не учат. Чтобы устранить это противоречие, пишу данную статью. Рассмотрю случаи, в которых нам необходимо разбирать чужой код, поймём, чей код мы пытаемся разобрать, зачем и, главное, как. В статье описан личный опыт длиною в 18 лет начиная с версии платформы 7.7. Статья будет большой, набираемся терпения). Статья содержит в себе описание сценариев разбора кода, т.е. набор шагов. В статье не получится показать это на практике. Для этого планирую сделать онлайн или оффлайн курс, где на примерах будет показан разбор незнакомого кода. Статья разбита на 4 публикации для удобства изучения.

20.09.2021    5172    biimmap    33    

39

Снежинка для запроса

Запросы Россия Бесплатно (free)

В запросах использование * позволяет выбрать все поля. В пакете запросов этот символ мог бы быть очень востребован при обращении к полям таблиц промежуточных результатов, да и при полных выборках тоже. Однако конструктор его не поддерживает, а в тексте его использование может приводить к появлению дублей полей. Реализовать собственный вариант работы с символом позволяет "Схема запроса".

21.06.2021    2510    kalyaka    5    

15

Пример использования объекта "Схема запроса" в реальном проекте

Запросы Платформа 1С v8.3 Бесплатно (free)

Разберём решение задачи реального проекта: контекст, логика решения, само решение. Рассмотрим возможности объекта СхемаЗапроса.

03.06.2021    5843    maraton1185    32    

29

Однопальцевое преобразование "одинэсного" запроса в запрос на SQL

Инструментарий разработчика Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Абонемент ($m)

Обработка предназначена для преобразования "одинэсных" запросов в запросы на SQL средствами встроенного языка. Разработка не претендует на то, чтобы на 100% повторить то, что разработчики видят при трассировке запросов в инструментах вроде Profiler. Но во многих случаях результат преобразования можно будет без дополнительной ручной обработки выполнить, например, в Managment studio. Актуальные ограничения и проблемы преобразователя описаны в статье. Работает с версией платформы не ниже 8.3.10.

4 стартмани

17.04.2021    9742    33    kser87    17    

17

Последний раз про срез последних (на каждую дату в запросе)

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

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

15.02.2021    37238    randomus    47    

155

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С)

Запросы Платформа 1С v8.3 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    9014    Eugen-S    25    

71

Имитация sql выражения LIMIT в запросе 1С

Запросы Платформа 1С v8.3 Бесплатно (free)

Всем известно, что в SQL синтаксисе есть выражение LIMIT. Очень полезное выражение для постраничной навигации. Но его нет в запросах 1С. Кто-то может сказать, что есть ПЕРВЫЕ, но ПЕРВЫЕ не подходит для постраничной навигации. Рассмотрим в статье, как можно имитировать LIMIT в запросах 1С.

08.12.2020    3562    opx    51    

20

Итоги по объединенной совокупности группировок в запросе

Запросы Платформа 1С v8.3 Бесплатно (free)

Способ формирования итогов в запросе по совокупности группировок, объединенных в единый набор, при помощи функции АВТОНОМЕРЗАПИСИ.

18.11.2020    12581    antonivan    21    

100

Отладчик запроса 1С 8.3 (управляемые формы)

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Запросы Конфигурации 1cv8 Абонемент ($m)

По просьбам некоторых своих коллег и пользователей Инфостарта, выкладываю первую версию обработки "Отладчик запросов by Акулов А.С.", переделанной под управляемые формы. Реализованы почти все возможности из отладчика запросов, которые присутствовали в версии под обычные формы, а также добавлено немного нового.

1 стартмани

28.09.2020    19561    177    DrAku1a    31    

113

Улучшенный конструктор запроса тонкого клиента (Infostart Toolkit)

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

07.09.2020    9022    Evg-Lylyk    23    

57

«Варп-двигатель» для «среза последних»

Запросы Бесплатно (free)

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

10.08.2020    4690    hobi    52    

26

Проводим по БУ "на лету"

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

В базе ERP и КА есть форма тестировщика, которая автоматически получает из конфигурации полные тексты запросов формирования бухгалтерских проводок выбранного документа, даёт возможность модифицировать запрос и сразу проверить результат.

01.05.2020    9609    sapervodichka    1    

94

JSON в запросах DaJet QL

Запросы Бесплатно (free)

Практические примеры работы с JSON непосредственно в языке запросов. Перенос курсов валют между УТ и БП. Требуется SQL Server 2016 и выше.

24.04.2020    5182    zhichkin    6    

18

Поблочная обработка таблицы. Обзор решений

Универсальные функции Запросы СКД Платформа 1С v8.3 Бесплатно (free)

8 способов реализации повседневной актуальной задачи, готовый код

25.02.2020    3346    Yashazz    21    

21

Нечёткий поиск "ПОДОБНО". Нюансы

Запросы Платформа 1С v8.3 Бесплатно (free)

Заметки о "ПОДОБНО" в языке запросов

23.02.2020    63952    Yashazz    34    

121