Итак, имеем табличное поле с поставщиком данных - запросом.
Запрос, в самом примитивном случае, такой:
ТекстЗапроса = "
|SELECT
| Журн.IDDoc As [Документ $Документ.Заказ],
| Журн.Date_Time_IDDOC As Порядок,
| Rtrim(Журн.DocNo) As Номер,
| Док.$ОбщийРеквизит.Комментарий As Комментарий,
| Журн.$ОбщийРеквизит.Автор As [Автор $Справочник.Пользователи]
|FROM
| _1SJourn Журн (nolock)
| LEFT JOIN $Документ.Заказ Док (NoLock) on Док.IDDoc = Журн.IDDoc
|WHERE
| Журн.IDDocDef = $ВидДокумента.Заказ";
В текст запроса может добавляться условие по реквизиту документа.
Ключ порядка - Порядок, ключ строки - Документ.
Если отображаются колонки Комментарий + Автор, то имею непонятную хрень. Если хоть одна из них скрыта - то все работает нормально.
Непонятная хрень заключается в следующем:
Если обе колонки отображаются при открытии формы, то в табличном поле высвечивается сообщение ошибки скуля "State 07009, native 0, message [Microsoft][ODBC SQL Server Driver]Недопустимый индекс дескриптора". Но, тем не менее, табличное поле заполняется.
Если при открытии была видима только одна колонка, а потом мы включили видимость второй - то никаких сообщений об ошибке нет.
но и в том и в другой случае (т.е. когда отображаются обе колонки, без разницы, как мы этого добились) начинается фигня с сохранением ключа строки. Т.е. "включаю фильтр" - позиционирование табличного поля сбрасывается на самое начало.
Стоит убрать одну из этих двух колонок - все ок, ключ строки при перепостроении запроса сохраняется. Стоит отобразить обе - начинается хрень.
Сохранение ключа строки осуществляется следующим образом:
Процедура УстановитьТекстЗапроса(_ТекстЗапроса)
Сам = Сам(Контекст);
ТекстЗапроса = СтрЗаменить(_ТекстЗапроса, "<$WHERE>", "");
Попытка
// могли сменить ключ строки, а в старом запросе этого поля не было
ТекДанные = Сам.ТекущиеДанные.Получить(КлючСтроки);
Исключение
ТекДанные = "";
КонецПопытки;
Поставщик.УстТекстЗапроса(ТекстЗапроса);
Поставщик.УстИдПоле(КлючСтроки);
Поставщик.УстКлючПорядка(КлючПорядка);
Для й = 1 По Сам.Колонки.Количество() Цикл
Колонка = Сам.Колонки.Получить(й - 1);
//Если Колонка.Видимость = 1 Тогда
Поле = Поставщик.Поля.Добавить(Колонка.Данные);
Поле.ТипБыстрогоПоиска = 1;
//КонецЕсли;
КонецЦикла;
Сам.ПоставщикДанных = Поставщик;
Сам.ПоставщикДанных.Обновить(ТекДанные);
КонецПроцедуры // УстановитьТекстЗапроса
Иногда, волею судеб, глюк перестает проявляться. На некоторое время. Потом начинает снова.
Еще замечание - при "хрени" колонка комментарий - пустая.