1с полекомпоновкиданных как получить имя
В существующей программе меняю отбор из системы компоновки данных на отбор в запросе. Все виды сравнения реализовал, но осталось "Заполнено" и "НеЗаполнено". Я так понимаю, что сравнивать надо не с Неопределено, а именно с тем типом, что в поле запроса. У меня есть ПолеКомпоновкиДанных, как узнать тип этого поля? Для того, чтобы получить пустую ссылку
да, дело в том что есть 200 обращений к системе компоновке данных, выполняется это в цикле. мне нужно сделать одним запросом. так работает быстрее в десятки раз
. Я рад, что вы мне это рассказали. Но вопрос остается открытым - зачем пытаться написать говнокод, который сделает все то же самое, что и платформа, только хуже?
мне поставили задачу ускорить уже существущий код, который написан очевидно правильным программистом, который пишет не г-код. однако он работает неоправданно долго
спасибо за помощь придумал как сделаю этот отбор и без тормозов - такая проверка будет уже в полученной выборке, благо она небольшая
Я рад за вас. Но в описано совершенно другое, если что. Молодец. А как быть с отбором типа (А=7 ИЛИ Б не заполнено)?
но возникает следующая проблема - при обходе отбора не видно дерева, как они по группам объединены, видны только элементы и все)))
Нихрена ты не объяснил. - Я переделываю отбор СКД в условия в запросе - Зачем, это платформа сама умеет? - А у меня вот тут бантик завязан. Для нахрена писать какие-то там пьяные процедуры, если все то же самое умеет платформа, достаточно ее об этом попросить?
15+ все, я не ту настройку смотрел, их было много, в этой групп не было тогда полностью задача. есть справочник с настройками, там 200 записей, будет еще больше. в каждой записи есть настройка компоновки данных. при проведении документа выполняется запрос, отдельно по каждой настройке из этой компоновки, к данным документа. выполняется это десятки секунд. это делал не я. а задача ускорить этот процесс
спасибо, ты мне на самом деле очень помог. я бы и не догадался что есть группы в отборе в макете нашел все что нужно, но я так понимаю что "Выполнить" реально выполняет запрос к базе, т.е. это основные тормоза
я же заранее не знаю, какие у меня будут проводки в документе, какие виды субконто используется, а какие нет.
Заметил, что все чаще приходится программно работать с настройками компоновки. Чтобы лучше понять, из чего они состоят, собрал основные элементы в виде таблицы. Заодно сделал пару картинок, которые показывают соответствие коллекций в конструкторе СКД и объектной модели, так как иногда имя коллекции отличается от заголовка вкладки, на которой располагаются ее элементы.
Соответствие коллекций и вкладок
Состав вложенных коллекций
В таблицах приведены только часто используемые элементы. Остальные можно увидеть в синтаксис помощнике или отладчике. Другими словами, отброшены незначительные детали, чтобы проще было сосредоточить внимание на главных.
Это позволяет охватить все коллекции одним взглядом, чтобы увидеть основные различия и закономерности. Что помогает лучше понять и запомнить взаимосвязи внутренних объектов.
Опишу один из вариантов как пользоваться таблицами. Пусть нужно программно добавить отбор в корень настроек. В первой колонке находим "Настройки", видим, что они имеют поле "Отбор". Далее находим поле "Отбор" в левой колонке, видим, что оно содержит вложенную коллекцию "Элементы". Также из таблицы видно, что у добавляемого элемента будет тип ЭлементОтбораКомпоновкиДанных и состав полей, которые нужно будет заполнить. Получится, например, такой код:
Некоторые особенности и закономерности
- Если вложенная коллекция может содержать элементы нескольких типов, то при программном добавлении элемента необходимо указывать тип.
- Если все элементы в коллекции имеют одинаковый тип, то при добавлении элемента в коллекцию тип указывать не нужно
- При добавлении группировки обязательно заполнять две коллекции: ПоляГруппировки и Выбор. В первую коллекцию нужно добавлять поля, по которым нужно группировать, а во вторую - поля, которые нужно выводить в отчет. При этом в Выбор могут попадать не только группировки, но и ресурсы. И еще, не все поля, которые есть в группировке обязательно добавлять в выбранные поля. Например, можно добавить в группировку поле для сортировки, но отключить его в выбранных полях, чтобы оно не отображалось в отчете. Но в большинстве случаев достаточно добавить группировку, как это делает конструктор, например, так:
- Тип ЗначениеПараметраНастроекКомпоновкиДанных имеет несколько нелогичную структуру: внутри значения параметра располагается параметр. Хотя логичнее было бы, чтобы в параметре располагалось значение
- Значения параметров компоновки данных добавлять нельзя, их можно только найти и установить
- Некоторые значения параметров могут содержать вложенную коллекцию параметров
- В коллекции ПараметрыВывода (вкладка "Другие настройки") имена параметорв иногда отличаются от синонимов в конструкторе СКД, что может доставлять неудобства при разработке
Примеры программного создания элементов я повторять не буду, их можно посмотреть тут
ps. Насколько я понял, редактор данного ресурса не позволяет объединять ячейки в таблицах, поэтому я выложил таблицы в виде картинок.
Специальные предложения
Тема пользовательских настроек не раскрыта. А с ней - и куча всяких граблей, терпеливо разложенных создателями платформы.
Судя по заголовку статьи, в ней рассматривается объект НастройкиКомпоновкиДанных. С пользовательскими еще досконально не разбирался, пока хватало поверхностных знаний для решения своих задач.
Для кого эта статья ? Пользователю эти знания нафиг не нужны, программист такое и так знает, если он профи.
user975424; user717534; user843241; Batman; xioxao; Gang031; sasha777666; Numme; МСН; rmarkovych; Dmitri93; fishca; + 12 – Ответить
Ценность данной публикации на мой взгляд именно в краткости. Вот возьмем, к примеру, некий курс по СКД или книгу. Сколько времени нужно, чтобы их просмотреть/прочитать? И при этом мы будем получать очень большое количество повторов: сначала разжевывается то, что мы и так знаем и отсилы 5% новой информации мы почерпнем. И какой результат? Большинство просто сливаются или заранее понимают, что выгода, которые они получат от полного курса меньше, чем затраты на прослушивание/прочтение. Слишком много лишней информации. Похожая ситуация возникает, когда мы открываем в отладчике в точке останова настройки компоновки и пытаемся понять куда смотреть, чтобы найти нужный нам элемент. Но там не все коллекции называются так как мы ожидаем, а также много лишнего и глубокая вложенность. В итоге наше внимание засоряется ненужными полями типа ДоступныеПоляЧегоТоТам
В данной статье, собрано все основное и отброшено все мало востребованное при программной работе с СКД. И все это на одной странице. Вы можете сравнивать их, анализировать просто перемещая глаза по экрану. При этом также подключается и зрительная память. В итоге при программной работе с настройками можно не просто бездумно копипастить код с форумов, а лучше представлять что где лежит и как это нужно заполнять.
И да воды тоже нет, только мои выводы, которые я посчитал полезными. Много времени на ее прочтение вы не потратите, даже если не найдете ничего нового для себя.
Кроме того слуайно нашел ссылку на ИТС, на которой все расписано. Эта страница не попадается, когда она нужна в поиске, например так . Но в ней многое грамотно описано. Поэтому я упомянул ее здесь
В общем, коллеги, если кому данная статья покажется интересной - хорошо, если нет - никто не заставляет читать.
user717534; user843241; Kinestetik; larisab; start2000; IvanovAV; user774630; Gang031; Климов Сергей; torch; brr; + 11 – Ответить
// Процедура устанавливает значения параметров в запросе.
// Имя - Имя параметра
// Значение - Значение для отбора
Процедура УстановитьПараметрКомпоновки ( Имя , Значение )
КомпоновкаДанныхПараметр =
КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( Имя );
Если НЕ( КомпоновкаДанныхПараметр = Неопределено) Тогда
КомпоновкаДанныхПараметр.Значение = Значение ;
КомпоновкаДанныхПараметр.Использование = Истина ;
Иначе Сообщить( "Параметр " + Имя + " не найден " );
КонецЕсли;
КонецПроцедуры
// Процедура устанавливает отбор по полям запроса.
// Имя - Имя поля
// Значение - Значение для отбора
// ВидСравнения - ВидСравненияКомпоновкиДанных
Процедура УстановтьОтборПоПолюКомпоновки ( Имя , Значение , ВидСравнения )
Для Каждого ЭлементОтбора Из КомпоновщикНастроек . Настройки . Отбор . Элементы Цикл
Если ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( Имя ) И ЭлементОтбора . ВидСравнения = ВидСравнения Тогда
КомпоновщикНастроек . Настройки . Отбор . Элементы . Удалить ( ЭлементОтбора );
КонецЕсли;
КонецЦикла;
ЭлементОтбора = КомпоновщикНастроек.Настройки . Отбор . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( Имя );
ЭлементОтбора.ВидСравнения = ВидСравнения;
ЭлементОтбора.ПравоеЗначение = Значение ;
ЭлементОтбора.Использование = Истина ;
КонецПроцедуры
// Процедура добавляет или удаляет набор данных из схемы компоновки данных
//
// Схема - СхемаКомпоновкиДанных, схема, в которой нужно добавить(удалить) набор данных
// СхемаИсточник - СхемаКомпоновкиДанных, схема из которой копируется набор данных
// ИмяНабора - Строка
// Добавить - Булево
// НаборДанныхРодитель - НаборДанныхОбъединениеСхемыКомпоновкиДанных
Процедура ДобавитьУдалитьНаборДанных ( Схема , СхемаИсточник , ИмяНабора , Добавить , НаборДанныхРодитель )
НаборДанных = НайтиНаборДанных ( Схема . НаборыДанных , ИмяНабора );
Если Добавить Тогда
Если НаборДанных = Неопределено Тогда
НаборДанныхИсточник = НайтиНаборДанных ( СхемаИсточник . НаборыДанных , ИмяНабора );
НаборДанных = НаборДанныхРодитель . Элементы . Добавить ( Тип ( "НаборДанныхЗапросСхемыКомпоновкиДанных" ));
НаборДанных . Имя = НаборДанныхИсточник.Имя ;
НаборДанных . ИсточникДанных = НаборДанныхИсточник . ИсточникДанных ;
НаборДанных . Запрос = НаборДанныхИсточник . Запрос ;
КонецЕсли;
Иначе
Если НаборДанных <> Неопределено Тогда
НаборДанныхРодитель . Элементы . Удалить ( НаборДанных );
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиНаборДанных ( НаборыДанных , Имя )
Если НаборыДанных = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли;
Для каждого НаборДанных Из НаборыДанных Цикл
Если НаборДанных . Имя = Имя Тогда
Возврат НаборДанных ;
КонецЕсли;
Если ТипЗнч ( НаборДанных) = Тип ( "НаборДанныхОбъединениеСхемыКомпоновкиДанных" ) Тогда
Результат = НайтиНаборДанных ( НаборДанных . Элементы , Имя );
Если Результат <> Неопределено Тогда
Возврат Результат ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
В озврат Неопределено;
КонецФункции
// Функция находит группировку в компоновке
// Структура - КомпоновщикНастроек.Настройки.Структура
// Имя - Имя поля в группировке
// Возвращаемое значение: ПолеКомпоновкиДанных
Функция НайтиГруппировку ( Структура , Имя , ВидГруппировки = "Поле" )
Для Каждого Элемент Из Структура Цикл
Если ТипЗнч ( Элемент ) = Тип ( "ТаблицаКомпоновкиДанных" ) Тогда
Результат = НайтиГруппировку ( Элемент . Строки , Имя );
Если Результат <> Неопределено Тогда
Возврат Результат ;
КонецЕсли;
Результат = НайтиГруппировку ( Элемент . Колонки , Имя );
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
ИначеЕсли ТипЗнч ( Элемент ) = Тип ( "ГруппировкаТаблицыКомпоновкиДанных" ) Тогда
Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
Если Поле.Поле = Новый ПолеКомпоновкиДанных ( Имя ) Тогда
Если ВидГруппировки = "Поле" Тогда
Результат = Поле ;
Иначе
Результат = Элемент ;
КонецЕсли;
Возврат Результат ;
КонецЕсли;
КонецЦикла;
Результат = НайтиГруппировку ( Элемент . Структура , Имя );
КонецЕсли;
КонецЦикла;
Возврат Результат ;
КонецФункции
// Процедура добавляет в каждую группировку отчета отбор по непустому значению
// Структура - КомпоновщикНастроек.Настройки.Структура
// ДоступныеПоляГруппировок - КомпоновщикНастроек.ДоступныеПоляГруппировок
Процедура ОтборПоНепустым ( Структура )
Для Каждого Элемент Из Структура Цикл
Если ТипЗнч ( Элемент ) = Тип ( "ТаблицаКомпоновкиДанных" ) Тогда
ОтборПоНепустым ( Элемент.Строки );
ОтборПоНепустым ( Элемент.Колонки );
ИначеЕсли ТипЗнч ( Элемент ) = Тип ( "ГруппировкаТаблицыКомпоновкиДанных" ) Тогда
Для Каждого Поле Из Элемент . ПоляГруппировки . Элементы Цикл
ЭлементОтбора = Неопределено;
Для Каждого ЭлементОтбора1 Из Элемент . Отбор.Элементы Цикл
Если ЭлементОтбора1 . Представление = "Отбор по непустому" Тогда
ЭлементОтбора = ЭлементОтбора1 ;
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Элемент . Отбор . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора . Представление = "Отбор по непустому" ;
КонецЕсли;
ЭлементОтбора . ЛевоеЗначение = Поле . Поле ;
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных . Заполнено ;
ЭлементОтбора.Использование = Истина;
Параметр = Элемент . ПараметрыВывода . НайтиЗначениеПараметра( Новый ПараметрКомпоновкиДанных ( "FilterOutput" ));
Параметр . Использование = Истина;
Параметр . Значение = ТипВыводаТекстаКомпоновкиДанных . НеВыводить ;
КонецЦикла;
ОтборПоНепустым ( Элемент . Структура );
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Процедура добавляет значения интервалов в пользовательское поле
// ПолеИнтервалы - ПользовательскоеПолеВыборКомпоновкиДанных
// Интервал - Строка содержащия границы интервалов: 30,60,90
Процедура УстановитьПользовательскоеПолеИнтервал ( ПолеИнтервалы , Интервал )
Если ПустаяСтрока ( Интервал ) Тогда
Возврат;
КонецЕсли;
Стр = Интервал ;
Стр = СтрЗаменить ( Стр , "," , Символы . ПС );
ПредИнтервал = "0" ;
Для Счетчик = 1 По СтрЧислоСтрок ( Стр ) Цикл
ТекИнтервал = СокрЛП ( СтрПолучитьСтроку ( Стр , Счетчик ));
Вариант = ПолеИнтервалы . Варианты . Элементы . Добавить ();
Вариант . Использование = Истина;
Если Счетчик = 1 Тогда
Вариант . Значение = "До " + ТекИнтервал ;
Вариант . Представление = "До " + ТекИнтервал ;
Иначе
Вариант . Значение = "От " + ПредИнтервал + " до " + ТекИнтервал ;
Вариант . Представление = "От " + ПредИнтервал + " до " + ТекИнтервал ;
КонецЕсли;
Группа = Вариант . Отбор . Элементы . Добавить ( Тип ( "ГруппаЭлементовОтбораКомпоновкиДанных" ));
Группа.Использование = Истина;
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных . ГруппаИ ;
Если Счетчик > 1 Тогда
ЭлементОтбора = Группа . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора . Использование = Истина;
ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "ДнейПросрочки" );
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно ;
ЭлементОтбора . ПравоеЗначение = Число ( ПредИнтервал );
КонецЕсли;
ЭлементОтбора = Группа . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "ДнейПросрочки" );
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных . Меньше ;
ЭлементОтбора.ПравоеЗначение = Число ( ТекИнтервал );
ПредИнтервал = ТекИнтервал ;
Вариант = ПолеИнтервалы . Варианты.Элементы . Добавить ();
Вариант . Значение = "Более " + ПредИнтервал ;
Вариант . Представление = "Более " + ПредИнтервал ;
Группа = Вариант . Отбор . Элементы . Добавить ( Тип ( "ГруппаЭлементовОтбораКомпоновкиДанных" ));
Группа . ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных . ГруппаИ ;
ЭлементОтбора = Группа . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "ДнейПросрочки" );
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных . БольшеИлиРавно ;
ЭлементОтбора . ПравоеЗначение = Число ( ПредИнтервал );
КонецПроцедуры
Часто встречаются вопросы на форумах о программном формировании СКД. Вроде и информации много по этому поводу, но. Все как всегда :)
Собственно, в описании без лишних слов выложен текст общей функции, в которую, для выполнения отчета, нужно передать (минимум 2 параметра): СКД и ТабличныйДокумент.
Передаваемые параметры описаны в комментарии к процедуре.
Функция возвращает ДанныеРасшифровкиКомпоновкиДанных.
Из БСП используется только общая процедура:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора()
Собственно сама общая функция.
Спасибо, Yashazz , за то что нашел использование общей процедуры УстановитьПараметрСКД()(которую я не описал).
Специальные предложения
(1) zqzq, Спасибо за ссылку на статью. Но в ней нет возможности установить отборы (поэтому и используется общая процедура). Получается по ссылке мы можем только выполнить СКД.
Вот рабочий пример выполнения с параметрами, отборами и вариантом.
(2) пользуюсь той процедурой. При необходимости отбора, его можно установить в настройке и передать саму настройку. Тут, наверное, удобнее.
Чудовищный баян. Но, вероятно, те, кому лень почитать пару абзацев у Хрусталёвой, рады возможности воспользоваться халявой, чем и объясняется рейтинг статьи.
Автор, видимо, не в курсе возможности такой вещи, как КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра, поэтому делает какие-то странные костыли, да ещё применяет какую-то левую функцию "ОбщегоНазначенияКлиентСервер.УстановитьПараметрСКД" (о чём, кстати, не предупреждает, громко заявляя, что
Полагаю, каждый более-менее грамотный специалист давно для себя сделал пакетники для работы с СКД и пользуется ими.
p.s. не говоря уж о том, что предложенное ещё и не универсально. Вывода в таблицу значений нет, а бывает очень надо. Действительно профессиональным подходом было бы сделать общий механизм - в табличный документ, таблицу, дерево.
. жаль, не нашёл, где минуснуть можно.
(4) Yashazz, Извиняюсь за указанную общую процедуру не из БСП. Уже приложил к публикации.
Автор, видимо, не в курсе возможности такой вещи, как КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра, поэтому делает какие-то странные костыли,
Описание:
Устанавливает значение параметра и включает свойство Использование. Если параметр с указанным именем не найден, будет вызвано исключение .
.
Обрабатывать исключения попыткой нет желания ;)
2. КомпоновщикНастроек есть в отчетах. А я эту функцию вызываю из справочников, документов и при программном формировании скд.
3.
p.s. не говоря уж о том, что предложенное ещё и не универсально. Вывода в таблицу значений нет, а бывает очень надо. Действительно профессиональным подходом было бы сделать общий механизм - в табличный документ, таблицу, дерево.
В будущем планировал реализовать вывод в таблицу значений.
Текущий вариант функции взят с рабочего механизма. После написания этой функции, не приходилось выводить в ТЗ. Поэтому и не реализовано.
КомпоновщикНастроек есть в отчетах. А я эту функцию вызываю из справочников, документов и при программном формировании скд.
спокойно юзается, где только в голову взбредёт.
А использовать циклы там, где не надо, желание есть?
Я у себя уж лет пять назад всё сделал, и в таблицу значений, и куда угодно.
(7) а вы возьмите любую из моих публикаций, где мне ругались в комментах на отсутствие функций "СоздатьСКД" или "ПревращениеИмениВНаименование". Я это пихаю почти везде, а запостить вместе с основным кодом иногда забываю)))
upd: если очень надо, могу через прям щас запузырить сюда все свои основные блоки на эту тему
(9) честно? Я все эти годы, глядя на свой код, думаю: "ну баян же очевидный, фигли его выкладывать", а потом обнаруживаю гораздо менее проработанные аналоги, которые, оказывается, пользуются спросом. Каждый раз ситуация сия вызывает у меня лёгкое охренение.
Сделал вот удобное создание табличного поля (реквизита и элемента формы) под УФ, потом смотрю на типовую БП 3.0 и вижу там почти ровно то же самое). Перенёс когда-то доп.свойства объектов из единого регистра сведений (как было модно во времена 8.1) в табчасть объекта, глянь - и типовая 1С туда же) Поэтому, просто баянить неохота. Если есть конкретная нужда - выложу, а так, чисто "в никуда" - смысл.
Ну, вот, например:
И кому оно надо?
Вообще, тенденция пугающая. Стабильно большой популярностью пользуются куцые, слабо структурированные, откровенно копипащенные, мутно и отрывочно изложенные "публикации", выложенные средненько знающими для совсем слабо знающих. За счёт рейтинга такие горе-публикации легко обходят действительно профессиональные разработки, стоившие несоизмеримо больше ресурсов их авторам. Энтузиазм профи-авторов, таким образом, не получает должной оценки. Так на первый план ИС выходят не профессиональные разработки, как хотелось бы, а убогие исходники или псевдо-учебные фрагменты (редко-редко можно видеть действительно качественный учебник, буде то справочник или пошаговик). В результате ИС становится "лягушатником" для начинающих, которые и жёлтых книжек-то не читали, не то что материалов ИТС, а в "лучших" публикациях болтается такое позорище, что уж не знаю, как Доржи перед 1С не стыдно.
пы.сы. Себя отношу не к профи, а к средненько знающим. Именно посмотрев на ситуацию и рейтинг, резко перестал выкладывать "статьи". Мне хватило печального опыта с XPath и модальностями/асинхроном. Жаль, что автору этой публикации самокритики недостаёт.
Стабильно большой популярностью пользуются куцые, слабо структурированные, откровенно копипащенные, мутно и отрывочно изложенные "публикации", выложенные средненько знающими для совсем слабо знающих.
Да ну. Вот взять к примеру ildarovich 'а. Его публикации всегда пользуются популярностью. И очень часто на первых местах.
Суть вот в чем: есть настройка СКД с отбором, который настроил пользователь. Нужно вытащить эти настройки отбора и опознать поля, по которым отбор настроен. Например, если СКД построено на справочнике номенклатура и отбор настроен по полю "Наименование" этого справочника, нужно вытащить название этого поля и тип. В настройках отбора это поле фигурирует в "левое значение" и имеет тип "ПолеКомпоновкиДанных". Подскажите, кто знает, есть ли возможность разыменовать это "ПолеКомпоновкиДанных" и есть ли способ вообще вытащить эти отборы из СКД.
в отладчик то я умею. Но в этом вопросе отладчик не помогает. Тему открыл в надежде, что кто-то уже занимался этим вопросом и знает что делать
Я часто занимаюсь этим вопросом и знаю что делать. Идешь в отладчик и там все смотришь. Помнить все эти многочисленные НастройкаПолейКомпоновкиДанных19Серия это к Терминатору. Помимо ЛевоеЗначение часто бывает еще и ПравоеЗначение. Скорее всего то что вы ищете именно там.
КомпоновщикНастроек.ПолучитьНастройки.Отбор - это коллекция. Обходишь коллекцию - видишь какие отборы установлены
а я и обхожу коллекцию отбора. Написал же, что в отладчик умею. Только дело все в том, что в ЭлементеКоллекцииОтбора, поле ЛевоеЗначение имеет тип ПолеКомпоновкиДанных, а мне нужно знать, например, что это реквизит справочника номенклатура с типом, например, "СправочникСсылка.НоменклатурныеГруппы" в этом отладчик не помогает никак.
и вопрос в том, что нужно разыменовать ПолеКомпоновкиДанных, у которого есть только конструктор и более ничего.
Представь себе, что это вычисляемое поле, основанное на полях набора данных - обьекта и спи спокойно.Это Поле. Компоновки. Данных. Не более. Не стоит строить каких-то иллюзий о том, что справочник.
Ну похоже, что задача решаема, но придется повозиться. Строковое представление ПолеКомпоновкиДанных из ЛевоеЗначение разложить на массив подстрок между точками. А дальше погнали, все что в первой подстроке это основные (базовые) поле СКД. Через какие-нибудь ДоступныеПоляОтбораКомпновкиДанных или просто через коллекцию Выбор по реквизиту Поле можно найти это базовое поле и узнать его тип. А дальше в метаданные и сканирование реквизитов.
В общем все сделал уже, кривоватенько, но в целом работает. Всем участникам темы - спасибо за участие
Читайте также: