Получение значений всех полей в иерархии структуры отчета

Публикация № 1202398

Разработка - Практика программирования

СКД Расшифровка Значения

При обработке расшифровки данных в отчете (да и не только отчете), основанном на СКД, может потребоваться получить значения всех полей, находящихся в текущей группировке и её родителях. Представляю вашему вниманию алгоритм, выполняющий эту задачу. Как говорится, "просто оставлю это здесь".

Потребовалось мне реализовать гибкую систему расшифровок отчёта, в которой для каждой ячейки, в зависимости от значений полей в иерархии этой ячейки становится доступным то или иное действие. Задача не простая, но и не сказать, чтобы сложная, однако я наткнулся на сложность определения полей, находящихся в детальных записях. Если для получения значения полей группировок достаточно получить все поля всех родителей данной ячейки, то для детальных записей такого простого способа нет -- нужно определить значения всех "братьев" обрабатываемой ячейки. Также надо учесть, что детальные записи могут располагаться в иерархии других детальных записей.

С алгоритмической точки зрения задача тоже не сложная, но структура данных расшифровки СКД не способствует простому решению этой задачи. В итоге родился представляемый алгоритм. Не могу утверждать, что он вполне верный, т. к. я недостаточно хорошо владею СКД: структурой данных, данными расшифровок и настройками, а также в силу "странной" структуры данных расшифровки СКД. Однако поставленную задачу этот алгоритм решает.

Сподвигло меня оставить этот алгоритм здесь отсутствие его уже готового на просторах интернета при небольшой, но востребованности, и вполне универсальное его назначение.

&НаСервере
Функция ЗначенияПолей(ДанныеРасшифровки, Расшифровка)
    
    Результат = Новый Соответствие;
    
    ОбработанныеЭлементы = Новый Массив;
    
    ПоляРасшифровки(ДанныеРасшифровки, Расшифровка, Результат, ОбработанныеЭлементы);
    
    Возврат Результат;
    
КонецФункции

&НаСервере
Процедура ПоляРасшифровки(ДанныеРасшифровки, Расшифровка, Поля, ОбработанныеЭлементы, ОбрабатыватьБратьев = Истина)
    
    Если ОбработанныеЭлементы.Найти(Расшифровка) = Неопределено Тогда
        ОбработанныеЭлементы.Добавить(Расшифровка);
    Иначе
        Возврат;
    КонецЕсли;
    
    ЭлементРасшифровки = ДанныеРасшифровки.Элементы.Получить(Расшифровка);
    
    Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
        ПоляЭлемента = ЭлементРасшифровки.ПолучитьПоля();
        ДополнитьПоляРасшифровки(ПоляЭлемента, Поля);
    ИначеЕсли ТипЗнч(ЭлементРасшифровки) = Тип("ЗначенияПолейРасшифровкиКомпоновкиДанных") Тогда
        ДополнитьПоляРасшифровки(ЭлементРасшифровки, Поля);
        Возврат;
    КонецЕсли;
    
    Родители = ЭлементРасшифровки.ПолучитьРодителей();
    Для каждого Родитель Из Родители Цикл
        
        Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
            
            РодителиТекущегоУзла = РодителиУзлаВМассив(ЭлементРасшифровки);
            
            Инд = Число(ЭлементРасшифровки.Идентификатор) - 1;
            Пока Инд >= 0 Цикл
                
                РодителиПроверяемогоУзла = РодителиУзлаВМассив(ДанныеРасшифровки.Элементы.Получить(Инд));
                
                Если МассивыСовпадают(РодителиТекущегоУзла, РодителиПроверяемогоУзла) Тогда
                    ПоляРасшифровки(ДанныеРасшифровки, Инд, Поля, ОбработанныеЭлементы, Ложь);
                Иначе
                    Прервать;
                КонецЕсли;
                
                Инд = Инд - 1;
                
            КонецЦикла;
            
        Иначе
            
            Если ОбрабатыватьБратьев  Тогда
                
                Братья = НайтиБратьев(ДанныеРасшифровки, Родитель.Идентификатор, Расшифровка);
                Для каждого Брат Из Братья Цикл
                    ПоляРасшифровки(ДанныеРасшифровки, Брат, Поля, ОбработанныеЭлементы, Ложь);
                КонецЦикла;
                
            КонецЕсли;
            
        КонецЕсли;
        
        ПоляРасшифровки(ДанныеРасшифровки, Родитель.Идентификатор, Поля, ОбработанныеЭлементы, Истина);
        
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Функция РодителиУзлаВМассив(Узел)
    
    Результат = Новый Массив;
    
    СписокРодителей = Узел.ПолучитьРодителей();
    
    Для каждого Родитель Из СписокРодителей Цикл
        Результат.Добавить(Число(Родитель.Идентификатор));
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

