Имя: Пароль:
1C
1С v8
СКД: программная установка ограничения доступности полей
,
0 serzh44
 
18.10.13
18:17
Предположим, есть код программного построения отчета в СКД:

    //1. создаем схему компоновки данных
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    
    //1.1 определяем источник данных для схемы
    //для наших целей - текущая ИБ
    Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    Источник.Имя = "ЛокальнаяБаза";
    Источник.СтрокаСоединения = "";
    Источник.ТипИсточникаДанных = "Local";
    
    //1.2 определяем набор данных
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "Продажи";
    НаборДанных.ИсточникДанных = "ЛокальнаяБаза";
    НаборДанных.АвтоЗаполнениеДоступныхПолей = Ложь;
    НаборДанных.Запрос = (
        "ВЫБРАТЬ
        |    1 КАК Колонка1,
        |    2 КАК Колонка2"
    );
    
    //1.2.1 добавляем поля
    ПолеНабораДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеНабораДанных.Поле = "Колонка1";
    ПолеНабораДанных.ПутьКДанным = "Колонка1";
    
    ПолеНабораДанных.Поле = "Колонка2";
    ПолеНабораДанных.ПутьКДанным = "Колонка2";
    ПолеНабораДанных.ОграничениеИспользования.Группировка = Истина;
    ПолеНабораДанных.ОграничениеИспользования.Поле = Истина;
    ПолеНабораДанных.ОграничениеИспользования.Порядок = Истина;
    ПолеНабораДанных.ОграничениеИспользования.Условие = Истина;
    ПолеНабораДанных.ОграничениеИспользованияРеквизитов.Группировка = Истина;
    ПолеНабораДанных.ОграничениеИспользованияРеквизитов.Поле = Истина;
    ПолеНабораДанных.ОграничениеИспользованияРеквизитов.Порядок = Истина;
    ПолеНабораДанных.ОграничениеИспользованияРеквизитов.Условие = Истина;
    
    
    //2. создаем настройки для схемы
    НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    
    //2.1 определяем структуру
    //2.1.1 добавляем группировку "Номенклатура"
    Группировка = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    
    ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));    
    ПолеГруппировки.Использование = Истина;
    ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Колонка1");
    
    //2.2 определим выбранные поля
    ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Заголовок = "Колонка1";
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Колонка1");
    
    //3. компонуем
    КомпНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    КомпНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);
    НастройкиКомпоновкиДанных = КомпНастроек.ПолучитьНастройки();
    
    //4. готовим макет
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных);
    
    //5. исполняем макет
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(Макет);
    ПроцессорКомпоновки.Сбросить();
    
    //6. выводим результат
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ТабДок = Новый ТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.НачатьВывод();
    ЭлементРезультата =  ПроцессорКомпоновки.Следующий();
    Пока ЭлементРезультата <> Неопределено Цикл
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();
    
    ТабДок.Показать();
1 serzh44
 
18.10.13
18:21
Мне нужно программно установить ограничение использования для поля набора данных. В коде выше, ограничения использования устанавливаются для поля "Колонка2". Но если выполнить код, то будет выдана ошибка - не найдена "Колонка1". Хотя свойство АвтоЗаполнениеДоступныхПолей набора данных установлено в "Ложь" и поля набора данных добавлены.

Вообще путем проб и ошибок удалось установить, что 1с никак не реагирует на поля, добавленные программно в набор данных. А если АвтоЗаполнениеДоступныхПолей установлено в "Истина", то поля отсутствуют в наборе данных и установить ограничение использования нельзя.

Зачем мне это? Мне нужно добавить поля в набор данных, которые будут использоваться в вычисляемых полях, но сами поля набора данных пользователь не должен видеть.
2 fisher
 
18.10.13
18:59
Программно так не создавал, но если интерактивно отключаешь автозаполнение полей, то СКД вычитывает их список и настройки из фигурных скобок запроса. Может, и тут надо бы с ними пошаманить?
3 serzh44
 
18.10.13
22:39
Фигурные скобки тоже пробовал, тогда поля не заполняютя в наборе данных и изменить ограничение использования нельзя. Вооще пребрал уже все возможные варианты и еще раз пришел к выводу, что программное заполнение полей набора данных ни на что не влияет. Косяк платформы или я не так делаю?
4 serzh44
 
19.10.13
20:26
up
5 serzh44
 
20.10.13
10:32
Ни у кого нет мыслей?
6 serzh44
 
20.10.13
20:03
Up
7 serzh44
 
22.10.13
19:05
Up
8 serzh44
 
23.10.13
13:45
Up
9 serzh44
 
25.10.13
16:15
Up
10 serzh44
 
02.11.13
17:43
Up
11 serzh44
 
07.11.13
11:03
Up
12 Зойч
 
07.11.13
11:12
>>Мне нужно добавить поля в набор данных, которые будут использоваться в вычисляемых полях, но сами поля набора данных пользователь не должен видеть
Так нельзя в принципе
13 serzh44
 
10.11.13
13:01
Почему нельзя? Если ограничение доступности включено, то в вычисляемых полях использовать можно, но пользователь полей не увидит.
14 serzh44
 
10.11.13
13:16
Наконец-то получилось)