Последние сообщения

#1
7.7 / Re: Передать таблицу значений ...
Последний ответ от trad - Сегодня в 11:05

Процедура УложитьТаблицу(пТЗ, ИмяТаб, Колонки="", ПервичныйКлюч="") Экспорт
	Перем ТЗ;
	
	Если ПустаяСтрока(Колонки)=1 Тогда
		ТЗ=пТЗ;
	Иначе
		пТЗ.Выгрузить(ТЗ,,,Колонки);
	КонецЕсли;
	СтрCreate="create table %Имя% (/*column_definition*/ /*pk*/)";
	СтрInsert="insert into %Имя% values(/*?*/)";
	Тип="";
	Длина="";
	Точность="";
	ФорматнаяСтрока="";
	КолонкиЕсть=0;
	Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
		Идентификатор=ТЗ.ПолучитьПараметрыКолонки(Тек,Тип,Длина,Точность,,,ФорматнаяСтрока);
		Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
			Продолжить;
		КонецЕсли;
		КолонкиЕсть=1;
		Если ПустаяСтрока(ФорматнаяСтрока)=0 Тогда
			SQL_тип=ФорматнаяСтрока;
			рс.ДобПараметр(1,);
		ИначеЕсли ПустаяСтрока(Тип)=1 Тогда
			SQL_тип="char(9)";
			рс.ДобПараметр(1,14,9,0);
		ИначеЕсли Тип="Число" Тогда
			Если Длина=0 Тогда
				Длина=38;
				Точность=10;
			КонецЕсли;
			SQL_тип="numeric(%p%,%s%)";
			SQL_тип=СтрЗаменить(SQL_тип,"%p%",Длина);
			SQL_тип=СтрЗаменить(SQL_тип,"%s%",Точность);
			рс.ДобПараметр(1,11,Длина,Точность);
		ИначеЕсли Тип="Строка" Тогда
			Если Длина=0 Тогда
				SQL_тип="varchar(%n%)";
				SQL_тип=СтрЗаменить(SQL_тип,"%n%",255);
				рс.ДобПараметр(1,15,255,0);
			Иначе
				SQL_тип="char(%n%)";
				SQL_тип=СтрЗаменить(SQL_тип,"%n%",Длина);
				рс.ДобПараметр(1,14,Длина,0);
			КонецЕсли;
		ИначеЕсли Тип="Дата" Тогда
			SQL_тип="datetime";
			рс.ДобПараметр(1,10,8,0);
		ИначеЕсли Найти(Тип,".")>0 Тогда
			SQL_тип="char(9)";
			рс.ДобПараметр(1,14,9,0);
		Иначе
			SQL_тип="char(13)";
			рс.ДобПараметр(1,14,13,0);
		КонецЕсли;
		СтрCreate=СтрЗаменить(СтрCreate,"/*,*/",", ");
		СтрCreate=СтрЗаменить(СтрCreate,"/*column_definition*/",Идентификатор+" "+SQL_тип+"/*,*//*column_definition*/");
		СтрInsert=СтрЗаменить(СтрInsert,"/*,*/",", ");
		СтрInsert=СтрЗаменить(СтрInsert,"/*?*/","?/*,*//*?*/");
	КонецЦикла;
	Если ПустаяСтрока(ПервичныйКлюч)=0 Тогда
		СтрCreate=СтрЗаменить(СтрCreate,"/*pk*/","primary key clustered ("+ПервичныйКлюч+")");
	КонецЕсли;
	Если КолонкиЕсть=1 Тогда
		ТекстЗапроса="
		|set nocount on
		|if exists (select * from tempdb..sysobjects where id=object_id('tempdb..%Имя%') and sysstat & 0xf = 3 )
		|  drop table %Имя%;
		|"+СтрCreate+"
		|";
		рс=СоздатьОбъект("ODBCRecordset");
		рс.ВыполнитьИнструкцию(СтрЗаменить(ТекстЗапроса,"%Имя%",ИмяТаб));
		рс.Подготовить(СтрЗаменить(СтрInsert,"%Имя%",ИмяТаб));
		рс.ВыполнитьSQL_ИзТЗ(ТЗ,100);
		рс.Закрыть();
	КонецЕсли;
КонецПроцедуры
#2
7.7 / Re: Передать таблицу значений ...
Последний ответ от ADirks - Сегодня в 10:58
например так
    МД = СоздатьОбъект("MetaDataWork")
    тзп_Объекты = ""; зпт = "";
    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку() = 1 Цикл
        идОбъект = МД.ЗначениеВСтрокуБД(тз.Объект);
        тзп_Объекты = тзп_Объекты + зпт + "select '"+идОбъект+"' Объект";
        зпт = "
        |union all
        |";
    КонецЦикла;
    
    ТекстЗапроса = "
    |SELECT
    |    Объекты.Объект
    |FROM
    |    ("+тзп_Объекты+") Объекты
    |";
