Имя: Пароль:
1C
1С v8
Вопрос по СКД, контроль заполнения поля отбора
0 Пират
 
16.05.13
15:26
Заполненность параметров программно можно проверить так:

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

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

А как так же красиво проверить заполненность поля отбора?
Поля отбора теряют там свое исконное имя и приобретают вид "П", "П1", "П2"...

Помогите пожалуста!
1 Пират
 
16.05.13
15:28
НастройкиОтчета.Отбор.Элементы - сравнивать по индексу тоже не гуд!
2 mikecool
 
16.05.13
15:28
их не надо проверять, система автоматически будет включать условия, если значения отборов заполнены
3 Пират
 
16.05.13
15:31
(2) есть отбор, значение которого надо устанавливать всегда.

Как проконтролировать, что оно было установлено?
4 mikecool
 
16.05.13
15:34
(3) скрыть его от пользователя, назначить параметры - а значения параметров назначить значениями отбора
5 Пират
 
16.05.13
15:35
(4) как значения параметров назначить значениями отбора?
6 Laerys
 
16.05.13
15:35
(4) наверно оно и должно настраиваться пользователями
7 mikecool
 
16.05.13
15:36
(5) удалить крестом значение в поле отбора, выбрать из параметра
8 Пират
 
16.05.13
15:38
(7) была такая мысль. Не красиво на форме создавать две таблицы. Параметры и Отборы.

Действительно нельзя красиво проконтролировать было ли заполнено конкретное поле отбора?
9 Laerys
 
16.05.13
15:40
(8) на форме можно проверять через условное оформление
10 Пират
 
16.05.13
15:43
(9) форму создавать не хочу.

Хочу проверить в модуле объекта в
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

   СтандартнаяОбработка = Ложь;
   
   МассивЗаголовковРесурсов = Новый Массив;
   НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

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

   //Создадим и инициализируем процессор вывода результата
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

   //Обозначим начало вывода
   ПроцессорВывода.НачатьВывод();
   ТаблицаЗафиксирована = Ложь;

   ДокументРезультат.ФиксацияСверху = 0;
   //Основной цикл вывода отчета
   Пока Истина Цикл
       //Получим следующий элемент результата компоновки
       ЭлементРезультата = ПроцессорКомпоновки.Следующий();

       Если ЭлементРезультата = Неопределено Тогда
           //Следующий элемент не получен - заканчиваем цикл вывода
           Прервать;
       Иначе
           // Зафиксируем шапку
           Если  Не ТаблицаЗафиксирована
                 И ЭлементРезультата.ЗначенияПараметров.Количество() > 0
                 И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда

               ТаблицаЗафиксирована = Истина;
               ДокументРезультат.ФиксацияСверху = ДокументРезультат.ВысотаТаблицы;

           КонецЕсли;
           //Элемент получен - выведем его при помощи процессора вывода
           ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
       КонецЕсли;
   КонецЦикла;

   ПроцессорВывода.ЗакончитьВывод();

КонецПроцедуры
11 Пират
 
16.05.13
15:51
Только вот так проверять в цикле что-ли?

НастройкиОтчета.Отбор.Элементы[ш].ЛевоеЗначение = (Новый ПолеКомпоновкиДанных("Товар"))
12 Пират
 
16.05.13
16:03
Жесть какая-то получается

//проверим заполненность необходимых полей отбора
   СтруктураПроверяемыхНаЗаполнениеОтборов = Новый СписокЗначений;
   СтруктураПроверяемыхНаЗаполнениеОтборов.Вставить("Товар",Новый ПолеКомпоновкиДанных("Товар"));
   
   Для Каждого ЭлементОтбораКомпоновки Из НастройкиОтчета.Отбор.Элементы Цикл
       ПроверяемоеПолеОтбора = ЭлементОтбораКомпоновки.ЛевоеЗначение;
       ИмяПроверяемогоПоляОтбора = СокрЛП(ПроверяемоеПолеОтбора);
               
       Если СтруктураПроверяемыхНаЗаполнениеОтборов.Свойство(ИмяПроверяемогоПоляОтбора) Тогда
           Если Не ЗначениеЗаполнено(ЭлементОтбораКомпоновки.ПравоеЗначение) Тогда
           Сообщение = Новый СообщениеПользователю;
           Сообщение.Текст = "Не заполнено обязательное поле отбора!";
           Сообщение.Поле = "";
           Сообщение.УстановитьДанные();
           Сообщение.Сообщить();
           КонецЕсли;
       КонецЕсли;
       
   КонецЦикла;
13 Пират
 
16.05.13
16:55
прикольно когда пишешь тему на мисте и никто не может ответить на вопрос :)

Итак, в модуле объекта в процедуре ПриКомпоновкеРезультата пишем следующее:

НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

//проверим заполненность необходимых полей отбора
   СтруктураПроверяемыхНаЗаполнениеОтборов = Новый Структура;
   СтруктураПроверяемыхНаЗаполнениеОтборов.Вставить("Контейнер",    Новый ПолеКомпоновкиДанных("Контейнер"));
   //СтруктураПроверяемыхНаЗаполнениеОтборов.Вставить("Страна",        Новый ПолеКомпоновкиДанных("Страна"));
   
   Для ш = 0 По НастройкиОтчета.Отбор.Элементы.Количество() - 1 Цикл
       
       ЭлементОтбораКомпоновки    = НастройкиОтчета.Отбор.Элементы[ш];
       ПроверяемоеПолеОтбора        = ЭлементОтбораКомпоновки.ЛевоеЗначение;
       ИмяПроверяемогоПоляОтбора    = СокрЛП(ПроверяемоеПолеОтбора);
       
       Если СтруктураПроверяемыхНаЗаполнениеОтборов.Свойство(ИмяПроверяемогоПоляОтбора) Тогда
           Если Не ЗначениеЗаполнено(ЭлементОтбораКомпоновки.ПравоеЗначение) ИЛИ НЕ ЭлементОтбораКомпоновки.Использование Тогда
               Сообщение = Новый СообщениеПользователю;
               Сообщение.Текст = "Не заполнено обязательное поле отбора <"+ИмяПроверяемогоПоляОтбора+">"+"! Filter <"+ЭлементОтбораКомпоновки.ПредставлениеПользовательскойНастройки+"> is empty!";
               Сообщение.Поле = "Отчет.КомпоновщикНастроек.ПользовательскиеНастройки";
               //Сообщение.УстановитьДанные();
               Сообщение.Сообщить();
               Возврат;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
Пользуйтесь, кому надо!!!
Основная теорема систематики: Новые системы плодят новые проблемы.