Имя: Пароль:
1C
1С v8
Вывод отчета "Анализ субконто типовой" из списка номенклатуры с отбором в БП 3.0
0 K1RSAN
 
05.12.20
15:31
В общем - вопрос в названии темы. В двойке всё это делалось относительно просто, в тройке попытался передать как параметры - ругается на конфликт настроек. Может тут есть люди, которые запускали этот отчет из каких-нибудь форм с разными настройками?
1 K1RSAN
 
05.12.20
16:31
В общем, нашел частично, потом методом тыка нашел, что добавить надо или изменить. На будущее, вдруг понадобится кому.
Часть кода может быть мусорной (утащено с интернета), в субботу вечером не хочется заниматься разбором полета. Потом может перепишу.
Запускается кнопкой из формы списка номенклатуры

&НаКлиенте
Процедура Анализ(Команда)
    
    ТекНоменклатура = Элементы.Список.ТекущаяСтрока;
    Организация = ПолучитьОрганизациюПоУмолчанию();
    
    //Имя вызываемого отчета карточка,анализ, ОСВ по счету . Я делал только для этих трех.
    ИмяОтчета = "АнализСубконтоТиповой";
    
// Добавляем структуру группировок
    ГруппировкаСчет = Новый Структура;
    ГруппировкаСчет.Вставить("Использование",  Истина);
    ГруппировкаСчет.Вставить("Поле",           "Счет");
    ГруппировкаСчет.Вставить("Представление",  "Счет");
    ГруппировкаСчет.Вставить("ТипГруппировки", 0);

    ГруппировкаСклад = Новый Структура;
    ГруппировкаСклад.Вставить("Использование",  Истина);
    ГруппировкаСклад.Вставить("Поле",           "Субконто2");
    ГруппировкаСклад.Вставить("Представление",  "Склады");
    ГруппировкаСклад.Вставить("ТипГруппировки", 0);

    ГруппировкаНоменклатура = Новый Структура;
    ГруппировкаНоменклатура.Вставить("Использование",  Истина);
    ГруппировкаНоменклатура.Вставить("Поле",           "Субконто1");
    ГруппировкаНоменклатура.Вставить("Представление",  "Номенклатура");
    ГруппировкаНоменклатура.Вставить("ТипГруппировки", 0);

    ГруппировкаОтчета = Новый Массив;
    ГруппировкаОтчета.Добавить(ГруппировкаСчет);
    ГруппировкаОтчета.Добавить(ГруппировкаСклад);
    ГруппировкаОтчета.Добавить(ГруппировкаНоменклатура);
    
    СписокВидовСубконто = ПолучитьСписокСубконто();

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

&НаКлиенте
Процедура ЗаполнитьЭлементОтбораКомпоновкиДанных(ОтборНастройкиКомпоновкиДанных,Использование,ВидСрав,ИмяПоля,ЗначениеОтбора)
    
    НовыйЭлемент = ОтборНастройкиКомпоновкиДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    
    НовыйЭлемент.Использование  = Использование;
    НовыйЭлемент.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент.ВидСравнения   = ВидСрав;
    НовыйЭлемент.ПравоеЗначение = ЗначениеОтбора;
    
КонецПроцедуры

&НаСервере
Функция ТекНоменклатураЭтоГруппа(ТекНоменклатура)
    
    Возврат ТекНоменклатура.ЭтоГруппа;
    
КонецФункции

&НаСервере
Функция УстановитьПользовательскиеНастройкиОтчета(ТипОтчета,СтруктураПараметров)
    СтруктураНастроек = Новый Структура;
    ОтчетОбъект = Отчеты[ТипОтчета].Создать();
    
    ПользовательскиеНастройки = ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки;
    Для Каждого ЭлПараметр  Из СтруктураПараметров Цикл
        Для Каждого ПараметрСКД Из ПользовательскиеНастройки.Элементы Цикл
            Если ТипЗнч(ПараметрСКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда  
                Если строка(ПараметрСКД.Параметр) = ЭлПараметр.Ключ Тогда
                    ПараметрСКД.Значение = ЭлПараметр.Значение;
                    ПараметрСКД.Использование = Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;    
    КонецЦикла;
        
    Возврат ПользовательскиеНастройки;
КонецФункции

&НаСервере
Функция ПолучитьОрганизациюПоУмолчанию()
    
    Возврат Справочники.Организации.ОрганизацияПоУмолчанию(ПользователиИнформационнойБазы.ТекущийПользователь());
    
КонецФункции

&НаСервере
Функция ПолучитьСписокСубконто()
    
    СписокВидовСубконто = Новый СписокЗначений;
    СписокВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Номенклатура);    
    СписокВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Склады);
    Возврат СписокВидовСубконто
    
КонецФункции
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс