Страницы: 1
RSS
Преобразование сводной таблицы из 1с в плоскую/линейную таблицу
 
Доброго времени суток!

Возникла нерешаемая проблема с преобразованием данных в список.

Формируется отчет по закупкам из 1С, в виде готовой сводной таблицы, со 150000 строками, их необходимо преобразовать в плоскую таблицу для дальнейшей работы.

По настройкам в 1С ничего не нашел, в программировании VBA пока не разбираюсь (обещаю исправиться), вручную долго, отчеты иногда формирую в течение всего дня, копируя и вставляя данные в столбцы.

Просьба помочь, заранее Всем благодарен!
Изменено: Askabara - 24.02.2018 18:53:58
 
Без компа сейчас,  но и для своих целей и недавно на форуме делал. Делается не сложно. UDF для определения identlevel и рядом строится плоская таблица с повторением предыдущих уровней. Ну или макрос.https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=101531&a...
Изменено: БМВ - 24.02.2018 10:54:47
По вопросам из тем форума, личку не читаю.
 
А где таблица на входе и таблица на выходе? В вашем примере несколько заполненных строк и всё.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Один хороший человек на форуме - Чебыкин Владимир - выложил отличную инструкцию: "Инструкция для формирования плоской таблицы в 1С 8.xlsx"!
Инструкция по настройке выгрузки отчетов в 1С8 в формате плоской таблицы
Не нужны никакие UDF и прочие заморочки!
Изменено: Мотя - 25.02.2018 18:31:17
 
Мотя, соглашусь, что вместо того чтоб исправлять данные, надо их не каверкать, но есть два варианта, или указанное не проделать, или это более трудоемко, чем переработать. Вот тогда на помощь приходит Excel.
По вопросам из тем форума, личку не читаю.
 
Судя по всему, Askabara,  регулярно делает экспорт из 1С.
Полагаю, это - его ежедневная (еженедельная / ежемесячная работа).
Значит, это работа должна быть доведена до "автоматизма", чтобы быть всегда успешно выполненной.
Я - сторонник минимальных телодвижений, если условия работы это позволяют.
А также - сторонник исключения "рукопашной" работы пользователя. :D
 
Да, отчеты приходится выгружать ежедневно, и мне хотелось бы минимизировать человеческий фактор. По той инструкции я пробовал формировать отчет, но ничего из этого у меня не получилось, потому что данные находятся в папках, названия брендов/типы/категории никак не систематизированы в базе, из-за чего при формировании плоской таблицы выходит лишь список артикулов без привязки и указания иерархии. Изначально таблица формируется в виде сводной таблицы с группировкой данных, может быть есть способы, с помощью которых получится имеющуюся группировку каким-то образом разбить по столбцам? Строк больше 150000, из-за ограничений форума выложил лишь маленькую часть имеющихся данных. Было бы хорошо, если хотя бы подсказали, в каком направлении двигаться) Как я понял, без кода мне тут никак мне не справиться...  
Изменено: Askabara - 25.02.2018 12:33:39
 
Дополнительно прилагаю таблицу на входе и таблицу на выходе
Изменено: Askabara - 25.02.2018 12:56:38
 
На словаре с коллекцией, строго под строение примера, т.е. на 5 уровней!
Код
Option Explicit


Sub tt()
    Dim c As Range
    Dim t0$, t1$, t2$, t3$, t$
    Dim d As Object, k, el, i&
    Set d = CreateObject("Scripting.Dictionary"): d.comparemode = 1

    For Each c In [b10].CurrentRegion.Columns(1).Cells
        Select Case c.IndentLevel
        Case 0: t0 = c.Value: t1 = Empty: t2 = Empty: t3 = Empty: t = Empty
        Case 1: t1 = c.Value
        Case 2: t2 = c.Value
        Case 3: t3 = c.Value
        Case 4
            t = t0 & "|" & t1 & "|" & t2 & "|" & t3
            If Not d.exists(t) Then d.Add t, New Collection
            d.Item(t).Add c.Value
        End Select
    Next
    If d.Count Then
        Application.ScreenUpdating = False
        With Workbooks.Add(1).Sheets(1)
            For Each k In d.keys
                For Each el In d.Item(k)
                    i = i + 1
                    .Cells(i, 1).Resize(, 4) = Split(k, "|")
                    .Cells(i, 5) = el
                Next
            Next
            .Columns.AutoFit
        End With
        Application.ScreenUpdating = True
    End If
End Sub

