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.
*/
//СтСумм = Новый Структура;
/*// структура сумм
*/
/*// Теперь нужно выделить отдельные деревья, определить среднюю стоимость для каждого дерева,
*/
/*// и начиная с самого начала каждого дерева последовательно рассчитать стоимость для каждого состояния/перемещения
*/
/*// Найдем начало каждого дерева - его нет в приемниках
*/
/*// На данном этапе нужна информация о начальном состоянии и внешнем поступлении в каждую вершину
*/
/*// Будем использовать список вершин, для каждой из которых указаны смежные вершины - приемники и
*/
//Вершины = Новый Соответствие;
/*// здесь нам понадобится общее количество источников, приемники
*/
/*// В структуру Вершины нужно добавить данные о начальном остатке и внешнем поступлении для каждого из состояний,
*/
/*// Можно также добавить состояний, не участвовавших в перемещениях, тогда для них тоже будет рассчитано внешнее списание
*/
//МассивДобавленныеВершины = Новый Массив;
//ДобавитьНачальныйОстатокИВнешнееПоступление(ТаблицаТоваров, Вершины, СоотвПараметровСостояний, ДатаНач, ДатаКон, СтруктураДопПараметров, МассивДобавленныеВершины);
/*// Добавдленные состояния возвращаются специальным массивом, который добавляется к началам деревьев
*/
/*// Теперь будем обходить деревья с начала, и рассчитывать состояния и переходы между ними
*/
/*// Сформируем движения по спецодежде
*/
//ПроцедурыПогашенияСтоимости.ПогашениеСтоимостиПриПередачеВЭксплуатацию(СтруктураДопПараметров, СтруктураДопПараметров.ТаблицаСписанныхПартийСпецодежды);
}