Добрый день,уважаемые форумчане. Есть колонка "тип" в табличной части(Все данные при этом берутся из динамического списка). Данные для колонки формируются программно при помощи ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) КАК Тип. Реестр документов, это регистр сведений, а "Ссылка" не что иное, как измерение.Данное измерение имеет составной тип, и имеет множество документов.
Собственно сам вопрос: Необходимо создать поле на форме, в котором можно будет выбрать то, что выбираем в колонке "тип"(а в данной колонке мы выбираем лишь название документов) и соответственно сделать сортировку по тому, что выбрали.
P.S. Да, есть такая великолепная вещь, как отбор в динамическом списке, но задача такова, чтобы сделать это в один клик.
Но выдается сообщение об ошибке :
"Параметры Отбора, Сортировки, Группировки или список отображаемых полей заданы неверно.
по причине:
Невозможно применить фиксированные настройки. Пересекаются элементы отбора."
(4)
Да, отбор есть, после того, как его убрал появилась данная ошибка
Ошибка при выполнении запроса.
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных "НаборДанныхДинамическогоСписка"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(27, 41)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
И ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) <<?>>= &П
У Вас вместо типа передается значение перечисления, которое Вы сами создали. Нужно вместо перечисления передавать что-то типа:
Тип("ДокументСсылка."+Тип)
В данном случае "тип" - это значение того перечисления, которое, полагаю, называется аналогично типу документа (как задано в конфигураторе). Если тип у Вас отображается иначе (синоним), то необходимо как-то привести одно к другому...
Немного неясно, что вот с этим делать "Тип("ДокументСсылка."+Тип)" и как его использовать, возиожно у Вас есть мысли, которые я отобразил в (6) посте*?
Смутное описание задачи... Ничего не понятно. Требуется сделать сортировку или отбор? Если сортировку, то как должен себя повести динамический список при выборе конкретного типа документа? Если отбор из регистра сведений РеестрДокументов только документов определенного типа, то видимо надо менять свойство динамического списка на произвольный запрос и прописывать там условие, что ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) = Тип(&РеквизитТип), где РеквизитТип - строковое значение с именем типа документа...
По поводу ошибки о пересечении элементов отбора, тут надо смотреть какая платформа, есть ли сохраненные пользовательские настройки или предустановленные отборы ДинамическогоСписка на форме.
"Сделать это в один клик" - куда кликать то должны и что хотят получить после этого?
(3)
Необходимо сделать отбор по колонке "тип"(см. скрин).Данный отбор например, сделать из поля(например,ТипТест(см. скрин)).Учитывая, что колонка "тип" создается программно(т.е. при помощи запроса(см. скрин.)), при этом "РеестрДокументов.Ссылка" состоит из сылок на документы(см.скрин).
Если я все правильно понял, то реализовать это можно приблизительно таким образом:
&НаКлиенте
Процедура Реквизит2ПриИзменении(Элемент)
ОбработатьТип();
КонецПроцедуры
&НаСервере
Процедура ОбработатьТип()
ТипРеквизита2 = ТипЗнч(Объект.Реквизит2);
ИмяТипа = Метаданные.НайтиПоТипу(ТипРеквизита2).ПолноеИмя();
ТипВСписке = Элементы.Реквизит1.СписокВыбора.НайтиПоЗначению(ИмяТипа);
Если ТипВСписке <> Неопределено Тогда
Объект.Реквизит1 = ИмяТипа;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Реквизит1.СписокВыбора.Очистить();
СписокТиповДокументов = Новый СписокЗначений;
РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты("Объект");
РеквизитСоставногоТипа = Неопределено;
Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
Если РеквизитФормы.Имя = "Реквизит2" Тогда
РеквизитСоставногоТипа = РеквизитФормы;
Прервать;
КонецЕсли;
КонецЦикла;
Если РеквизитСоставногоТипа <> Неопределено Тогда
Для каждого ТипДокумента Из РеквизитСоставногоТипа.ТипЗначения.Типы() Цикл
ИмяТипа = Метаданные.НайтиПоТипу(ТипДокумента).ПолноеИмя();
Если ИмяТипа <> Неопределено Тогда
Элементы.Реквизит1.СписокВыбора.Добавить(ИмяТипа, ТипДокумента);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Показать
Обработку для теста прикрепил. У объекта обработки есть реквизит составного типа (поменяйте на свой состав). Я получаю его как реквизит формы, перечисляю возможные типы в нем, затем заполняю первый реквизит именами полных типов и человеческими представлениями найденных типов. При попытке выбрать во втором реквизите конкретный тип документа - идет поиск выбранного типа в первом реквизите и затем установка значения этого реквизита.
По аналогии думаю можно получить тип выбранного поля динамического списка (не вызывать в запросе ТИПЗНАЧЕНИЯ(), а сразу выводить ссылку), проверять уже в момент активации.
умаю можно получить тип выбранного поля динамического списка (не вызывать в запросе ТИПЗНАЧЕНИЯ(), а сразу выводить ссылку), проверят
Документы поменял на свои.И действительно, в поле "Реквизит1"Появился весь список документов.При этом непонятна как работает должен работать "Реквизит2", ибо у меня открывается просто подобное окно, и необходимо выбрать все проведенные поддокументы(см.скрины)
Т.е. нет такого, что "При попытке выбрать во втором реквизите конкретный тип документа - идет поиск выбранного типа в первом реквизите и затем установка значения этого реквизита".
(12)
Возможно, я делаю что-то не так, но вот ход моих действий,возможно, Вам удастся понять в чем проблема:
1.Создаю 2 реквизита (1 реквизит - "Выбор"(строка, 255 символов); 2 реквизит - "Тип_фильтрации"(ссылки на все интересующие документы(составной тип)
2.Далее, перемещаю на форму эти 2 реквизита(у "Тип_фильтрации" создаю событие "При изменении" и пишу туда
ОбработатьТип();
)
3.Так же создаю на форме событие "При изменении" и вставляю следующий код:
Элементы.Выбор.СписокВыбора.Очистить();
СписокТиповДокументов = Новый СписокЗначений;
РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты();
РеквизитСоставногоТипа = Неопределено;
Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
Если РеквизитФормы.Имя = "Тип_фильтрации" Тогда
РеквизитСоставногоТипа = РеквизитФормы;
Прервать;
КонецЕсли;
КонецЦикла;
Если РеквизитСоставногоТипа <> Неопределено Тогда
Для каждого ТипДокумента Из РеквизитСоставногоТипа.ТипЗначения.Типы() Цикл
ИмяТипа = Метаданные.НайтиПоТипу(ТипДокумента).ПолноеИмя();
Если ИмяТипа <> Неопределено Тогда
Элементы.Выбор.СписокВыбора.Добавить(ИмяТипа, ТипДокумента);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Показать
4.Так же создаю процедуру "ОбработатьТип"
ТипРеквизита2 = ТипЗнч(Тип_фильтрации);
ИмяТипа = Метаданные.НайтиПоТипу(ТипРеквизита2).ПолноеИмя();
ТипВСписке = Элементы.Выбор.СписокВыбора.НайтиПоЗначению(ИмяТипа);
Если ТипВСписке <> Неопределено Тогда
Выбор = ИмяТипа;
КонецЕсли;
5.При этом, у меня есть кнопка "Применить период", где уже производится отбор по периоду, соответственно получается уже такой код
(13) У тебя есть как минимум 2 выхода:
1. Использовать СтрЗаменить/СтрШаблон применительно к тексту запроса (соответственно для динамического списка придется "На Лету" подменять запрос):
ТекстЗапроса = СтрЗаменить("ВЫБРАТь * ИЗ Таблица ГДЕ ТИПЗНАЧЕНИЯ(Таблица.Регистратор) = ТИП(%PlaceHolder%)", "%PlaceHolder%", ТекстовоеНаименованиеОтбираемогоТипа);
)
2. Передавать в качестве параметра не имя типа, а Пустую Ссылку с нужным типом:
Запрос.ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 10
| *
|ИЗ
| РегистрНакопления.ПрочиеРасходыНезавершенногоПроизводства КАК ПрочиеРасходыНезавершенногоПроизводства
|ГДЕ
| ТИПЗНАЧЕНИЯ(ПрочиеРасходыНезавершенногоПроизводства.Регистратор) = ТИПЗНАЧЕНИЯ(&ТЗ)";
Запрос.УстановитьПараметр("ТЗ", ПустаяСсылкаСТипомЛюбогоДокумента);
(15) Всмысле? Там где идет сравнение в секции "ГДЕ" добавляешь к своему запросу динамического списка. Или у тебя там стоит не произвольный запрос?
Можно даже немного его доработать таким образом:
...
ГДЕ
ВЫБОР КОГДА &ТЗ <> НЕОПРЕДЕЛЕНО ТОГДА
ТИПЗНАЧЕНИЯ(ПрочиеРасходыНезавершенногоПроизводства.Регистратор) = ТИПЗНАЧЕНИЯ(&ТЗ)
ИНАЧЕ
ИСТИНА
КОНЕЦ
Показать
Чтобы при передаче параметра &ТЗ с типом Неопределено можно было получать выборку по всем документам (в качестве альтернативы отборам построителя).
Можно еще это почитать its. И про процедуру из БСП ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()
(16)
Запрос - произвольный
Правильно ли я понимаю, что вместо "ПрочиеРасходыНезавершенногоПроизводства.Регистратор" я должен поставить свой РегистрСведений?