Это вторая версия - добавил коллекцию для случая если несколько товаров пятого уровня (почему этого нет в примере?).
Изменено: Hugo - 25.02.2018 17:14:49
 
Приношу прощения, что не все нюансы указал, уважаемый Hugo - то, что Вы сделали, действительно волшебство, очень благодарен Вам, это действительно круто!

Со вчерашнего дня зачитываюсь литературой и смотрю видео по VBA, хоть мутно, но немножко начал понимать Ваш код - чтобы весь расщелкать, потребуется недели две, наверное)

А можете подсказать, дополнительно в код что добавить, чтобы учитывались до 10 уровней с разным количеством строк, а также данные в последующих столбцах?

Заранее благодарю
 
Да уровней там как было 5, так и осталось.
А чтоб получить результат как в новом примере - вот такие должны быть строки 19 и 29:
Код
d.Item(t).Add c.Resize(, 12).Value
.Cells(i, 5).Resize(, 12) = el

Ну а так без примера с 10-ю уровнями могу спрогнозировать что вероятно достаточно по аналогии нарастить select case и формирование переменной t.
Изменено: Hugo - 26.02.2018 14:05:45
 
Askabara,  думаю стоит уточнить
Цитата
Askabara написал:
чтобы учитывались до 10 уровней с разным количеством строк
Ну если до 10 уровней это понятно при этом лучше сразу рассчитывать на любую вложенность, хотя может быть существенным  разное количество уровней иерархии в разных группах. что чуть усложняет определение искомой строки с данными.
А что вы под разным количеством строк имели в виду?

Hugo, как немакрукшник макрушнику :-) , приходилось делать подобное и я тогда рекурсивно подходил с передачей родильских уровней и формированием запаздывания с выводом. То есть строка с данными  - последний потомок, это тогда, когда номер уровня или равен или сменился на меньший  и если был хоть один потомок, то это родитель и его пропускаем. Но у меня был подвох, могли быть "уровни" без дочерних элементов. приходилось еще и формат ячейки отслеживать.
Изменено: БМВ - 26.02.2018 14:23:16
По вопросам из тем форума, личку не читаю.
 
Я как-то не особо долго думал - в начале планировал что-то на словарях в словарях (и с рекурсией/подпроцедурой), но плюнул ибо заумно, да и просто на одном словаре отработало.
Потом добавил коллекцию, хотя пример её не требвал.
Изменено: Hugo - 26.02.2018 14:27:59
 
Не ради рекламы - делал в своей надстройке, там можно сколько угодно уровней сделать и вывести по разному: Подготовить таблицу - строки
Названия заголовков спецом не выдумывал, но можно назначить любые.
Надстройка платная, но 30 дней будет работать на полную без проблем.
Для конкретно последнего примера настройки выглядят так(скрин во вложении)
Изменено: Дмитрий Щербаков - 26.02.2018 14:44:02
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо за заинтересованность данной темой.

Под несколькими строками я имел ввиду, что товаров может быть от двух до 100 в последней группе, либо подгруппа может содержать от 1 до 10 наименований, т.е. предыдущие группировки могут содержать несколько наименований, разветвлений, их может быть разное количество, например может быть просто обувь - адидас, либо обувь - мужская - спортивная - адидас к примеру. Также в некоторых группах может быть 6 разделов, в некоторых 7, соответственно при формировании линейной таблицы данные могут быть смещены относительно друг друга, и для такого случая возможно ли будет спрограммировать таким образом, чтобы данные с цифрами/числами, начинающиеся со второго столбца в начальной таблице, в линейной таблице подтягивались после крайнего столбца с данными, т.е., если будет 7 группировок, то цифровые данные в том же порядке начинались с 8-го столбца, к примеру...

Если потребуется примерная структура с возможными сценариями, я могу вручную сформировать и разместить
 
Нужен пример.
 
Прилагаю ссылку к файлу в облаке - https://drive.google.com/file/d/0B1Rmc6ad0P0-a0ZiVEd3MW1VRnFSTnUwMEo3blBVZmR1b1Bj/view?usp=drivesdk
 
Да, для такого зоопарка мой код не рассчитан... Там есть варианты вообще на 2 уровня, т.е. зоопарк от 2-х до 6-ти уровней.
P.S. Хотя вот вроде удалось скорректировать малой кровью на до 6-ти уровней:
Скрытый текст
Изменено: Hugo - 26.02.2018 22:59:47
Страницы: 1
Наверх