РК_ЗагрузкаОстатков 1.3.1.102: свернуть комиссионные остатки (#19).
Команда на форме: пары −/+ без/с серией и группы net≈0 перед сопоставлением. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -271,6 +271,110 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Схлопывает строки ТЧ ВходящиеКомиссионныеТовары:
|
||||
// 1) отрицательная без серии + положительная с серией (|qty| равны) — обе удаляются;
|
||||
// 2) оставшиеся группы с net qty ≈ 0 — все строки группы удаляются.
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура - БылоСтрок, СталоСтрок, УдаленоСтрок, УдаленоПар, УдаленоГруппNetZero
|
||||
//
|
||||
Функция СвернутьКомиссионныеОстатки() Экспорт
|
||||
|
||||
Результат = Новый Структура;
|
||||
Результат.Вставить("БылоСтрок", ВходящиеКомиссионныеТовары.Количество());
|
||||
Результат.Вставить("СталоСтрок", 0);
|
||||
Результат.Вставить("УдаленоСтрок", 0);
|
||||
Результат.Вставить("УдаленоПар", 0);
|
||||
Результат.Вставить("УдаленоГруппNetZero", 0);
|
||||
|
||||
Если Результат.БылоСтрок = 0 Тогда
|
||||
Возврат Результат;
|
||||
КонецЕсли;
|
||||
|
||||
Удаляемые = Новый Соответствие;
|
||||
|
||||
Группы = Новый Соответствие;
|
||||
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
|
||||
Ключ = КлючАналитикиКомиссионнойСтроки(СтрТ);
|
||||
СтрокиГруппы = Группы.Получить(Ключ);
|
||||
Если СтрокиГруппы = Неопределено Тогда
|
||||
СтрокиГруппы = Новый Массив;
|
||||
Группы.Вставить(Ключ, СтрокиГруппы);
|
||||
КонецЕсли;
|
||||
СтрокиГруппы.Добавить(СтрТ);
|
||||
КонецЦикла;
|
||||
|
||||
Для Каждого ЭлементГруппы Из Группы Цикл
|
||||
СтрокиГруппы = ЭлементГруппы.Значение;
|
||||
Помеченные = Новый Соответствие;
|
||||
|
||||
Отрицательные = Новый Массив;
|
||||
ПоложительныеССерией = Новый Массив;
|
||||
Для Каждого СтрТ Из СтрокиГруппы Цикл
|
||||
Если Помеченные.Получить(СтрТ) <> Неопределено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
Кол = СтрТ.Количество;
|
||||
Если Кол < 0 И Не СерияЗаполненаВСтрокеКомиссии(СтрТ) Тогда
|
||||
Отрицательные.Добавить(СтрТ);
|
||||
ИначеЕсли Кол > 0 И СерияЗаполненаВСтрокеКомиссии(СтрТ) Тогда
|
||||
ПоложительныеССерией.Добавить(СтрТ);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Для Каждого НегСтр Из Отрицательные Цикл
|
||||
Если Помеченные.Получить(НегСтр) <> Неопределено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
НужноеКол = -НегСтр.Количество;
|
||||
Для Каждого ПозСтр Из ПоложительныеССерией Цикл
|
||||
Если Помеченные.Получить(ПозСтр) <> Неопределено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
Если ПозСтр.Количество = НужноеКол Тогда
|
||||
Помеченные.Вставить(НегСтр, Истина);
|
||||
Помеченные.Вставить(ПозСтр, Истина);
|
||||
Результат.УдаленоПар = Результат.УдаленоПар + 1;
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
КонецЦикла;
|
||||
|
||||
Остаток = Новый Массив;
|
||||
СуммаКол = 0;
|
||||
Для Каждого СтрТ Из СтрокиГруппы Цикл
|
||||
Если Помеченные.Получить(СтрТ) <> Неопределено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
Остаток.Добавить(СтрТ);
|
||||
СуммаКол = СуммаКол + СтрТ.Количество;
|
||||
КонецЦикла;
|
||||
|
||||
Если Остаток.Количество() > 1 И Abs(СуммаКол) < 0.000001 Тогда
|
||||
Для Каждого СтрТ Из Остаток Цикл
|
||||
Помеченные.Вставить(СтрТ, Истина);
|
||||
КонецЦикла;
|
||||
Результат.УдаленоГруппNetZero = Результат.УдаленоГруппNetZero + 1;
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого ЭлементПометки Из Помеченные Цикл
|
||||
Удаляемые.Вставить(ЭлементПометки.Ключ, Истина);
|
||||
КонецЦикла;
|
||||
КонецЦикла;
|
||||
|
||||
Для Инд = ВходящиеКомиссионныеТовары.Количество() - 1 По 0 Цикл
|
||||
СтрТ = ВходящиеКомиссионныеТовары[Инд];
|
||||
Если Удаляемые.Получить(СтрТ) <> Неопределено Тогда
|
||||
ВходящиеКомиссионныеТовары.Удалить(Инд);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Результат.УдаленоСтрок = Удаляемые.Количество();
|
||||
Результат.СталоСтрок = ВходящиеКомиссионныеТовары.Количество();
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Создание документов ВводОстатковТоваров по сопоставленным строкам.
|
||||
// Собственные — 1 документ на склад; комиссия 2.5 — 1 документ на соглашение+партнёра (без склада).
|
||||
// Количество в документе — финансовое (rh_), если не 0, иначе складское.
|
||||
@@ -1177,6 +1281,38 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция КлючАналитикиКомиссионнойСтроки(СтрТ)
|
||||
|
||||
Возврат Строка(СтрТ.НоменклатураИдентификатор) + "|"
|
||||
+ СокрЛП(СтрТ.НоменклатураКод) + "|"
|
||||
+ СокрЛП(СтрТ.Артикул) + "|"
|
||||
+ Строка(СтрТ.СоглашениеИдентификатор) + "|"
|
||||
+ СокрЛП(СтрТ.СоглашениеНаименование) + "|"
|
||||
+ Строка(СтрТ.ПартнерИдентификатор) + "|"
|
||||
+ СокрЛП(СтрТ.ПартнерНаименование) + "|"
|
||||
+ Строка(СтрТ.КонтрагентИдентификатор) + "|"
|
||||
+ СокрЛП(СтрТ.КонтрагентНаименование) + "|"
|
||||
+ Строка(СтрТ.ОрганизацияИдентификатор) + "|"
|
||||
+ Строка(СтрТ.СкладИдентификатор) + "|"
|
||||
+ Строка(СтрТ.ХарактеристикаИдентификатор) + "|"
|
||||
+ СокрЛП(СтрТ.ГТД) + "|"
|
||||
+ СокрЛП(СтрТ.Назначение) + "|"
|
||||
+ СокрЛП(СтрТ.ВидЗапасов);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СерияЗаполненаВСтрокеКомиссии(СтрТ)
|
||||
|
||||
Если ЗначениеЗаполнено(СтрТ.СерияИдентификатор) Тогда
|
||||
Возврат Истина;
|
||||
КонецЕсли;
|
||||
Если Не ПустаяСтрока(СокрЛП(СтрТ.Серия)) Тогда
|
||||
Возврат Истина;
|
||||
КонецЕсли;
|
||||
Возврат Не ПустаяСтрока(СокрЛП(СтрТ.СерияНомер));
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция БулевоИзЗначения(Значение)
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Булево") Тогда
|
||||
|
||||
Reference in New Issue
Block a user