&НаСервере
Функция МассивыСовпадают(Массив1, Массив2)
    
    Если Массив1.Количество() <> Массив2.Количество() Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Для каждого ИД Из Массив1 Цикл
        Если Массив2.Найти(ИД) = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Истина;
    
КонецФункции

&НаСервере
Функция НайтиБратьев(ДанныеРасшифровки, Родитель, ТекущийЭлемент)
    
    Результат = Новый Массив;
    
    Для каждого ЭлементРасшифровки Из ДанныеРасшифровки.Элементы Цикл
        
        Если ЭлементРасшифровки.Идентификатор = ТекущийЭлемент Тогда
            Продолжить;
        КонецЕсли;
        
        Родители = ЭлементРасшифровки.ПолучитьРодителей();
        Для каждого ОбрабатываемыйРодитель Из Родители Цикл
            Если ОбрабатываемыйРодитель.Идентификатор = Родитель Тогда
                Результат.Добавить(ЭлементРасшифровки.Идентификатор);
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

&НаСервере
Процедура ДополнитьПоляРасшифровки(ЭлементРасшифровки, Поля)
    
    Для каждого ПолеЗначения Из ЭлементРасшифровки Цикл
        
        Если Поля.Получить(ПолеЗначения.Поле) = Неопределено Тогда
            Поля.Вставить(ПолеЗначения.Поле, ПолеЗначения.Значение);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

 

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 28.02.20 17:47 Сейчас в теме
неплохо, правда метод

Функция НайтиБратьев() - не толерантно, девочки могут засудить.
Предлагаю переименовать в
НайтиОтпрысков() или
НайтиПотомков()

пора пора создавать новый раздел "О боже, как я прекрасен"
Оставьте свое сообщение

См. также

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

СКД - одна из проблем связи Наборов данных

Статья Программист Нет файла v8::СКД 1cv8.cf Россия Бесплатно (free) Практика программирования

Официальная информация: 1. В схеме компоновки данных нет указания типа связи. Все связи считаются ЛЕВЫМИ внешними соединениями. 2. Если для вложенного набора данных указано условие фильтра, тогда связь вложенного набора данных с родительским набором данных считается ВНУТРЕННЕЙ. Или как получить все результаты основного набора при отборе в зависимом.

03.03.2020    2208    BelikovSA    9       

Для чего нужен флаг "Автозаполнение" в СКД и каких проблем без него можно избежать

Статья Программист Стажер Нет файла v8 v8::СКД Бесплатно (free) Практика программирования

Речь пойдет о флаге «Автозаполнение» в наборе данных Запрос Системы компоновки данных (СКД). Сразу хочу отметить, что флаг «Автозаполнение» доступен только в наборе данных - Запрос.

26.02.2020    3542    Neti    41       

Екатеринбург.Online: Голосование продолжается Промо

Продолжается голосование за доклады на INFOSTART MEETUP Екатеринбург.Online! Лучшие из них попадут в окончательную программу онлайн-митапа! Присоединяйтесь к голосованию и покупайте билеты - 3 000 рублей за 8 часов продуктивной пятницы!

3000

Программная работа с настройками СКД

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    9618    ids79    26       

[СКД] Программное создание схемы компоновки данных

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    11189    John_d    22       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

СКД. Лайфхак №2. Собираем отчет еще удобнее

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

В этой публикации я хочу вам описать еще один интересный и относительно новый подход к одному из довольно тривиальных методов работы с СКД для построения отчетов.

20.11.2019    7622    aximo    15       

Некоторые редко используемые возможности СКД

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

В статье перечислены некоторые возможности СКД, которые позволят расширить круг решаемых при помощи этого механизма задач. Здесь показано, как использовать папки полей, и предложена альтернатива некоторым функциям языка выражений СКД.

11.11.2019    8625    kser87    39       

DevOps для 1С. Онлайн-курс проходит с 16 апреля по 11 июня 2020 года. Промо

Данный онлайн-курс предусматривает изучение процессов DevOps, их применение при разработке на платформе 1С. В результате прохождения онлайн-курса вы сможете: настроить ПО необходимое для проведения проверок и тестирования, создавать сценарии тестирования и объединять их в комплексные процессы, создавать скрипты для автоматизации процессов DevOps.

12000 рублей

Лайфхак работы с СКД. Собираем отчет.

Статья Программист Бизнес-аналитик Пользователь Стажер Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

В этой статье я опишу небольшой "лайфхак" по сборке отчетов в СКД. Думаю, этот подход будет интересен тем, кто хочет быстро оформить отчет.

25.10.2019    12712    aximo    29       

Немного про СКД. Характеристики и проверка пустого отчета

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пример использования характеристик в СКД и программная работа с ними. А также описание проверки результата отчета на заполненность.

10.10.2019    7532    YPermitin    7       

1C:Предприятие для программистов: Расчетные задачи (зарплата). Онлайн-интенсив с 01 по 17 июня 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, которые предназначены для автоматизации периодических расчетов, а именно - для расчета зарплаты. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей прикладного решения “1С:Зарплата и управление персоналом” и прочих прикладных решений, в которых реализован функционал расчета зарплаты.

4900 рублей

Полезняшки по СКД и построителям. Просто код

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Универсальные функции

Полезные процедуры и функции для работы с построителями и СКД. Просто исходник.

10.10.2019    7066    Yashazz    45       

Две схемы СКД в одном отчете с пользовательскими параметрами

Статья Программист Нет файла v8::СКД Россия Бесплатно (free) Практика программирования

Простая реализация разных по типу отчетов в одном. Применение нескольких схем компоновки с корректной передачей пользовательских параметров.

10.10.2019    5664    evgeni-red    7       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Три способа создания одного отчета на СКД

Статья Программист Нет файла v8 v8::СКД ERP2 УТ11 КА2 Бесплатно (free) Практика программирования

СКД имеет столько возможностей, что часто приходится выбирать, каким образом строить отчет. Причем выбор не всегда очевидный. В статье рассмотрен пример построения отчета «Отрицательные остатки по товарам на момент проведения расходных документов» тремя разными способами. Приведены «За» и «Против» каждого варианта решения задачи.

08.10.2019    9574    ids79    24       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

СКД не только для отчетов

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

СКД позволяет получать данные из информационной базы не только для вывода в отчеты, но и для других целей. Пример такого использования рассматривается в настоящей статье.

18.09.2019    14697    YPermitin    34       

Онлайн-интенсив "1C:Предприятие для программистов: Бухгалтерские задачи" с 22 июня по 8 июля 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, которые предназначены для решения задач бухгалтерского учета. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей прикладного решения “1С:Бухгалтерия” и прочих прикладных решений, в которых реализованы соответствующие механизмы для автоматизации бухгалтерских задач.

4900 рублей

Агрегатные функции СКД, о которых мало кто знает

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    31281    ids79    50       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    43853    ids79    36       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    34339    ids79    11       

Лучшие программы за прошедший месяц Промо

Инфостарт подготовил ТОП-25 самых продаваемых и популярных на текущий момент программ. При формировании списка учитывается аналитика продаж и запросы клиентов за последний месяц.

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    23855    ids79    27       

Пользовательские настройки системы компоновки данных

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Работа с интерфейсом

Работа с отчетами в пользовательском режиме, формы отчетов. Понятие пользовательских настроек в отчетах на СКД. Определение состава пользовательских настроек для разделов в целом и для отдельных элементов, для всего отчета и для отдельных группировок. Видимость функциональных опций в отчетах на СКД.

09.07.2019    16187    ids79    2       

Базовый курс для начинающих 1С-программистов. Онлайн-интенсив со 2 июня по 2 июля 2020 г. Промо

Данный онлайн-курс является начальной ступенью по изучению базовых принципов программирования в системе “1С:Предприятие” и предназначен для обучения 1С-программированию “с нуля”.

4500-9500 рублей

"Меньше копипаста!", или как Вася универсальную процедуру писал

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    14801    SeiOkami    49       

Работа с настройками системы компоновки данных

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    28381    ids79    9       

Базовый курс по обмену данными в системе 1С:Предприятие. Онлайн-интенсив с 12 по 28 мая 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, обеспечивающих обмен данными между различными прикладными 1С-решениями и взаимодействие с другими информационными системами. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”.

5500 рублей

Создание отчетов с помощью СКД - основные понятия и элементы

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    36819    ids79    17       

Не провоцируйте СКД, или пример "как не надо"

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Пример того, что не нужно использовать в запросах, чтобы не провоцировать СКД.

10.06.2019    10866    SeiOkami    95