Короче, пришел к осознанию двух проблем:
1. В новой версии будет невозможно работать с одномерными фильтрами по неопределенным (пустым) значениям
2. Схема сравнения неопределенных пустых значений в ИТ и вообще в 1С различны.
Вот такой тест (для старого варианта):
Процедура _ТестПустые()
_пусто = ПолучитьПустоеЗначение();
_т =СоздатьОбъект("ИндексированнаяТаблица");
_т.НоваяКолонка("к1");
_т.НоваяСтрока(); _т.к1 =_пусто;
_т.НоваяСтрока(); _т.к1 ="ПолучитьПустоеЗначение..."; _т.к1 =ПолучитьПустоеЗначение(); // формируем пустое с непустой строкой
Сообщить(?(_т.к1 =_пусто, "равно", "не равно")); // равно
_т.ДобавитьИндекс("к", "к1");
_т.УстановитьФильтр(_пусто, _пусто, "к"); // в новой версии не получится
Сообщить(_т.КоличествоСтрок("к")); // 1
КонецПроцедуры
У себя как вариант сделал пока так:
BOOL CVTExtended::defsSetFilter(int nParam, CValue* param) const
{
switch( nParam )
{
case 0: param->SetTypeCode(USHRT_MAX); break;
case 1: param->SetTypeCode(USHRT_MAX); break;
case 2: *param = 0L; break;
case 3: *param = 0L; break;
case 4: *param = 0L; break;
}
return TRUE;
}
и
void CVTExtFilter::Set(CValue const& Min, CValue const& Max)
{
if( Min.GetTypeCode() == USHRT_MAX )
FillMinRow();
else
FillSearchKey(Min, Rec_min.IndexFields, Row_min, Rec_min);
if( Max.GetTypeCode() == USHRT_MAX )
FillMaxRow();
else
FillSearchKey(Max, Rec_max.IndexFields, Row_max, Rec_max);
}
Леша, я ничего не забыл? Сравнение строк для неопределенных - для чего оно может быть нужно?