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

Тема в разделе "1C и всё что с ней связано", создана пользователем fungrunger, 4 авг 2011.

Статус темы:
Закрыта.
  1. fungrunger

    fungrunger Гость

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

    КонецПроцедуры
     
  2. fungrunger

    fungrunger Гость

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Думаю, что СКД писали инопланетяне.
     
  4. fungrunger

    fungrunger Гость

    А на чём же писать отчеты ленивому человеку?))) тем более в 8.2
     
  5. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Формировать программно - это уже не для ленивого)
     
  6. Allexei

    Allexei Well-Known Member

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    fungrunger Гость

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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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


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


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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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


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

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

    fungrunger Гость

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

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


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

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

    Allexei Well-Known Member

    Регистрация:
    2 май 2008
    Сообщения:
    322
    Симпатии:
    0
    Хм, интересно... Может это связано как то с тем что мы обращаемся не через ЭтотОбъект.КомпановщикДанных (или как то так)? Или может надо сделать сохранение пользовательских настроек...Вечером поковыряю еще. Если найдешь решение раньше выложи, пожалуйста.
    З.Ы. Может проще написать на Построителе Отчетов?
     
  10. fungrunger

    fungrunger Гость

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

    будем искать
     
  11. fungrunger

    fungrunger Гость

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

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

Поделиться этой страницей