• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

добавление доступных полей выбора СКД

  • Автор темы fungrunger
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

fungrunger

Всем Добрый день. Столкнулся с такой проблемой.
Делаю отчет на СКД. В качестве набора данных есть внешний объект. Поля не описаны, т.к. формируются динамически.
Затем в процедуре модуля ПриКомпоновкеРезультата формирую этот внешний источник - добавляю его поля в схему,
инициализирую и пологал, что эти поля попадут в доступные - а вновь добавленные поля не попадают в доступные поля выбора (т.е. пользователь не сможет их выбрать).
Коллекция доступна только на чтение - как мне сделать чтобы новые поля схемы появились в доступных? Поможитя кто чем может. Платформа 8.2.14.519 Вот код
CODE
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

НастройкиСКД = КомпоновщикНастроек.ПолучитьНастройки();
ПоляВнешнегоИсточника = СхемаКомпоновкиДанных.НаборыДанных.ВидыОпераций_Выбранные.Поля;

ТабСвойствОЗ = ПолучитьТабСвойствОЗ();

Для Каждого стрСвОз Из ТабСвойствОЗ Цикл

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

КонецЦикла;

ВидыОпераций_Выбранные = ПолучитьТабЗначенийСвойствОЗ(ПоляВнешнегоИсточника,ТабСвойствОЗ);

ВнешниеНаборыДанных = Новый Структура();
ВнешниеНаборыДанных.Вставить("ВидыОпераций_Выбранные", ВидыОпераций_Выбранные);

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

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

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

КонецПроцедуры
 
F

fungrunger

товарищи!!!! Неужто никто не делал, никто не знает. Не бросьте в беде - второй день мучаюсь. Если что - то в вопросе непонятно - то спрашивайте, пожалуйста. Не дайте умереть человеку
 
U

unknown181538

Думаю, что СКД писали инопланетяне.
 
U

unknown181538

Формировать программно - это уже не для ленивого)
 
A

Allexei

Тут дело по моему в том что при выводе с табличный документ в схеме СКД не установлены поля для выбора. Т.е. у тебя могут стоять там детальные записи но поля которые в эти детальные записи будут выводится - их нет, так как они формируются у тебя динамически. Ниже привожу то что навоял - проверено работает.
На форме создай поле табличного документа с именем"тпРезультат". Создай макет компоновки данных у которого будет набор данных объект с именем "Результат", в качестве имя источника данных так же дадим имя "Результата", на вкладке настройка - детальные записи. Полей разумеется ни каких не добавляем в наборы данных. В модуле формы:
Код:
//Сформируем табличку которую выведим на форму
Процедура СформироватьТабличкуНаВывод(Кнопка)

ТабСвойствОЗ= Новый ТаблицаЗначений;

ТабСвойствОЗ.Колонки.Добавить("Колонка1");
ТабСвойствОЗ.Колонки.Добавить("Колонка2");
ТабСвойствОЗ.Колонки.Добавить("Колонка3");

НоваяСтрока= ТабСвойствОЗ.Добавить();
НоваяСтрока.Колонка1= "А";
НоваяСтрока.Колонка2= "Б";
НоваяСтрока.Колонка3= "В";

НоваяСтрока= ТабСвойствОЗ.Добавить();
НоваяСтрока.Колонка1= "Г";
НоваяСтрока.Колонка2= "Д";
НоваяСтрока.Колонка3= "Е";

НоваяСтрока= ТабСвойствОЗ.Добавить();
НоваяСтрока.Колонка1= "Ж";
НоваяСтрока.Колонка2= "З";
НоваяСтрока.Колонка3= "И";

//Процедура печати произвольной таблички посредством компановщика
ВывестиНаПечать(ТабСвойствОЗ, "Результат", "Макет", ЭлементыФормы.тпРезультат)

КонецПроцедуры

//табРезультатНаПечать - Табличка которую хотим распечатать
//ИмяОбъектаПриемникаСКД - имя объекта в компановщике куда передаем значение
//ИмяМакетаСКД - имя макет СКД
//ИмяПТДДляВыводаНаПечать - Табличка на форме

Процедура ВывестиНаПечать(табРезультатНаПечать,ИмяОбъектаПриемникаСКД, ИмяМакетаСКД, ИмяПТДДляВыводаНаПечать)

ВнешнийНаборДанных	 = Новый Структура(ИмяОбъектаПриемникаСКД, табРезультатНаПечать);
СхемаКомпановкиДанных  = ПолучитьМакет(ИмяМакетаСКД);

НашаНастрока= СхемаКомпановкиДанных.НаборыДанных.Результат;

