КОПИЛКА: здесь всякие редкости, полезности, тонкости, неочевидности.

Автор Злоп, 03 ноября 2024, 01:02

« назад - далее »

Злоп

ОСОБЕННОСТИ ФИЛЬТРА НА ИТЗ C ИНДЕКСОМ ПО УБЫВАНИЮ

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

//*******************************************
Процедура Сформировать()
	ОчиститьОкноСообщений();
	
	Сообщить("Прямой индекс");
	ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	ИТЗ.НоваяКолонка("НомерПартии");
	ИТЗ.ДобавитьИндекс("НомерПартии","НомерПартии");

	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 1;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 2;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 3;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 4;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 5;
	
	ИТЗ.УстановитьФильтр(3,4,"НомерПартии");  // хотим получить значения в диапазоне [3,4]
	ИТЗ.ВыбратьСтроки("НомерПартии");
	Пока ИТЗ.ПолучитьСтроку("НомерПартии") = 1 Цикл
		Сообщить(ИТЗ.НомерПартии);
	КонецЦикла;
	Сообщить("Прямой индекс (ожидали 3,4): готово! ок");

	Сообщить("Обратный индекс");
	ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	ИТЗ.НоваяКолонка("НомерПартии");
	ИТЗ.ДобавитьИндекс("НомерПартии","НомерПартии-");

	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 1;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 2;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 3;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 4;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 5;
	
	ИТЗ.УстановитьФильтр(3,4,"НомерПартии"); // хотим получить значения в диапазоне [3,4]
	ИТЗ.ВыбратьСтроки("НомерПартии");
	Пока ИТЗ.ПолучитьСтроку("НомерПартии") = 1 Цикл
		Сообщить(ИТЗ.НомерПартии);
	КонецЦикла;
	Сообщить("Обратный индекс (ожидали 4,3): готово! ..трабл");	

	ИТЗ.УстановитьФильтр(4,3,"НомерПартии");  // хотим получить значения в диапазоне [3,4]
	ИТЗ.ВыбратьСтроки("НомерПартии");
	Пока ИТЗ.ПолучитьСтроку("НомерПартии") = 1 Цикл
		Сообщить(ИТЗ.НомерПартии);
	КонецЦикла;
	Сообщить("Обратный индекс (ожидали 4,3): готово! ок");	

	
КонецПроцедуры // Сформировать()

Со строковыми значениями - аналогично работает.
Если отбирать по фильтру на диапазон значений ссылочного типа, например номенклатуру от ТоварЧтоТо до ТоварЕщеТо - пока непонятно что будет, не проверял.

Обсуждения, если надо, ведем в отдельной ветке!  https://forum.dorex.pro/index.php?topic=232

Злоп

Быстро моргнуть окошком-сообщением при надобности можно так:
Предупреждение("Завершено!",-1); // таймер = -1, предупреждение появится и сразу же закроется (быстрее чем 1 сек)

Злоп

Графы отбора VS общие реквизиты
Ковычки: а чем графы отбора лучше общих реквизитов ?
Епрст: лежат в отдельной табличке, не пухнет 1sjourn и меньше времени на запись оной.

trad

Ну да, ну да..
Не в отдельной табличке, а в 1scrdoc, там же где и вся подчиненность документов
Так что, что то пухнет и замедляется, что это
Графы не лучше и не хуже общих реквизитов. Они имеют разное назначение

Злоп

ФОРМАТЫ ЗАДАНИЯ ДАТ
константы типа "Дата" и преобразование дат функцией Дата() корректно отрабатывают если в качестве разделителей заданы любые знаки, отличные от цифр.
'31/12/2025'
'31-12-2025'
'31+12+2025'
'31.12.2025'
'31ю12ю2025'
- все это нормально типизируется в дату
все указанные выше значения нормально отрабатывают и функцией Дата(), например, Дата("31ю12ю2025") вполне корректно отработает...

Злоп

ПРАВИЛЬНАЯ ПРОВЕРКА НАЛИЧИЯ КАТАЛОГА

так делать не надо:
Если ФС.СуществуетФайл(КакойТоКаталог)=0 Тогда
это будет работать правильно кроме единственного варианта, когда каталог - корень диска, типа D:\

делать надо так:
Если ФС.СуществуетФайл(КакойТоКаталог+"NUL")=0 Тогда
это будет работать правильно везде