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

#21
7.7 / Кеширование запроса SQLite при...
Последний ответ от MWW_Ruza - 04 марта 2026, 08:41
Добрый день!
Вопрос конечно к Djelf, но его с нами нет, и как это ни прискорбно, но судя по: https://forum.dorex.pro/index.php?topic=326.0 уже и не будет  >:(
Уже давно, при старте системы, с его подачи, использую такую процедуру:

Функция СписокГрупп(Сорт = 0) Экспорт
	Перем Запрос;
	Если ПустоеЗначение(БазаДанных) = 1 Тогда
		БазаДанных 	= СоздатьОбъект("SQLiteBase");
	КонецЕсли;	
	Если БазаДанных.Открыта() = 0 Тогда
		БазаДанных.Открыть(":memory:");
	КонецЕсли;
	Запрос 			= БазаДанных.НовыйЗапрос();
	ТекстЗапроса	= "SELECT id [Гр:Справочник.Номенклатура] FROM [Справочник.Номенклатура] WHERE isfolder = 1";
	Если Сорт = 1 Тогда
		ТекстЗапроса = ТекстЗапроса + " ORDER BY DESCR";
	ИначеЕсли Сорт = 2 Тогда
		ТекстЗапроса = ТекстЗапроса + " ORDER BY CODE";	
	КонецЕсли;
	Попытка
		СЗ 		= СоздатьОбъект("СписокЗначений");
		Рез		= Запрос.ВыполнитьЗапрос(ТекстЗапроса, СЗ);
		Запрос	= 0;
		Возврат Рез;
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат 0;
	КонецПопытки; 
КонецФункции

Процедура КешироватьЗапрос() Экспорт
	Состояние("Построение индекса полнотекстового поиска");
	Если ПустоеЗначение(БазаДанных) = 1 Тогда
		БазаДанных 	= СоздатьОбъект("SQLiteBase");
	КонецЕсли;	
	Если БазаДанных.Открыта() = 0 Тогда
		БазаДанных.Открыть(":memory:");
	КонецЕсли;	
	БазаДанных.НовыйЗапрос().ВыполнитьЗапрос("DROP TABLE IF EXISTS tri;");
	БазаДанных.НовыйЗапрос().ВыполнитьЗапрос("CREATE VIRTUAL TABLE tri USING fts5(ID UNINDEXED, DESCR, ismark, VERSTAMP UNINDEXED, tokenize='trigram');");
	БазаДанных.НовыйЗапрос().ВыполнитьЗапрос("
	|INSERT INTO tri(ROWID,ID,DESCR, ismark, VERSTAMP)
	|SELECT
	|    Номенклатура.ROWID,
	|    Номенклатура.ID,
	|    Номенклатура.DESCR,
	|	 Номенклатура.ismark,
	|    Номенклатура.VERSTAMP
	|FROM Справочник_Номенклатура AS Номенклатура
	|WHERE Номенклатура.isfolder=2 and Номенклатура.ismark <> '*'
	|"); 
	КэшФТС = 1;
	
	СписокГрупп(); // Он нам тут не нужен, но, что-бы тоже закешировался
	
	Состояние("");
КонецПроцедуры

В общем-то, работает отлично, значительно ускоряет "быстрый поиск" товара в справочнике.
Отрабатывает при старте - мгновенно, по крайней мере не заметно.

Магазинчики маленькие, в основном работают по одному пользователю, локально.
Но, подключил в одном магазине второго пользователя по сети - и вылезла проблема...
При запуске программа долго делает этот запрос по сети(файловая база, сетка обычная проводная одноранговая).
При запуске около минуты висит месага: "Построение индекса полнотекстового поиска"... Потом, когда наконец запустится - все работает идеально быстро...
Я конечно понимаю, что решением будет RDP... Но, как-то не хочется...
Может есть какие-то варианты, что еще "подкрутить" в этом запросе, что-бы минимизировать этот эффект? Или как-то запихнуть его в отдельный поток, что-бы он отрабатывал "незаметно" и не тормозил загрузку?
Никто не сталкивался с чем-то подобным?
#22
7.7 / Передать СписокЗначений во вне...
Последний ответ от sau - 03 марта 2026, 22:21
Какой-нибудь пример передачи списка значений во внешнюю компоненту в качестве параметра метода?
#23
7.7 / Re: КОПИЛКА: здесь всякие редк...
Последний ответ от trad - 03 марта 2026, 13:17
буфером обмена умеют пользоваться все пользователи и даже простые
#24
7.7 / Re: КОПИЛКА: здесь всякие редк...
Последний ответ от Злоп - 02 марта 2026, 23:07
ЗАПРЕТ СОХРАНЕНИЯ ТЕКСТОВОГО ФАЙЛА Т.Показать()
Если заголовок окна показа текста содержит неразрешенные в имени файла символы - то нажатие кнопок Сохранить/СохранитьКак - не дает никакого эффекта, просто не открывается диалог сохранения.
Это можно использовать (для простых пользователей), когда не хочется давать возможность сохранения текстовго содержимого (например, протокол/лог) в файл...
#25
Дружественные проекты / Re: ИТЗ: заполнить колонку по ...
Последний ответ от Злоп - 27 февраля 2026, 19:39
Ну, по ИТЗ в тех ALS что у меня есть еще методы для соединений не документированы.
#26
Дружественные проекты / Re: ИТЗ: заполнить колонку по ...
Последний ответ от ADirks - 24 февраля 2026, 13:55
а ещё такой вариант есть
ЗаполнитьКолонкуПоАлгоритму(Индекс, Алгоритм, СтартовоеЗначение, Инкремент)

пример
Процедура ЗаполнитьПоАлгоритму2()
	ит = СоздатьОбъект("ИндексированнаяТаблица");
	ит.НоваяКолонка("Зн");
	
	Для н = 1 По 1000 Цикл
		ит.НоваяСтрока();
	КонецЦикла;

	
	ит.ЗаполнитьКолонкуПоАлгоритму(, "Зн", 1, 2);
	
	//РедакторТЗ(ит);
	ит.Показать();
КонецПроцедуры
#27
Дружественные проекты / Re: ИТЗ: заполнить колонку по ...
Последний ответ от ADirks - 24 февраля 2026, 13:47
Таки есть, но почему-то не документировано. Причин не помню совершенно :)