//Добавим поля в наборы данных
Для Каждого ТекСтрока Из табРезультатНаПечать.Колонки Цикл 
НовоеПоле			 = НашаНастрока.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НовоеПоле.Поле		= ТекСтрока.Имя;
НовоеПоле.ПутьКДанным = ТекСтрока.Имя;
НовоеПоле.Заголовок  = ТекСтрока.Имя;
КонецЦикла;

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

//----------------Настройка списка выводимых полей
КомпановщикМакета	  = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпановки		 = КомпановщикМакета.Выполнить(СхемаКомпановкиДанных, Настройки);
ПроцессорКомпанвкиДанных= Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпанвкиДанных.Инициализировать(МакетКомпановки, ВнешнийНаборДанных);

ДокументРезультата= ИмяПТДДляВыводаНаПечать;
ДокументРезультата.Очистить();

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультата);
ПроцессорВывода.Вывести(ПроцессорКомпанвкиДанных);
ДокументРезультата.ОтображатьСетку	= Ложь;
ДокументРезультата.ОтображатьЗаголовки= Ложь;
ДокументРезультата.Показать();
КонецПроцедуры
Как то так.Если не получится вышлю отчет.
Данный пример выводит в поле табличного документа посредством СКД любую таблицу значений. В этом стоит задача? Кстати что значит "т.е. пользователь не сможет их выбрать".Выбрать где?В отборе?
 
F

fungrunger

Тут дело по моему в том что при выводе с табличный документ в схеме СКД не установлены поля для выбора. Т.е. у тебя могут стоять там детальные записи но поля которые в эти детальные записи будут выводится - их нет, так как они формируются у тебя динамически. Ниже привожу то что навоял - проверено работает.
На форме создай поле табличного документа с именем"тпРезультат". Создай макет компоновки данных у которого будет набор данных объект с именем "Результат", в качестве имя источника данных так же дадим имя "Результата", на вкладке настройка - детальные записи. Полей разумеется ни каких не добавляем в наборы данных. В модуле формы:
Код:
//Сформируем табличку которую выведим на форму
Процедура СформироватьТабличкуНаВывод(Кнопка)

ТабСвойствОЗ= Новый ТаблицаЗначений;

ТабСвойствОЗ.Колонки.Добавить("Колонка1");
ТабСвойствОЗ.Колонки.Добавить("Колонка2");
ТабСвойствОЗ.Колонки.Добавить("Колонка3");

НоваяСтрока= ТабСвойствОЗ.Добавить();
НоваяСтрока.Колонка1= "А";
НоваяСтрока.Колонка2= "Б";
НоваяСтрока.Колонка3= "В";

НоваяСтрока= ТабСвойствОЗ.Добавить();
НоваяСтрока.Колонка1= "Г";
НоваяСтрока.Колонка2= "Д";
НоваяСтрока.Колонка3= "Е";

НоваяСтрока= ТабСвойствОЗ.Добавить();
НоваяСтрока.Колонка1= "Ж";
НоваяСтрока.Колонка2= "З";
НоваяСтрока.Колонка3= "И";

//Процедура печати произвольной таблички посредством компановщика
ВывестиНаПечать(ТабСвойствОЗ, "Результат", "Макет", ЭлементыФормы.тпРезультат)

КонецПроцедуры

//табРезультатНаПечать - Табличка которую хотим распечатать
//ИмяОбъектаПриемникаСКД - имя объекта в компановщике куда передаем значение
//ИмяМакетаСКД - имя макет СКД
//ИмяПТДДляВыводаНаПечать - Табличка на форме

Процедура ВывестиНаПечать(табРезультатНаПечать,ИмяОбъектаПриемникаСКД, ИмяМакетаСКД, ИмяПТДДляВыводаНаПечать)

ВнешнийНаборДанных	 = Новый Структура(ИмяОбъектаПриемникаСКД, табРезультатНаПечать);
СхемаКомпановкиДанных  = ПолучитьМакет(ИмяМакетаСКД);

НашаНастрока= СхемаКомпановкиДанных.НаборыДанных.Результат;

//Добавим поля в наборы данных
Для Каждого ТекСтрока Из табРезультатНаПечать.Колонки Цикл 
НовоеПоле			 = НашаНастрока.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НовоеПоле.Поле		= ТекСтрока.Имя;
НовоеПоле.ПутьКДанным = ТекСтрока.Имя;
НовоеПоле.Заголовок  = ТекСтрока.Имя;
КонецЦикла;

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

//----------------Настройка списка выводимых полей
КомпановщикМакета	  = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпановки		 = КомпановщикМакета.Выполнить(СхемаКомпановкиДанных, Настройки);
ПроцессорКомпанвкиДанных= Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпанвкиДанных.Инициализировать(МакетКомпановки, ВнешнийНаборДанных);

