Вот берем типовую ТиС, Док.Реализация.МодульДокумента
И встречаем вот такой код
Процедура ФильтрЗаявок(ТаблицаТМЦ, ТаблицаУслуг, ВремЗаявки, ВремЗаказыЗаявки)
Перем ТаблицаНоменклатуры;
ВремЗаявки.УстановитьЗначениеФильтра("Фирма",ФирмаДляОстатковТМЦ, 2);
ВремЗаявки.УстановитьЗначениеФильтра("ДоговорПокупателя", Договор,1);
Если ИтогиАктуальны()=0 Тогда
ТаблицаТМЦ.Выгрузить(ТаблицаНоменклатуры);
Если ТаблицаУслуг.КоличествоСтрок()>0 Тогда
БылоСтрок = ТаблицаНоменклатуры.КоличествоСтрок();
ТаблицаНоменклатуры.КоличествоСтрок(БылоСтрок+ТаблицаУслуг.КоличествоСтрок());
ТаблицаНоменклатуры.Заполнить(ТаблицаУслуг,БылоСтрок+1,ТаблицаНоменклатуры.КоличествоСтрок());
КонецЕсли;
СписокТМЦ = СоздатьОбъект("СписокЗначений");
ТаблицаНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");
ВремЗаявки. УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
ВремЗаказыЗаявки.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
ВремЗаявки. ВременныйРасчет();
ВремЗаказыЗаявки.ВременныйРасчет();
КонецЕсли;
КонецПроцедуры // ФильтрЗаявок()
Возникает вопрос: почему для временного расчета фильтр по списку номенклатуры устанавливается, а для ТА - нет...? Обоснований/предположений этому не нашел. Почему не наложить фильтр по номенклатуре и на итоги для ТА?
Аналогичный подход и здесь:
Процедура глФильтрОстатковТМЦ(Конт,ТаблНоменклатуры, СписокПараметров, ВремОстаткиТМЦ, ВремРезервыТМЦ = "") Экспорт
ФирмаДляОстатковТМЦ = СписокПараметров.Получить("ФирмаДляОстатковТМЦ");
ВремОстаткиТМЦ. УстановитьЗначениеФильтра("Фирма" ,ФирмаДляОстатковТМЦ,2);
Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр") Тогда
ВремРезервыТМЦ.УстановитьЗначениеФильтра("Фирма" ,ФирмаДляОстатковТМЦ,2);
КонецЕсли;
Если Конт.ИтогиАктуальны()=0 Тогда
// подготовка фильтров
СписокТМЦ = СоздатьОбъект("СписокЗначений");
ТаблНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");
// установка фильтров
ВремОстаткиТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
ВремОстаткиТМЦ.ВременныйРасчет();
Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр") Тогда
// установка фильтров
ВремРезервыТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
ВремРезервыТМЦ.ВременныйРасчет();
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ФильтрОстатковТМЦ()
Что я не понимаю? Какие тонкости не волоку?
Чёто понаперемудрили там сильно.
Пара мелких замечаний для начала:
1. То что в УстановитьЗначениеФильтра() для Фирмы указан вариант отбора "2", а для Договора указан вариант отбора "1", очень интересный моментик, взял на заметку.
2. В документах ОтчетККМ и РеализацияРозница функция ФильтрЗаявок() описана также, но используется в таком виде
...
ФильтрЗаявок(ТаблицаТМЦ, ТаблицаУслуг, ВремЗаявки, ВремЗаказыЗаявки);
Если ИтогиАктуальны() = 0 Тогда
ВремЗаявки.ВременныйРасчет();
ВремЗаказыЗаявки.ВременныйРасчет();
КонецЕсли;
...
Т.е сначала в ФильтрЗаявок() делаем ВременныйРасчет, потом после вызова делаем ВременныйРасчет ещё раз. Прикол в том, что из-за особенностей временного расчета на быстродействие это не влияет, но сам факт повторного вызова временного расчета - некрасиво.
Что касается твоего вопроса:
УстановитьЗначениеФильтра - действует, в частности, для 1.РассчитатьРегистрыНа (временного расчета) и для 2.ВыгрузитьИтоги() (получения таблицы итогов).
Так что смысла ставить фильтр по списку ТМЦ именно в ФильтрЗаявок() - нет, если временные итоги не рассчитываются.
Но для последующих ВыгрузитьИтоги() фильтр всё равно будет нужен - чтобы ТаблицаИтогов получилась поменьше. Поэтому в ФильтрЗаявок() для Регистр.ВремЗаявки ставят первые два фильтра Фирма и Договор. Фильтр по ТМЦ будет устанавливаться позже - в процедуре ДвижениеЗаявокПокупателя() по каждому отдельному ТМЦ при переборе в цикле. Там же пойдет перебор по заявке и будет установлен 4й и последений фильтр - по заявке. Чтобы при вызове процедуры ПогаситьЗаявки() можно было сделать
ВремЗаявки.ВыгрузитьИтоги(ТИЗаявки,1,1)и в ТИЗаявки попали только итоги по всем четырем предварительно установленным измерениям Фирма.
Немножка перенаворочено, но в целом, в рамках логики.