Доброго всем вечера.
В наличии внешняя обработка с табличной частью. Требуется отфильтровать строки с определенными значениями в колонке. Первоначально пытался делать через ОтборСтрок, но так как, данное свойство не поддерживает множественный выбор значений для отбора пришлось делать через запрос.
И тут я столкнулся с определенным неудобством.
Табличная часть заполняется разбором текстового документа. Фильтрую следующим образом.

```1c
    Если Установка = Истина Тогда
    //сохраняем исходную табличную часть
    //Для каждого СтрокаТаблицыИсточника Из Объект.Таб.Выгрузить() Цикл
    // СтрокаТаблицыПриемника = Объект.ВременнаяТаблица.Добавить();
    // ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника,СтрокаТаблицыИсточника);
    // КонецЦикла;
    ЗначениеВРеквизитФормы(Объект.Таб.Выгрузить(),"Объект.ВременнаяТаблица");
    //Объект.ВременнаяТаблица.Скопировать(Объект.Таб.Выгрузить());

    ВремТЗ = РеквизитФормыВЗначение("Объект.ВременнаяТаблица");

    МассивДок = Новый СписокЗначений;
    Если Объект.ЗагружатьОРП Тогда
    МассивДок.Добавить("1");
    МассивДок.Добавить("5");
    КонецЕсли;
    Если Объект.ЗагружатьВозвратыПокупателям Тогда
    МассивДок.Добавить("4");
    КонецЕсли;
    Если Объект.ЗагружатьВозвратыПоставщикам Тогда
    МассивДок.Добавить("12");
    КонецЕсли;
    Если Объект.ЗагружатьРТУ Тогда
    МассивДок.Добавить("17");
    КонецЕсли;
    Если Объект.ЗагружатьСписания Тогда
    МассивДок.Добавить("124");
    МассивДок.Добавить("14");
    КонецЕсли;
    Если Объект.ЗагружатьПТУ Тогда
    МассивДок.Добавить("10");
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = "ВЫБРАТЬ *
    |Поместить ВТ
    |ИЗ
    | &ТаблицаЗначений КАК ТаблицаЗначений
    |ГДЕ
    | ТаблицаЗначений.Операция В(&СписокОпераций)
    |;
    |Выбрать
    | ВТ.*";
    Запрос.УстановитьПараметр("ТаблицаЗначений", Объект.Таб.Выгрузить());
    Запрос.УстановитьПараметр("СписокОпераций", МассивДОК);

    ТЗ = Запрос.Выполнить().Выгрузить();

    Объект.Таб.Загрузить(ТЗ); //загружаем в табличную часть обработки
```

собственно проблема в сохранении исходной табличной части, для последующей загрузки в случае отключения фильтра. Перезагрузить из текстового файла можно, но неразумно я считаю.

С чем я столкнулся..возможно с плохим пониманием видимости переменных, пробовал создать переменную:
1. Перем ВремТЗ Экспорт;
2. Определял её при создании на сервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

 ВремТз = Новый ТаблицаЗначений;
значение у неё как ни крути при повторном обращении к процедуре было неопределенно

Дальше попробовал через реквизит формы, пробовал и через реквизит объекта.

```1c
    //сохраняем исходную табличную часть
    //Для каждого СтрокаТаблицыИсточника Из Объект.Таб.Выгрузить() Цикл
    // СтрокаТаблицыПриемника = Объект.ВременнаяТаблица.Добавить();
    // ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника,СтрокаТаблицыИсточника);
    // КонецЦикла;
    //ЗначениеВРеквизитФормы(Объект.Таб.Выгрузить(),"Объект.ВременнаяТаблица");
    //Объект.ВременнаяТаблица.Скопировать(Объект.Таб.Выгрузить());
```

Здесь получается при обращении в процедуре Объект.ВременнаяТаблица.Выгрузить() имеем пустую таблицу

Подскажите может я совсем не в верном направлении, может есть способы проще и самое главное рабочие)
---
1) Добавить еще одну табличную часть/таблицу значений на форме, где хранить исходную таблицу
2) использовать метод ПоместитьВоВременноеХранилище()
3) Сериализовать тз, хранить в реквизите текстом, когда нужно, десериализовывать обратно
---
1) Добавить еще одну табличную часть/таблицу значений на форме, где хранить исходную таблицу
2) использовать метод ПоместитьВоВременноеХранилище()
3) Сериализовать тз, хранить в реквизите текстом, когда нужно, десериализовывать обратно
---
2) использовать метод ПоместитьВоВременноеХранилище(), забыл упомянуть, этот эксперимент я тоже проводил, повторил на всякий случай.:

АдресХЗ - реквизит типа строка, длина 0

При установке фильтра делаем:

АдресХЗ = ПоместитьВоВременноеХранилище(Объект.Таб.Выгрузить());

При снятии делаем:

ИсходнаяТЗ = ПолучитьИзВременногоХранилища(АдресХЗ);

в результате ИсходнаяТЗ = Неопределенно
---
УникальныйИдентификатор формы надо было указывать
---
4) Добавить в ТЗ еще один разрез. И хранить оба набора в одной табличке.
---
Первоначально пытался делать через ОтборСтрок, но так как, данное свойство не поддерживает множественный выбор значений для отбора пришлось делать через запрос.

Можно проще. Добавить колонку булевую в исходную таблицу. Например, "ПодходящееЗначение".
В зависимости от нужного отбора заполнять эту колонку для подходящих строк Истина.
Установить ОтборСтрок по этой колонке.
Все.
---
А заполнять в какой момент и каким образом? хотя в целом да, интересное исполнение, в том же цикле перебрал строки, проверил на совпадение присвоил истину.
---
В момент установки/изменения значения отбора.
Пройти все строки таблицы, проверить, что значение в строке подходит под отбор и для таких строк проставить Истина, для остальных - Ложь.
После этого установить ОтборСтрок.
То есть в тот же момент, что вы выгружаете/загружаете таблицу для отображения нужных строк.
Примерно так

```1c
    МассивОтбора = Новый Массив;
    Если Объект.ЗагружатьОРП Тогда
    МассивОтбора .Добавить("1");
    МассивОтбора .Добавить("5");
    КонецЕсли;
    Если Объект.ЗагружатьВозвратыПокупателям Тогда
    МассивОтбора .Добавить("4");
    КонецЕсли;
    Если Объект.ЗагружатьВозвратыПоставщикам Тогда
    МассивОтбора .Добавить("12");
    КонецЕсли;
    Если Объект.ЗагружатьРТУ Тогда
    МассивОтбора .Добавить("17");
    КонецЕсли;
    Если Объект.ЗагружатьСписания Тогда
    МассивОтбора .Добавить("124");
    МассивОтбора .Добавить("14");
    КонецЕсли;
    Если Объект.ЗагружатьПТУ Тогда
    МассивОтбора .Добавить("10");
    КонецЕсли;

    Для Каждого СтрТЧ Из Объект.Таб Цикл
    Если МассивОтбора.Найти(СтрТЧ.Операция) = Неопределено Тогда
    СтрТЧ.ПодходящееЗначение = Ложь;
    Иначе
    СтрТЧ.ПодходящееЗначение = Истина;
    КОнецЕсли;
    КонецЦикла;
    //Тут сделать отбор строк
```
---
В результате сделал через сериализацию, интересно, что я не так делал с ВременнымХЗ

