Имя: Пароль:
1C
 
Помощь со внешним отчетом
0 ДолекоДо1Са
 
02.03.25
19:14
Здравствуйте, возникла проблема. Я хотел сделать так, если документ выбран то формируется отчет по этому 1 документу, а если нет, то по всем документам. Я добавил параметр ВыбранныйДокумент в скд для пользовательского выбора, но значение этого параметра почему то всегда Неопределенно, хотя я выбираю значение ссылки на документ перед формированием.

Вот код. Задание я решаю для себя поэтому не судите строго.
Буду рад помощи.
[code]
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)  
    СтандартнаяОбработка = Ложь;
    
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("НаименованиеПоля");
    Результат.Колонки.Добавить("КоличествоКлапанов");
    Результат.Колонки.Добавить("КоличествоОткрытых");
    Результат.Колонки.Добавить("МаксОткрытыхПодряд");
    Результат.Колонки.Добавить("МаксЗакрытыхПодряд");    
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОрошаемыеПоля.НаименованиеПоля КАК НаименованиеПоля,
        |    ОрошаемыеПоля.КоличествоКлапанов КАК КоличествоКлапанов,
        |    ОрошаемыеПоляКлапаны.НомерНачального КАК НомерНачального,
        |    ОрошаемыеПоляКлапаны.НомерКонечного КАК НомерКонечного,
        |    ОрошаемыеПоля.Ссылка КАК Ссылка
        |ИЗ
        |    Документ.ОрошаемыеПоля КАК ОрошаемыеПоля
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОрошаемыеПоля.Клапаны КАК ОрошаемыеПоляКлапаны
        |        ПО (ОрошаемыеПоляКлапаны.Ссылка = ОрошаемыеПоля.Ссылка)
        |{ГДЕ
        |    (ОрошаемыеПоля.Ссылка = &ВыбранныйДокумент) КАК Поле2}";
    
    
    
    ТекНастройкиКомпоновщика = КомпоновщикНастроек.Настройки;
    Параметр = ТекНастройкиКомпоновщика.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыбранныйДокумент")).Значение;    

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

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

Процедура ЗаписьВТЗ(МассивКлапанов, Результат, НаименованиеПоля)
    Открытые = 0;
    МаксОткрытых = 0;
    МаксЗакрытых = 0;
    ТекущаяДлина = 0;
    ТекущееСостояние = Ложь;
        
    Для Итератор = 0 По МассивКлапанов.Количество() - 1 Цикл  
        Если МассивКлапанов[Итератор] Тогда
            Открытые = Открытые + 1;
            
            Если ТекущееСостояние Тогда
                ТекущаяДлина = ТекущаяДлина + 1;    
            Иначе  
                ТекущаяДлина = 1;
                ТекущееСостояние = Истина;
            КонецЕсли;
            
            МаксОткрытых = Макс(МаксОткрытых, ТекущаяДлина);
        Иначе
            Если ТекущееСостояние Тогда
                ТекущаяДлина = 1;
                ТекущееСостояние = Ложь;
            Иначе
                ТекущаяДлина = ТекущаяДлина + 1;
            КонецЕсли;
                
            МаксЗакрытых = Макс(МаксЗакрытых, ТекущаяДлина);
        КонецЕсли;
            
    КонецЦикла;
        
    Стр = Результат.Добавить();
    Стр.НаименованиеПоля = НаименованиеПоля;
    Стр.КоличествоКлапанов = МассивКлапанов.Количество();
    Стр.КоличествоОткрытых = Открытые;
    Стр.МаксОткрытыхПодряд = МаксОткрытых;
    Стр.МаксЗакрытыхПодряд = МаксЗакрытых;
КонецПроцедуры
[\code]
1 Волшебник
 
02.03.25
20:04
Ваш Документ.ОрошаемыеПоля надо сделать справочником
2 ДолекоДо1Са
 
02.03.25
20:05
Не будет никаких мыслей? Я просто не понимаю, что я делаю не так...
3 Волшебник
 
02.03.25
20:05
(2) У Вас неправильная структура базы. Переделайте
4 ДолекоДо1Са
 
02.03.25
20:06
(1) Я решаю задачку, по условию тут должен быть документ
5 Волшебник
 
02.03.25
20:06
(4) Вы не должны подчиняться условиям задачи
6 ДолекоДо1Са
 
02.03.25
20:07
Ну просто хочется сделать максимально приближенное к тз решение
7 Волшебник
 
02.03.25
20:08
(6) Вы должны думать как 1С-архитектор. Орошаемые поля не могут быть документом.
8 ДолекоДо1Са
 
02.03.25
20:10
Почему? В нем мы имеем Поля и клапаны, которые в данный момент поливают или не поливают поле
9 Волшебник
 
02.03.25
20:10
(8) Орошаемые поля — это справочник
10 ДолекоДо1Са
 
02.03.25
20:11
Ладно тогда, предположим, что документ называется ОрошениеПолей
11 Волшебник
 
02.03.25
20:12
Вся остальная информация по ОрошаемымПолям, это документы и регистры сведений, но сами Поля — это справочник.
12 Волшебник
 
02.03.25
20:13
(10) Так тоже нельзя. Ваш документ должен называться "СельскохозяйственнаяОперация" с видом "Орошение". В табличной части может быть ссылка на справочник.
13 ДолекоДо1Са
 
02.03.25
20:13
(11) Тут согласен, но так как я шел по тз, это не сильно учитывалось)
14 Волшебник
 
02.03.25
20:16
(13) Вы должны думать в первую очередь своей головой, а не сразу создавать ветку на форуме.
15 ДолекоДо1Са
 
02.03.25
20:18
(14) Пытался(
16 Волшебник
 
02.03.25
20:19
(15) Не надо пытаться. Надо делать.
17 ДолекоДо1Са
 
02.03.25
20:25
(16) Спасибо за совет
18 Волшебник
 
модератор
02.03.25
20:26
(17) Хватит флудить на форуме. Иди работай, школота!