ВосстановитьПорядокСтрокКоллекцииПослеРедактирования (БСП)

Автор: 1С
ОбщийМодуль.ГрафикиРаботыКлиент
БСП

Восстановить порядок строк коллекции после редактирования. Процедура сдвигает только что отредактированную строку в коллекции

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ВосстановитьВыделенныеСтроки (БСП)

Кеширование текущей строки для сравнения при окончании редактирования

Колонки в строку

КоллекцииИдентичны (БСП)

РазрешитьРедактированиеРеквизитовОбъектаПослеПредупреждения (БСП)

РазрешитьРедактированиеРеквизитовОбъектаПослеПроверкиСсылок (БСП)

ПроверитьСсылкиНаОбъектПослеПодтвержденияРедактирования (БСП)

НайтиСтрокуВДанныхФормыДерево (БСП)

ЗакончитьРедактированиеПослеУстановкиРасширения (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз