[РЕШЕНО] Как получить поле компоновки из пользовательской настройки?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем X-Man, 17 авг 2016.

  1. TopicStarter Overlay
    X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    433
    Симпатии:
    3
    Баллы:
    29
    Здравствуйте. Требуется помощь специалистов по СКД. Ситуация следующая: есть отчет, в котором определены 2 схемы компоновки данных. Вторая схема является вспомогательной и используется для расчета промежуточных данных, использующихся в первой схеме. Работа со второй схемой осуществляется программно с выгрузкой результата компоновки в таблицу значений. Проблема в следующем: как из пользовательского отбора получить поле компоновки данных для того, чтобы понять, по какому полю устанавливать отбор во второй(вспомогательной) схеме? Обхожу циклом элементы пользовательских настроек, проверяю, что элемент является отбором, но в отладчике свойство пользовательского отбора ЛевоеЗначение=Неопределено. Правое значение заполнено в отладчике считывается корректно. То есть, я вижу, что есть отбор, вижу вид сравнения и правое значение, но не могу идентифицировать поле компоновки. Зацепиться за ТипЗнч(ЭлементПользовательскихНастроек.ПравоеЗначение) НЕ ПРЕДЛАГАТЬ.

    Код следующий:

    Код:
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
        //СтандартнаяОбработка = Ложь;
     
        СКДРасчетСДО = ПолучитьМакет("РасчетСДО");
     
        НастройкиРасчетСДО = СКДРасчетСДО.НастройкиПоУмолчанию;
        ПараметрыДанныхРасчетСДО = НастройкиРасчетСДО.ПараметрыДанных;
     
        ОтборыРасчетСДО = СКДРасчетСДО.НастройкиПоУмолчанию.Отбор.Элементы;
             
        КоллекцияЭлементовПользовательскихНастроек = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
        ФиксированныеНастройки                     = КомпоновщикНастроек.ФиксированныеНастройки;
        ПараметрыДанных                            = ФиксированныеНастройки.ПараметрыДанных;
     
        ЗначениеПараметраПериодАнализа = ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодАнализа"));
         
        Для Каждого ЭлементПользовательскихНастроек Из КоллекцияЭлементовПользовательскихНастроек Цикл
            Если ТипЗнч(ЭлементПользовательскихНастроек) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
                Если ЭлементПользовательскихНастроек.Параметр = Новый ПараметрКомпоновкиДанных("ПериодАнализа") Тогда
                 
                    ЗначениеПараметраПериодАнализа = ЭлементПользовательскихНастроек.Значение; 
                 
                КонецЕсли;
             
            ИначеЕсли ТипЗнч(ЭлементПользовательскихНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
             
                Если ЭлементПользовательскихНастроек.Использование Тогда
                    ОтборыРасчетСДО.Очистить();
                    НовыйЭлементОтбораРСО = ОтборыРасчетСДО.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
                    НовыйЭлементОтбораРСО.Использование = ЭлементПользовательскихНастроек.Использование;
                    НовыйЭлементОтбораРСО.ЛевоеЗначение = ЭлементПользовательскихНастроек.ЛевоеЗначение;//ВОТ В ЭТОМ МЕСТЕ ПУСТО:(
                    НовыйЭлементОтбораРСО.ВидСравнения = ЭлементПользовательскихНастроек.ВидСравнения;
                    НовыйЭлементОтбораРСО.ПравоеЗначение = ЭлементПользовательскихНастроек.ПравоеЗначение;
                                   
                КонецЕсли;
             
            КонецЕсли;
         
        КонецЦикла;
     
        ПараметрыДанныхРасчетСДО.УстановитьЗначениеПараметра("ДатаН", ЗначениеПараметраПериодАнализа.ДатаНачала);
        ПараметрыДанныхРасчетСДО.УстановитьЗначениеПараметра("ДатаК", ЗначениеПараметраПериодАнализа.ДатаОкончания);
     
        ТаблицаЗначений = Новый ТаблицаЗначений;
         
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
     
        МакетКомпоновкиСКД = КомпоновщикМакета.Выполнить(СКДРасчетСДО, НастройкиРасчетСДО,,,ТипГенератора);
     
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;      
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиСКД);
     
        ПроцессорВывода = Новый  ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
        ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
     
        ПроцессорВывода.ОтображатьПроцентВывода = Истина;
        ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
    
    КонецПроцедуры
    --- Объединение сообщений, 17 авг 2016 ---
    Набор данных первой (основной) схемы представлен следующим запросом
    Код:
    ВЫБРАТЬ
        ЕС_ПартииТоваров.Номенклатура.ЕС_Менеджер КАК Менеджер,
        ЕС_ПартииТоваров.Номенклатура КАК Номенклатура,
        ЕС_ПартииТоваров.Регистратор,
        ЕС_ПартииТоваров.Количество,
        ЕС_ПартииТоваров.Стоимость КАК Себестоимость,
        ЕС_ПартииТоваров.СтоимостьПродаж КАК Выручка,
        ЕС_ПартииТоваров.Период КАК Период
    ПОМЕСТИТЬ Продажи
    {ВЫБРАТЬ
        Номенклатура.*,
        Период,
        Менеджер.*}
    ИЗ
        РегистрНакопления.ЕС_ПартииТоваров КАК ЕС_ПартииТоваров
    ГДЕ
        (ЕС_ПартииТоваров.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияКлиенту)
                ИЛИ ЕС_ПартииТоваров.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияВРозницу))
    {ГДЕ
        ЕС_ПартииТоваров.Номенклатура.*,
        (ЕС_ПартииТоваров.Период МЕЖДУ &ДатаН И &ДатаК),
        ЕС_ПартииТоваров.Номенклатура.ЕС_Менеджер.* КАК Менеджер}
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Продажи.Менеджер КАК Менеджер,
        Продажи.Номенклатура КАК Номенклатура,
        Продажи.Регистратор,
        Продажи.Количество,
        Продажи.Себестоимость,
        Продажи.Выручка,
        Продажи.Период
    {ВЫБРАТЬ
        Менеджер.*,
        Номенклатура.*}
    ИЗ
        Продажи КАК Продажи
    {ГДЕ
        Продажи.Менеджер.*,
        Продажи.Номенклатура.*}
    --- Объединение сообщений, 17 авг 2016 ---
    Вроде бы все поля определены, всё на месте, но...
    Последнее редактирование модератором: 23 авг 2016
  2. TopicStarter Overlay
    X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    433
    Симпатии:
    3
    Баллы:
    29
    Неужели никто не сталкивался?
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.566
    Симпатии:
    717
    Баллы:
    204
    А если взять и скопировать все элементы пользовательских настроек в свою ТЗ и уже из этой ТЗ заполнять отбор?

    Копировать, это всмысле сделать что-то вроде:

    Для Каждого ТекЭлемент ИЗ КоллекцияЭлементов ЦИкл

    ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), ТекЭлемент);

    КонецЦикла
  4. TopicStarter Overlay
    X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    433
    Симпатии:
    3
    Баллы:
    29
    Левое значение отбора от этого все равно не появится:) Будет ошибка: "глобальный отбор должен обязательно использовать поля"
  5. TopicStarter Overlay
    X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    433
    Симпатии:
    3
    Баллы:
    29
    Решение найдено, тему можно закрывать.
  6. adc3
    Offline

    adc3

    Регистрация:
    22 сен 2016
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Столкнулся с точно такой же проблемой, а именно: ЛевоеЗначение во всех элементах отбора пользовательских настроек СКД всегда равно "Неопределено".

    Пожалуйста, прошу поделиться найденным решением.)
  7. adc3
    Offline

    adc3

    Регистрация:
    22 сен 2016
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Сам спросил - сам ответил, как говорится...

    Итак, для таких же незнающих, как я: элементы настроек и элементы пользовательских настроек СКД связаны между собой свойством ИдентификаторПользовательскихНастроек. Достаточно найти методом перебора ЛевогоЗначения нужный элемент отбора в не-пользовательских настройках (а в них с ЛевымЗначением все в порядке), а затем найти соответствующий ему элемент пользовательских настроек по вышеупомянутому идентификатору.
  8. TopicStarter Overlay
    X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    433
    Симпатии:
    3
    Баллы:
    29

    На самом деле все ГОРАЗДО проще:) Нужно использовать метод компоновщика настроек ПолучитьНастройки(), который компонует пользовательские настройки с непользовательскими:) А затем просто использовать результат, возвращаемый данным методом, в качестве настроек при программной компоновке. Даже переборов никаких не нужно:)

Поделиться этой страницей