```1c
    Если Установка = Истина Тогда

    АдресХЗ = ЗначениеВСтрокуВнутр(Объект.Таб.Выгрузить());

    МассивДок = Новый СписокЗначений;
    Если Объект.ЗагружатьОРП Тогда
    МассивДок.Добавить("1");
    МассивДок.Добавить("5");
    КонецЕсли;
    Если Объект.ЗагружатьВозвратыПокупателям Тогда
    МассивДок.Добавить("4");
    КонецЕсли;
    Если Объект.ЗагружатьВозвратыПоставщикам Тогда
    МассивДок.Добавить("12");
    КонецЕсли;
    Если Объект.ЗагружатьРТУ Тогда
    МассивДок.Добавить("17");
    КонецЕсли;
    Если Объект.ЗагружатьСписания Тогда
    МассивДок.Добавить("124");
    МассивДок.Добавить("14");
    КонецЕсли;
    Если Объект.ЗагружатьПТУ Тогда
    МассивДок.Добавить("10");
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = "ВЫБРАТЬ *
    |Поместить ВТ
    |ИЗ
    | &ТаблицаЗначений КАК ТаблицаЗначений
    |ГДЕ
    | ТаблицаЗначений.Операция В(&СписокОпераций)
    |;
    |Выбрать
    | ВТ.*";
    Запрос.УстановитьПараметр("ТаблицаЗначений", Объект.Таб.Выгрузить());
    Запрос.УстановитьПараметр("СписокОпераций", МассивДОК);

    ТЗ = Запрос.Выполнить().Выгрузить();

    Объект.Таб.Загрузить(ТЗ);
    Иначе
    ИсходнаяТЗ = ЗначениеИзСтрокиВнутр(АдресХЗ);
    Объект.Таб.Загрузить(ИсходнаяТЗ);
    КонецЕсли;
```
---
На поломать голову. Динамический список с внешними источниками.
Отборы - все как у динамического списка, типовые. В качестве внешнего источника - ТЗ.
---
"ВремТЗ = РеквизитФормыВЗначение("Объект.ВременнаяТаблица");"
 - это если у вас ВременнаяТаблица - как табличная часть Объекта объявлена.
Если это таблица значений в реквизитах формы, то просто

&НаСервере
ВремТЗ = РеквизитФормыВЗначение("ВременнаяТаблица");
---
Это был реквизит формы, не объекта(хотя и так пробовал), как табличную часть делать не пробовал.

Мне кажется ваш вариант не пройдет, он возвращает неопределенно.

Разница между объект.ВременнаяТаблица и ВременнаяТаблица лишь в том где они заданы, на форме или в объекте.

Я тут сообразить не смог почему вообще не определено возвращает, даже с временным хранилищем не получилось, только через сериализацию.
---
неопределено возвращает потому что переменная определена на сервере. т.е. живет, пока длится серверный вызов.
при возврате на клиента - умирает, становится неопределено.
---
даже если она записана в реквизит формы? в этом же вызове
---
данные в реквизитах формы живут и на клиенте и на сервере.
у вас данные какого типа? таблица значений? тип таблица значений не существует на клиенте,
скорее всего дело было так: вы присвоили реквизиту ТЗ на сервере, все ок, реквизит ТЗ существует,
тип реквизита полагаю назначили "произвольный" ?
при возврате на клиента, сериализатор не смог перевести тип "Таблица значений" в данные формы, т.к. он умеет переводит ТЗ только в тип "ДанныеФормыКоллекция" и т.п. , с явно описанной структурой.

такой вариант сработал бы если Реквизит = ЗначениеВСтрокуВнутр(ТЗ);
---
Исходная таблица - табличная часть обработки, её выгружаю через Объект.Таб.Выгрузить() в результате это таблица значений.

эту таблицу значений пытался присвоить реквизиту ВременнаяТаблица(тип значений определен как таблица значений)
присвоение происходит нормально, но при повторном входе в эту же процедуру и обращении к тз - неопреленно

действо всё происходит на сервере.
---
действо всё происходит на сервере.
не верю. зачем вам тогда вообще понадобилось сохранение ТЗ ?
между двумя вызовами этой процедуры что происходит? работа на клиенте
---
писал в самом начале, ещё раз описание задачи. Есть исходная табличная часть, мне в ней нужно установить фильтр, отбор строк решил мою задачу по строкам с единственным значением, для списка он не подошел. Поэтому я решил выгрузить в ТЗ, сохранить там исходную, затем запросом отфильтровать имеющуюся таб часть, загрузить, и при снятии галки фильтра вернуть обратно исходную строку.

(15)

Вот что у меня получилось в итоге, можно было конечно всё объединить в запросе, но решил ту часть уже не переделывать.

 Код