Метод ЗаполнитьКолонкуПоАлгоритму(Индекс, Алгоритм, ИмяКолонки)

пример
Процедура ЗаполнитьПоАлгоритму()
	ит = СоздатьОбъект("ИндексированнаяТаблица");
	ит.НоваяКолонка("Зн");
	
	Для н = 1 По 1000 Цикл
		ит.НоваяСтрока();
	КонецЦикла;

	
	ТекстМодуля = "
	|Перем зн;
	|Функция NextValue()
	|	Если зн = 0 Тогда
	|		зн = 1;
	|	Иначе
	|		зн = зн + 2;
	|	КонецЕсли;
	|	Возврат зн;
	|КонецФункции
	|зн = 0;
	|";
	Модуль = СоздатьОбъект("ВыполняемыйМодуль");
	Модуль.УстановитьМодуль(ТекстМодуля);
	Модуль.НазначитьКонтекст(Контекст);
	Модуль.КомпилироватьМодуль();
	Модуль.ВыполнитьМодуль();
	
	ит.ЗаполнитьКолонкуПоАлгоритму(, "Зн", Модуль);
	
	//РедакторТЗ(ит);
	ит.Показать();
КонецПроцедуры
#28
Дружественные проекты / ИТЗ: заполнить колонку по выра...
Последний ответ от Злоп - 20 февраля 2026, 21:03
Можно ли как-то заполнить колонку по выражению..?
Например, есть колонка, и хочу заполнить нечетными числами, начиная с 1...?
#29
7.7 / Re: Склеить две ИТЗ - какое со...
Последний ответ от Злоп - 20 февраля 2026, 16:51
И насколько я понял - для InnerJoin не играет роли какая таблица левая, какая правая.
Если таблицы поменять местами - результат не изменится?
Так?
#30
7.7 / Re: Склеить две ИТЗ - какое со...
Последний ответ от Злоп - 20 февраля 2026, 07:06
Получается InnerJoin - это перемножение таблиц, в результате будут все возможные комбинации (лево, право) для указанного значения ключа.
Так?