ТиС, типовой код, вызывает вопросы...

Автор Злоп, 15 мая 2026, 15:52

« назад - далее »

Злоп

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

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

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

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

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

Что я не понимаю? Какие тонкости не волоку?

Харлампий Дымба

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


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