&НаКлиенте
Процедура ИспользоватьФильтрПриИзменении(Элемент)

   Если Не ИспользоватьФильтр Тогда
      ЭтотОбъект.Элементы.ТЗ.ОтборСтрок = Неопределено;
      УстановитьФильтрДокументов(Ложь);
   Иначе

      //Сбрасываем отбор строк
      ЭтотОбъект.Элементы.ТЗ.ОтборСтрок = Неопределено;
      //Устанвливаем новый отбор строк
      Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
         ЭтотОбъект.Элементы.ТЗ.ОтборСтрок = Новый ФиксированнаяСтруктура("Контрагент", Объект.Контрагент);
      КонецЕсли;
      Если  ЗначениеЗаполнено(Объект.Склад) Тогда
         ЭтотОбъект.Элементы.ТЗ.ОтборСтрок = Новый ФиксированнаяСтруктура("Склад", Объект.Склад);
      КонецЕсли;
      УстановитьФильтрДокументов(Истина);
   КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура УстановитьФильтрДокументов(Установка = Ложь)

   Если Установка = Истина Тогда
      //сохраняем исходную табличную часть
      АдресХЗ = ЗначениеВСтрокуВнутр(Объект.Таб.Выгрузить());

      МассивДок = Новый СписокЗначений;
      Если Объект.ЗагружатьОРП Тогда
         МассивДок.Добавить("1");
         МассивДок.Добавить("5");
      КонецЕсли;
      Если Объект.ЗагружатьВозвратыПокупателям Тогда
         МассивДок.Добавить("4");
      КонецЕсли;
      Если Объект.ЗагружатьВозвратыПоставщикам Тогда
         МассивДок.Добавить("12");
      КонецЕсли;
      Если Объект.ЗагружатьРТУ Тогда
         МассивДок.Добавить("17");
      КонецЕсли;
      Если Объект.ЗагружатьСписания Тогда
         МассивДок.Добавить("124");
         МассивДок.Добавить("14");
      КонецЕсли;
      Если Объект.ЗагружатьПТУ Тогда
         МассивДок.Добавить("10");
      КонецЕсли;

      Запрос = Новый Запрос;
      Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
      Запрос.Текст = "ВЫБРАТЬ *
      |Поместить ВТ
      |ИЗ
      |    &ТаблицаЗначений КАК ТаблицаЗначений
      |ГДЕ
      |   ТаблицаЗначений.Операция В(&СписокОпераций)
      |;
      |Выбрать
      |    ВТ.*";
      Запрос.УстановитьПараметр("ТаблицаЗначений", Объект.Таб.Выгрузить());
      Запрос.УстановитьПараметр("СписокОпераций", МассивДОК);

      ТЗ = Запрос.Выполнить().Выгрузить();

      Объект.Таб.Загрузить(ТЗ);
   Иначе
      ИсходнаяТЗ = ЗначениеИзСтрокиВнутр(АдресХЗ);
      Объект.Таб.Загрузить(ИсходнаяТЗ);
   КонецЕсли;

Показать полностью

по другому не получалось у меня.
---
а вариант в (11) не подходит?
---
Доброго времени суток. Для временного хранения таблицы значений нужно её выгрузить в двумерный массив, при этом важно поставить структуру отбора по полям объекта из которого выгружается табличная часть. После этого переменной можно присвоить значение неопределенно, чтобы временная таблица не хранилась в оперативной памяти твоего славного компьютера. Удачи тебе, надеюсь у тебя все получится.
---
Еще такой вариант сейчас на глаза попался:

Элементы.ЭлементФормыТаблица.ОтборСтрок = Новый ФиксированнаяСтруктура("ИмяКолонки1,ИмяКолонки2, ИмяКолонки3", ДанныеСтроки.ИмяКолонки1, ДанныеСтроки.ИмяКолонки2, ДанныеСтроки.ИмяКолонки3);

При этом ТаблицаЗначений - реквизит формы,
ЭлементФормыТаблица - элемент формы , Данные = ТаблицаЗначений
ИмяКолонки1,2,3 - колонки ТаблицыЗначений

ТаблицаЗначений - собираешь полную, но отбор работает от показывает строки по наложенным условиям.