V82.ОбщиеМодули.КорректировкаСтоимости.РассчитатьСписаниеПоСредней C# (CSharp) Method

РассчитатьСписаниеПоСредней() public method

        public void РассчитатьСписаниеПоСредней(/*ТаблицаТоваров, ДатаНач, ДатаКон, СтруктураДопПараметров*/)
        {
            /*// Основное допущение данного метода - игнорирование замкнутой цепочки перемещений между состояниями ("холостого хода"):
            */
            /*// считаем, что если товар в ходе перемещений снова попал в исходное состояние, то он как бы не перемещался,
            */
            /*// это движение можно исключить из общего оборота, а стоимость движения принять равной 0. Цепочки перемещений
            */
            /*// таким образом размыкаются, что позволяет рассчитать стоимости движений, начиная от конца цепочки.
            */
            /*// Получим все состояния для товара, которые он принимал за период в виде таблицы
            */
            /*//	---------------------------------------------------------------------------------------------------------------------------------
            */
            /*// |Состояние 1 (Источник) |Состояние 2 (Приемник)| Перемещаемое количество| Стоимость (нужна для упрощения последующей корректировки)
            */
            /*// Последовательно обходя состояния, выделим контуры (пути, начала и концы которых совпадают)
            */
            /*// В каждом контуре найдем количество, которое совершило перемещение по замкнутому кругу ("холостой ход"),
            */
            /*// и уменьшим каждое движение из контура на данное количество.
            */
            /*// Будем выбирать другие состояния для получения всех контуров и применим к ним то же правило.
            */
            /*// После нахождения контуров в графах перемещений и сокращения "холостого хода" получаем совокупность разомкнутых
            */
            /*// путей перехода товара между состояниями (остовные деревья). Внутри каждой такой цепочки выполняем расчет.
            */
            /*// Важно:  в общем случае результат сокращения зависит от последовательности обхода контуров, поэтому
            */
            /*// для повторяемости результата она должна подчиняться какому-либо правилу (например, чтобы сводные перемещения
            */
            /*// упорядочивались по возрастанию даты первого перемещения)
            */
            /*// Получим таблицу перемещений, содержащую суммарные перемещения между состояниями
            */
            /*// Получаемая таблица должна содержать колонку "Количество", "Стоимость" и колонки, описывающие старое и новое состояние,
            */
            /*// причем имена колонок нового состояния заканчиваются на ПрефиксПараметровНовогоСостояния
            */
            //ПрефиксПараметровНовогоСостояния="_НовоеСостояние";
            //Таб = ПолучитьТаблицуПеремещений(ТаблицаТоваров, ДатаНач, ДатаКон, ПрефиксПараметровНовогоСостояния, СтруктураДопПараметров);
            //СтруктураДопПараметров.Вставить("ТаблицаСписанныхПартийСпецодежды", ПолучитьСтруктруТаблицыСписанныхПартийСпецодежды(СтруктураДопПараметров.Учет));
            /*//1. Приведем переданную таблицу перемещений к требуемому виду:
            */
            /*// Таблица имеет колонки Источник, Приемник, Количество
            */
            /*// строка таблицы соответствует перемещению из состояния 1 в состояние 2, перемещения не повторяются.
            */
            /*// Количество колонок без ПрефиксПараметровНовогоСостояния должно быть равно количеству колонок с ПрефиксПараметровНовогоСостояния
            */
            /*// Сформируем также структуру, которая содержит параметры состояния товара
            */
            //СтруктураСостояния = Новый Структура;
            //МассивСумм = Неопределено;
            //СтруктураДопПараметров.Свойство("МассивСумм", МассивСумм);
            if(true/*ТипЗнч(МассивСумм) <> Тип("Массив")*/)
            {
                //МассивСумм = Новый Массив;
                //МассивСумм.Добавить("Стоимость");
            }
            /*// То же самое, но в соответствии - для удобства поиска
            */
            //СоотвСумм = Новый Соответствие;
            //Инд=0;
            while(true/*Инд< Таб.Колонки.Количество()*/)
            {
                //Колонка = Таб.Колонки[Инд];
                /*// Имя колонки не совпадает с количеством и колонками стоимости
            */
                if(true/*ВРег(Колонка.Имя) <> ВРег("Количество")*/)
                {
                    /*// Это колонка суммы
            */
                    if(true/*СоотвСумм[Колонка.Имя] <> Неопределено*/)
                    {
                        //Инд = Инд+1;
                    }
                    /*// Колонки, оканчивающиеся на ПрефиксПараметровНовогоСостояния - правые (новое состояние), им должны соответствовать такие же левые, оканчивающиеся на ПрефиксПараметровНовогоСостояния
            */
                    if(true/*Прав(Колонка.Имя, СтрДлина(ПрефиксПараметровНовогоСостояния)) = ПрефиксПараметровНовогоСостояния*/)
                    {
                        //ИмяСоответствующейКолонки=Лев(Колонка.Имя, СтрДлина(Колонка.Имя)-СтрДлина(ПрефиксПараметровНовогоСостояния));
                        if(true/*Таб.Колонки.Найти(ИмяСоответствующейКолонки)=Неопределено*/)
                        {
                            //Таб.Колонки.Добавить(ИмяСоответствующейКолонки, Колонка.ТипЗначения);
                        }
                        /*// И наоборот, колонки, не оканчивающиеся на ПрефиксПараметровНовогоСостояния - левые (новое состояние), им должны соответствовать такие же правые, оканчивающиеся на ПрефиксПараметровНовогоСостояния
            */
                    }
                }
                //Инд=Инд+1;
            }
            /*// В таблице перемещений заменим параметры состояний индексами состояний, сами параметры будут храниться в СоотвПараметровСостояний
            */
            //Таб.Колонки.Добавить("Источник", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9,0)));
            //Таб.Колонки.Добавить("Приемник", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9,0)));
            //СоотвПараметровСостояний = Новый Соответствие;
            /*// "Свернем" встречные перемещения: вместо двух перемещений типа 1->2 и 2->1 оставим одно
            */
            /*// с количеством |Кол12 - Кол21| в направлении большего перемещения.
            */
            /*// Проведем следующее преобразование: повернем пары так, чтобы количество перемещения стало положительным
            */
            /*// "Свертка" встречных перемещений
            */
            //Инд=0;
            //КолВо = Таб.Количество();
            while(true/*Инд<КолВо*/)
            {
                //Инд2 = Инд+1;
                while(true/*Инд2<КолВо*/)
                {
                    //Строка2 = Таб[Инд2];
                    //Строка  = Таб[Инд];
                    /*// Если найдено соответствующее встречное перемещение
            */
                    if(true/*Строка.Источник = Строка2.Приемник
                И Строка.Приемник = Строка2.Источник*/)
                    {
                        if(true/*Строка.Количество>Строка2.Количество*/)
                        {
                            //УменьшитьНаКоличество = Строка2.Количество;
                        }
                        //Строка.Количество  = Строка.Количество  - УменьшитьНаКоличество;
                        //Строка2.Количество = Строка2.Количество - УменьшитьНаКоличество;
                        /*// На этом обход можно прервать: быть не более одной пары встречных перемещений
            */
                    }
                }
                /*;

            Инд = Инд+1;*/
            }
            /*// Удалим обнулившиеся строки
            */
            /*// Удаляем только строки со всеми нулевыми суммами и нулевым количеством
            */
            //КолВо = Таб.Количество();
            //Инд=0;
            while(true/*Инд<КолВо*/)
            {
                //Строка  = Таб[Инд];
                //НеНужноУдалять = Строка.Количество<>0;
                if(true/*Не НеНужноУдалять*/)
                {
                }
                if(true/*Не НеНужноУдалять*/)
                {
                    //Таб.Удалить(Строка);
                    //КолВо = КолВо-1;
                }
            }
            /*// Получили таблицу перемещений в требуемом формате
            */
            //ТаблицаПеремещений = Таб;
            /*// Таблица перемещений содержит несколько несвязанных частей, относящихся к отдельным партиям - строкам таблицы ТаблицаТоваров
            */
            /*// Обработка перемещений: разрыв контуров
            */
            /*// Получим наборы смежных вершин для каждой вершины
            */
            /*// Соотв СмежныеВершины Вершина, СмежныеВершины
            */
            //Источники = Новый Соответствие;
            //Приемники = Новый Соответствие;
            //МассивНачалДеревьев = Новый Массив;
            /*// Чтобы рассчитать перемещения, заменим каждый связный граф перемещений его остовным деревом
            */
            /*// Для этого обойдем их все, найдем и разорвем все контуры по предложенному выше правилу.
            */
            /*// После этого таблица содержит незамкнутую последовательность перемещений.
            */
            /*// Стоимость перемещений с количеством = 0 в таблице тоже должна быть приведена к 0.
            */
            //СтСумм = Новый Структура;
            /*// структура сумм
            */
            /*// Теперь нужно выделить отдельные деревья, определить среднюю стоимость для каждого дерева,
            */
            /*// и начиная с самого начала каждого дерева последовательно рассчитать стоимость для каждого состояния/перемещения
            */
            /*// Найдем начало каждого дерева - его нет в приемниках
            */
            /*// На данном этапе нужна информация о начальном состоянии и внешнем поступлении в каждую вершину
            */
            /*// Будем использовать список вершин, для каждой из которых указаны смежные вершины - приемники и
            */
            //Вершины = Новый Соответствие;
            /*// здесь нам понадобится общее количество источников, приемники
            */
            /*// В структуру Вершины нужно добавить данные о начальном остатке и внешнем поступлении для каждого из состояний,
            */
            /*// Можно также добавить состояний, не участвовавших в перемещениях, тогда для них тоже будет рассчитано внешнее списание
            */
            //МассивДобавленныеВершины = Новый Массив;
            //ДобавитьНачальныйОстатокИВнешнееПоступление(ТаблицаТоваров, Вершины, СоотвПараметровСостояний, ДатаНач, ДатаКон, СтруктураДопПараметров, МассивДобавленныеВершины);
            /*// Добавдленные состояния возвращаются специальным массивом, который добавляется к началам деревьев
            */
            /*// Теперь будем обходить деревья с начала, и рассчитывать состояния и переходы между ними
            */
            /*// Сформируем движения по спецодежде
            */
            //ПроцедурыПогашенияСтоимости.ПогашениеСтоимостиПриПередачеВЭксплуатацию(СтруктураДопПараметров, СтруктураДопПараметров.ТаблицаСписанныхПартийСпецодежды);
        }
КорректировкаСтоимости