ДокументРезультата= ИмяПТДДляВыводаНаПечать;
ДокументРезультата.Очистить();

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультата);
ПроцессорВывода.Вывести(ПроцессорКомпанвкиДанных);
ДокументРезультата.ОтображатьСетку	= Ложь;
ДокументРезультата.ОтображатьЗаголовки= Ложь;
ДокументРезультата.Показать();
КонецПроцедуры
Как то так.Если не получится вышлю отчет.
Данный пример выводит в поле табличного документа посредством СКД любую таблицу значений. В этом стоит задача? Кстати что значит "т.е. пользователь не сможет их выбрать".Выбрать где?В отборе?

Во-первых, спасибо большое за ответ.
У меня проблем с выводом полей не возникает - я в первом варианте кода просто этого не писал
макет я формирую с нестандартными настройками а со своими

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

Ну а ОбщегоНазначения.СкомпоноватьНастройки(СхемаКомпоновкиДанных) можно всё что угодно запихать
самый простой это если всё тупо пихаем

Функция СкомпоноватьНастройки(СхемаКомпоновки) Экспорт

ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);

// Добавим выбранные поля
Для Каждого Элемент из КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы Цикл

Если НЕ Элемент.Папка Тогда
ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Элемент.Поле;
КонецЕсли;

КонецЦикла;

// Добавим группировку
ГруппировкаНастроек = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Поле = ГруппировкаНастроек.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

Возврат КомпоновщикНастроек.Настройки;

КонецФункции

Ваш вариант, я сейчас с удовольствием поподробнее поизучаю.


Проблема просто в другом немного (это кстате и будет ответом на ваш вопрос) Основные поля я вывожу сам, но вот те поля, которые всегда разные я хочу чтоб выбирал сам пользователь. Я расчитываю на грамотного юзера, что он жмет - изменить вариант и сам набирает поля в детальные записи.
Вот и получается, что в наборе СКД эти поля есть, показать я юзеру их могу (уже в таблице, в отчете), а в доступных для выбора их нет.


Добавлено: Во-первых, спасибо большое за ответ.
У меня проблем с выводом полей не возникает - я в первом посте просто этого не писал.
макет я формирую с нестандартными настройками а со своими

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

Ну а ОбщегоНазначения.СкомпоноватьНастройки(СхемаКомпоновкиДанных) можно всё что угодно запихать
самый простой это если всё тупо пихаем

Функция СкомпоноватьНастройки(СхемаКомпоновки) Экспорт

ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);

// Добавим выбранные поля
Для Каждого Элемент из КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы Цикл

Если НЕ Элемент.Папка Тогда
ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Элемент.Поле;
КонецЕсли;

КонецЦикла;

// Добавим группировку
ГруппировкаНастроек = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Поле = ГруппировкаНастроек.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

Возврат КомпоновщикНастроек.Настройки;

КонецФункции

Ваш вариант, я сейчас с удовольствием поподробнее поизучаю.


Проблема просто в другом немного (это кстате и будет ответом на ваш вопрос) Основные поля я вывожу сам, но вот те поля, которые всегда разные я хочу чтоб выбирал сам пользователь. Я расчитываю на грамотного юзера, что он жмет - изменить вариант и сам набирает поля в детальные записи.
Вот и получается, что в наборе СКД эти поля есть, показать я юзеру их могу (уже в таблице, в отчете), а в доступных для выбора их нет.

Если внимательно теперь посмотреть на код, то получается, что при КомпоновщикНастроек.Инициализировать(СКД) в коллекции
КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы мои поля есть добавленные, а после компановки макета и вывода отчета - они исчезают - вот я и не понимаю почему?
 
F

fungrunger

Хотя идея добавления полей непосредственно в настройки мне понравилась - решил её использовать и вывожу поля в настройке уже существующей - все остальные ностройки при этом работают - и это плюс большой

ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(тПоле);


тПоле - это поле в набор СКД, которое добавляю

Ну а с пользовательской видимостью помучаю исчо
 
A

Allexei

Хм, интересно... Может это связано как то с тем что мы обращаемся не через ЭтотОбъект.КомпановщикДанных (или как то так)? Или может надо сделать сохранение пользовательских настроек...Вечером поковыряю еще. Если найдешь решение раньше выложи, пожалуйста.
З.Ы. Может проще написать на Построителе Отчетов?
 
F

fungrunger

1)построитель отчетов в 8.2 это от лукавого) да и СКД не сложно еслиб не этот косяк
2)как раз таки мы обращаемся к этотОтчет.КомпановщикНастроек - мы же в модуле отчета
3)ещё забыл сказать, что строчка есть ещё одна
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
после неё поля, которые мы в СхКД добавили, появляются в коллекции доступных - но пользователь их всё равно не видит

будем искать
 
F

fungrunger

мы оказывается не правильно делали, а как правильно написано в статье "Редактирование настроек для не основной схемы компоновки данных" на диске ИТС, так мне ответила 1С

При этом я как пологаю придется всё равно использовать свою форму
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!