Рефакторинг выборки из запроса в таблицу значений

Пришлось столкнуться на одной задаче по зарплате с необходимостью заменить работу с выборкой из запроса на работу с таблицей значений.

В коде был написан сложный запрос, результатом которого была таблица с колонками Сотрудник, Услуга. По каждой строке была указана сумма начисления зарплаты.

Все это обрабатывалось с группировкой по Сотруднику.

Но нужно было сделать доработку, чтобы некоторые услуги не распределялись на всех сотрудников смены. Решено было не изменять и без того сложный запрос, а обработать уже результат запроса.

Но для этого нужно было перейти от работы с выборкой из запроса к обработке таблицы значений.

Был написан код:

ТЗ =  ВремУслугиЗпл.Выгрузить(); //.СкопироватьКолонки(); //Получаем только таблицу по колонкам
ТЗ.Сортировать("Сотрудник");

//Тут можно обработать таблицу, перекинуть данные туда-сюда Осипов 2024-03-21

Всего = ТЗ.Количество();

ТЗСотрудник = ТЗ.СкопироватьКолонки();

//ВыборкаСотрудник = ВремУслугиЗпл.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Сотрудник");
Инд = 0; Пока Инд < Всего Цикл //Таблица должна быть отсортирована по сотруднику
	
	Инд = Инд + 1; Строка = ТЗ[Инд-1]; //Индекс идет с единицы
	
	Если Строка.Услуга <> NULL Тогда  //Пропускаем строки группировок
		//всегда добавляем текущую строку
		НСтр = ТЗСотрудник.Добавить();
		ЗаполнитьЗначенияСвойств(НСтр, Строка);
	КонецЕсли; 
	
	
	//Если это последняя строка или сотрудник следующей строки не равен сотруднику текущей строки
	Если Инд = Всего ИЛИ ТЗСотрудник.Количество() > 0 И ТЗ[Инд].Сотрудник <> ТЗСотрудник[0].Сотрудник Тогда
		//Пока ВыборкаСотрудник.Следующий() Цикл
		//времВозврЗначСуммСотр = СуммаЗплСотрудника(Док.БезналичныйРасчет, ВыборкаСотрудник, ВрСкдПоПодрАвто, ВрСкдПоПодрДк, перемСкидкаАвто);
		ТЗСуммы = СуммаЗплСотрудника(Док.БезналичныйРасчет, ТЗСотрудник, ВрСкдПоПодрАвто, ВрСкдПоПодрДк, перемСкидкаАвто);
		Сотрудник = ТЗСотрудник[0].Сотрудник;
		
		... //Заносим расчитанные суммы по зарплате в регистр
		                                        
		ТЗСотрудник.Очистить(); //Следующая итерация
		
	КонецЕсли;
	
КонецЦикла;

Написан он был не сразу правильно. Изначально была ошибка — если это была строка группировки (Услуга равна NULL), я просто пропускал, иногда такая строка была последней и поэтому последняя группировка по таблице вылетала. Нашли уже на рабочей базе, пришлось сделать перерасчет зарплаты за несколько последних дней.

Остальное работает довольно элегантно. Пример, как можно обходить отсортированную таблицу по группировкам.

Среда: Нетленка. Объем: 1 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *