СКД. Проверка корректности (доступности) полей отбора
Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Вожусь с программной установкой отбора.
Есть у меня механизм для пользователя: он указывает счет, тип суммы и отбор. Ввод отбора реализован через КомпоновщикНастроекКомпоновкиДанных и создание для него специальной СКД.
Допустим, пользователь создал показатель по счету 41.01 и отбор Субконто1.Весовой = Истина (где Субконто1 - "Номенклатура"). И всё хорошо.
Затем, у меня поменялся счет с 41.01 на 91.01 и Субконто1 теперь "Прочие доходы и расходы". И если посмотреть на форме - то такой отбор будет с красным крестом, мол некорректный, что правильно и вот вопрос:
а как программно быстро проверить возможность задания такого отбора?
У меня есть идея, взять каждый элемент отбора, если левое значение - поле компоновки данных, разложить его на массив с разделителем ".". Затем, начиная с первого уровня смотреть каких типов может быть такой реквизит и может ли быть вообще. Если может, то спускаемся дальше по массиву. Но уж больно "тяжелый" код получается. Неужто только так?
Есть у меня механизм для пользователя: он указывает счет, тип суммы и отбор. Ввод отбора реализован через КомпоновщикНастроекКомпоновкиДанных и создание для него специальной СКД.
Допустим, пользователь создал показатель по счету 41.01 и отбор Субконто1.Весовой = Истина (где Субконто1 - "Номенклатура"). И всё хорошо.
Затем, у меня поменялся счет с 41.01 на 91.01 и Субконто1 теперь "Прочие доходы и расходы". И если посмотреть на форме - то такой отбор будет с красным крестом, мол некорректный, что правильно и вот вопрос:
а как программно быстро проверить возможность задания такого отбора?
У меня есть идея, взять каждый элемент отбора, если левое значение - поле компоновки данных, разложить его на массив с разделителем ".". Затем, начиная с первого уровня смотреть каких типов может быть такой реквизит и может ли быть вообще. Если может, то спускаемся дальше по массиву. Но уж больно "тяжелый" код получается. Неужто только так?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
Тьфу! Оказалось всё очень легко!
Я просто был уверен, что НайтиПоле() в любом случае вернёт Неопределено. А оно оказывается вон как, и "через точку" поля анализирует. Круто!
ПолеОтбора = Новый ПолеКомпоновкиДанных("Субконто1.Весовой");
НайдПоле = КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.НайтиПоле(л_ПолеОтбора );
Я просто был уверен, что НайтиПоле() в любом случае вернёт Неопределено. А оно оказывается вон как, и "через точку" поля анализирует. Круто!
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
попробуйте:
КомпоновщикНастроекКомпоновкиДанных (DataCompositionSettingsComposer)
Восстановить (Refresh)
Синтаксис:
Восстановить(<Способ>)
...
Вызов метода с параметром <Способ> = ПроверятьДоступность:
удалит из настроек все элементы, которые содержат поля, не доступные для текущих функциональных опций и прав.
КомпоновщикНастроекКомпоновкиДанных (DataCompositionSettingsComposer)
Восстановить (Refresh)
Синтаксис:
Восстановить(<Способ>)
...
Вызов метода с параметром <Способ> = ПроверятьДоступность:
удалит из настроек все элементы, которые содержат поля, не доступные для текущих функциональных опций и прав.
"Полное" делает то, что я хочу делать сам (снимает признак "Использовать" у невалидных элементов отбора). И этот метод мне очень даже пригодится.
Но, хотелось всё же чтобы можно было прям проверить поле на валидность. А то получается, сначала поле нужно запихать в отбор, потом восстановить компоновщик настроек и посмотреть не изменился ли у нашего элемента признак использования. Это несомненно легче, чем возиться с метаданными, но выглядит как костыль.
Но в любом случае спасибо.
Но, хотелось всё же чтобы можно было прям проверить поле на валидность. А то получается, сначала поле нужно запихать в отбор, потом восстановить компоновщик настроек и посмотреть не изменился ли у нашего элемента признак использования. Это несомненно легче, чем возиться с метаданными, но выглядит как костыль.
Но в любом случае спасибо.
Тьфу! Оказалось всё очень легко!
Я просто был уверен, что НайтиПоле() в любом случае вернёт Неопределено. А оно оказывается вон как, и "через точку" поля анализирует. Круто!
ПолеОтбора = Новый ПолеКомпоновкиДанных("Субконто1.Весовой");
НайдПоле = КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.НайтиПоле(л_ПолеОтбора );
Я просто был уверен, что НайтиПоле() в любом случае вернёт Неопределено. А оно оказывается вон как, и "через точку" поля анализирует. Круто!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот