Форум Кладовочки АЛьФ`а

Общие вопросы => 7.7 => Тема начата: Злоп от 15 мая 2026, 15:52

Название: ТиС, типовой код, вызывает вопросы...
Отправлено: Злоп от 15 мая 2026, 15:52
Вот берем типовую ТиС, Док.Реализация.МодульДокумента
И встречаем вот такой код

Процедура ФильтрЗаявок(ТаблицаТМЦ, ТаблицаУслуг, ВремЗаявки, ВремЗаказыЗаявки)

Перем ТаблицаНоменклатуры;

ВремЗаявки.УстановитьЗначениеФильтра("Фирма",ФирмаДляОстатковТМЦ, 2);
ВремЗаявки.УстановитьЗначениеФильтра("ДоговорПокупателя", Договор,1);

Если ИтогиАктуальны()=0 Тогда
ТаблицаТМЦ.Выгрузить(ТаблицаНоменклатуры);
Если ТаблицаУслуг.КоличествоСтрок()>0 Тогда
БылоСтрок = ТаблицаНоменклатуры.КоличествоСтрок();
ТаблицаНоменклатуры.КоличествоСтрок(БылоСтрок+ТаблицаУслуг.КоличествоСтрок());
ТаблицаНоменклатуры.Заполнить(ТаблицаУслуг,БылоСтрок+1,ТаблицаНоменклатуры.КоличествоСтрок());
КонецЕсли;

СписокТМЦ = СоздатьОбъект("СписокЗначений");
    ТаблицаНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");
    ВремЗаявки.      УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
        ВремЗаказыЗаявки.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);

ВремЗаявки.      ВременныйРасчет();
ВремЗаказыЗаявки.ВременныйРасчет();
КонецЕсли;

КонецПроцедуры // ФильтрЗаявок()

Возникает вопрос: почему для временного расчета фильтр по списку номенклатуры устанавливается, а для ТА - нет...? Обоснований/предположений этому не нашел. Почему не наложить фильтр по номенклатуре и на итоги для ТА?

Аналогичный подход и здесь:

Процедура глФильтрОстатковТМЦ(Конт,ТаблНоменклатуры, СписокПараметров, ВремОстаткиТМЦ, ВремРезервыТМЦ = "") Экспорт
                                     
ФирмаДляОстатковТМЦ = СписокПараметров.Получить("ФирмаДляОстатковТМЦ");                       

ВремОстаткиТМЦ.    УстановитьЗначениеФильтра("Фирма"       ,ФирмаДляОстатковТМЦ,2);
Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр") Тогда
ВремРезервыТМЦ.УстановитьЗначениеФильтра("Фирма"       ,ФирмаДляОстатковТМЦ,2);
    КонецЕсли;

Если Конт.ИтогиАктуальны()=0 Тогда
// подготовка фильтров
СписокТМЦ = СоздатьОбъект("СписокЗначений");
ТаблНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");

// установка фильтров
ВремОстаткиТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
        ВремОстаткиТМЦ.ВременныйРасчет();

Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр") Тогда
// установка фильтров
ВремРезервыТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
        ВремРезервыТМЦ.ВременныйРасчет();
КонецЕсли;
КонецЕсли;

КонецПроцедуры // ФильтрОстатковТМЦ()

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


Что касается твоего вопроса:
УстановитьЗначениеФильтра - действует, в частности, для 1.РассчитатьРегистрыНа (временного расчета) и для 2.ВыгрузитьИтоги() (получения таблицы итогов).
Так что смысла ставить фильтр по списку ТМЦ именно в ФильтрЗаявок() - нет, если временные итоги не рассчитываются.
Но для последующих ВыгрузитьИтоги() фильтр всё равно будет нужен - чтобы ТаблицаИтогов получилась поменьше. Поэтому в ФильтрЗаявок() для Регистр.ВремЗаявки ставят первые два фильтра Фирма и Договор. Фильтр по ТМЦ будет устанавливаться позже - в процедуре ДвижениеЗаявокПокупателя() по каждому отдельному ТМЦ при переборе в цикле. Там же пойдет перебор по заявке и будет установлен 4й и последений фильтр - по заявке. Чтобы при вызове процедуры ПогаситьЗаявки() можно было сделать
ВремЗаявки.ВыгрузитьИтоги(ТИЗаявки,1,1)и в ТИЗаявки попали только итоги по всем четырем предварительно установленным измерениям Фирма.
Немножка перенаворочено, но в целом, в рамках логики.