#3
7.7 / Передать таблицу значений в за...
Последний ответ от SnakePlisskin - Вчера в 17:54
Доброго дня!
Господа подскажите, как в прямой запрос в качестве параметра передать таблицу значений, суть, мне нужно справить значения те что есть у меня в БД их я выбираю запросом напрямую обращением к объектам, а есть некий внешний источник данных значения которого я получаю в таблицу значений, так вот что бы сравнить эти две таблицы, вторую мне нужно как-то передать в запрос.
#4
7.7 / Re: Все ВошедшиеВзапрос - пояс...
Последний ответ от Харлампий Дымба - Вчера в 11:05
Цитата: Злоп от Вчера в 01:14- откуда здесь взялся Товар3?
От ключевого слова "Все". То есть все допустимые (удовлетворяющие условиям запроса) элементы справочника, независимо от значения функций (нулевой остаток? - включаем).
#5
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Злоп - Вчера в 01:18
для увеличения скорости (исключительно на собственном опыте)
- убирать расшифровки
- убирать мелкую нарезку ячеек для точного построения макетов/выравниыаний
- убирать ПрисоединитьСекцию()
#6
7.7 / Re: Все ВошедшиеВзапрос - пояс...
Последний ответ от Злоп - Вчера в 01:14
Цитата: Харлампий Дымба от 16 ноября 2025, 18:40
Группировка Склад Без групп;
Группировка Номенклатура Без групп;


|Склад     |Товар     |Остаток     
Склад1Товар110
Склад1Товар215
Склад2Товар120

//по каждому складу, добиваем полный список товаров
Код Выделить Развернуть

Группировка Склад Без групп;
Группировка Номенклатура Без групп Все;


|Склад     |Товар     |Остаток     
Склад1Товар110
Склад1Товар215
Склад1Товар30
Склад2Товар120
Склад2Товар20
Склад2Товар30

- откуда здесь взялся Товар3?
#7
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Харлампий Дымба - Вчера в 00:27
..А потом добавил расшифровку и скорость практически сравнялась :'(
Ну ладно, в любом случае, есть пища для ума.
#8
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Харлампий Дымба - 18 ноября 2025, 23:30
Цитата: ADirks от 18 ноября 2025, 07:30Вот такой вот есть простенький тест
.ПолучитьСекцию() точно быстрее (раза в 2), но не так феноменально, как казалось с первых запусков.
Тест лукавит по скорости .ПолучитьСекцию(), потому что выводит три раза одну и ту же секцию, в то время как для .ВывестиСекцию() те же три раза выводятся как бы разные секции - ведь их приходится заново заполнять при выводе (пусть и одним и тем же текстом).
Ведь никто не выводит одну и ту же информацию в разных колонках одной строки.
Если непонятно написал, то честный тест для режима  .ПолучитьСекцию() будет, по моему мнению, такой:
секцияТовар1    = Т.ПолучитьСекцию("Строка_3|К1");
облТовар1    = секцияТовар1.Область(1, 1);

секцияТовар2    = Т.ПолучитьСекцию("Строка_3|К1");
облТовар2    = секцияТовар2.Область(1, 1);

секцияТовар3    = Т.ПолучитьСекцию("Строка_3|К1");
облТовар3    = секцияТовар3.Область(1, 1);
    
тзДанные.ВыбратьСтроки();
Пока тзДанные.ПолучитьСтроку() = 1 Цикл
    стрЗначение		= тзДанные.Наименование;
        
    облТовар1.Текст    = стрЗначение;
    Т.ВывестиСекцию(секцияТовар1);
        
    облТовар2.Текст    = стрЗначение;
    Т.ПрисоединитьСекцию(секцияТовар2);

    облТовар3.Текст    = стрЗначение;
    Т.ПрисоединитьСекцию(секцияТовар3);

КонецЦикла;

#9
Дружественные проекты / Re: DialMail новая версия
Последний ответ от mic22 - 18 ноября 2025, 16:54
Не приходит отправленное письмо, пробую через вашу обработку. Пишет все ОК, до получателя не доходит
Письмо и лог отправил в почту
#10
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Харлампий Дымба - 18 ноября 2025, 11:22
Цитата: ADirks от 18 ноября 2025, 07:30Вот такой вот есть простенький тест
Да, именно это и искал. Спасибо огромное!
Помнил же, что обсуждали когда-то, что через .ПолучитьСекцию() быстрее всего, но не нашёл.
Буду пробовать.

Цитата: trad от 18 ноября 2025, 09:09Убрать автовысоту строк таблицы, сделать ее фиксированной
Есть такое, в среднем процентов десять прибавки.
Ну и, насколько помню, это ещё и один из рецептов для проблемы "долго сохраняет в Excel".