В продолжении извечной темы обработки данных из 1С, на базе функции Зеленского
У меня есть много выгрузок из 1С, в принципе воспользовавшися функцией Максима я их уже обработал, но получилось очень сложная конструкция и есть желание ее упростить.
Код
let
Sourse = Excel.CurrentWorkbook(){[Name="Account_20"]}[Content],
ReplaceValue = Table.ReplaceValue(Sourse, each [Column1], each if [Статьи затрат] = "Обороты" then Number.From(List.Max(Company[Column1]))+1 else [Column1],Replacer.ReplaceValue,{"Column1"}),
SelectColumns = Table.SelectColumns(ReplaceValue,{"Column1", "Статьи затрат", "Код", "BalansO_D", "BalansO_K", "Turnover_D", "Turnover_K", "BalansE_D", "BalansE_K", "Comp", "Period"}),
Trim = Table.TransformColumns(SelectColumns,{{"Статьи затрат", each Text.Trim(_, {" "}), type text}}),
Headers = List.Buffer( List.Transform({0..List.Max(Trim[Column1])}, Text.From ) ),
ReplacedValue = Table.ReplaceValue(Trim,null,0,Replacer.ReplaceValue,{"Column1"}),
AddedRecs = Table.AddColumn(ReplacedValue, "recs", each Record.FromList( List.ReplaceRange( List.Repeat({null},List.Count(Headers)), [Column1], 1, {[Статьи затрат]} ), Headers ), type record ),
ExpandedRecs = Table.ExpandRecordColumn(AddedRecs, "recs", Headers ),
AddIndex = Table.AddIndexColumn(ExpandedRecs, "Индекс", 1, 1),
FillDown = Table.FillDown(AddIndex,{"0"}),
Group = Table.Group(FillDown, {"0"}, {{"Tab", each _, type table}}),
ReplaceN = Table.ReplaceValue(Group, each [Tab], each Table.FillDown([Tab], {"1"}),Replacer.ReplaceValue,{"Tab"}),
RemoveColumns = Table.RemoveColumns(ReplaceN,{"0"}),
Expand = Table.ExpandTableColumn(RemoveColumns, "Tab", {"Column1", "Статьи затрат", "Код", "BalansO_D", "BalansO_K", "Turnover_D", "Turnover_K", "BalansE_D", "BalansE_K", "Comp", "Period", "0", "1", "2", "3", "4", "5", "6", "7", "8", "Индекс"}, {"Column1", "Статьи затрат", "Код", "BalansO_D", "BalansO_K", "Turnover_D", "Turnover_K", "BalansE_D", "BalansE_K", "Comp", "Period", "0", "1", "2", "3", "4", "5", "6", "7", "8", "Индекс"})
in
Expand
Обрабатываю я данные через группировку по каждому уровню с последующим FillDown внутри вложенных таблиц по последующему уровню (см. последние четыре строки).
Как данные строки запустить через цикл по каждому уровню? Помогите пожалуйста.
Михаил Л, Такой алгоритм дает ошибку, так как при FillDown возникает ошибка на таблицах где строки с разным уровнем группировки. Именно поэтому я пошел через Группировку.
upd. Еще раз на всякий случай проверю, чтоб не быть голословным
Вроде так собираются обороты нормально в вашем случае, но если балансы не на нижнем уровне - х.з., что с ними делать. Чтобы не потерялся столбец Код, прицепил его к "Статьи затрат".
Михаил Л, Извиняюсь за некорректный пример (вы не могли проверить корректность) - пронумеровал все статьи и подсветил ошибку в файле если использовать предложенный вариант. Максим Зеленский, Добавил итоговый результат.
Максим Зеленский, Такой алгоритм выдает ошибку, так как FillDown не имеет ограничения снизу если последующая статья имеет меньшее количество группировок. Тогда самая крайняя группировка заползает на последующую статью создает в ней не существующий уровень. Файл во вложении - подсветил.
UPD 2 Добавил скрины - по ним видно что появились два доп уровня там где их не должно быть
UPD1. Именно поэтому использовал Группировку и FillDown по вложенной таблице - которая и ограничивает заполнение своим размером.