Выборка данных

1. direx53 19.07.17 15:24 Сейчас в теме
Добрый день,уважаемые форумчане. Есть колонка "тип" в табличной части(Все данные при этом берутся из динамического списка). Данные для колонки формируются программно при помощи ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) КАК Тип. Реестр документов, это регистр сведений, а "Ссылка" не что иное, как измерение.Данное измерение имеет составной тип, и имеет множество документов.
Собственно сам вопрос: Необходимо создать поле на форме, в котором можно будет выбрать то, что выбираем в колонке "тип"(а в данной колонке мы выбираем лишь название документов) и соответственно сделать сортировку по тому, что выбрали.
P.S. Да, есть такая великолепная вещь, как отбор в динамическом списке, но задача такова, чтобы сделать это в один клик.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. direx53 19.07.17 15:28 Сейчас в теме
Попытался создать отдельное перечисление, которое бы равнялось названию документов:

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

Но выдается сообщение об ошибке :
"Параметры Отбора, Сортировки, Группировки или список отображаемых полей заданы неверно.
по причине:
Невозможно применить фиксированные настройки. Пересекаются элементы отбора."
4. starik-2005 3088 19.07.17 22:23 Сейчас в теме
(2)
Невозможно применить фиксированные настройки. Пересекаются элементы отбора.
Вот именно это и происходит. Вы открываете динамический список с уже установленным отбором, а потом пытаетесь по этому полю еще раз отбор установить.
5. direx53 20.07.17 09:14 Сейчас в теме
(4)
Да, отбор есть, после того, как его убрал появилась данная ошибка
Ошибка при выполнении запроса.
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных "НаборДанныхДинамическогоСписка"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(27, 41)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
И ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) <<?>>= &П
7. starik-2005 3088 20.07.17 10:47 Сейчас в теме
(5)
ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) >= &П
У Вас вместо типа передается значение перечисления, которое Вы сами создали. Нужно вместо перечисления передавать что-то типа:
Тип("ДокументСсылка."+Тип)
В данном случае "тип" - это значение того перечисления, которое, полагаю, называется аналогично типу документа (как задано в конфигураторе). Если тип у Вас отображается иначе (синоним), то необходимо как-то привести одно к другому...
8. direx53 20.07.17 11:10 Сейчас в теме
(7)
Тип("ДокументСсылка."+Тип)

Немного неясно, что вот с этим делать "Тип("ДокументСсылка."+Тип)" и как его использовать, возиожно у Вас есть мысли, которые я отобразил в (6) посте*?
9. starik-2005 3088 20.07.17 11:39 Сейчас в теме
(8)
возиожно у Вас есть мысли
У нас-то есть, а вот Вам рекомендую глубоко подумать (да, это сложно, но полезно - как чеснок - если Вы не вампир, конечно).
3. PerlAmutor 155 19.07.17 21:45 Сейчас в теме
Смутное описание задачи... Ничего не понятно. Требуется сделать сортировку или отбор? Если сортировку, то как должен себя повести динамический список при выборе конкретного типа документа? Если отбор из регистра сведений РеестрДокументов только документов определенного типа, то видимо надо менять свойство динамического списка на произвольный запрос и прописывать там условие, что ТИПЗНАЧЕНИЯ(РеестрДокументов.Ссылка) = Тип(&РеквизитТип), где РеквизитТип - строковое значение с именем типа документа...

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

"Сделать это в один клик" - куда кликать то должны и что хотят получить после этого?
6. direx53 20.07.17 09:35 Сейчас в теме
(3)
Необходимо сделать отбор по колонке "тип"(см. скрин).Данный отбор например, сделать из поля(например,ТипТест(см. скрин)).Учитывая, что колонка "тип" создается программно(т.е. при помощи запроса(см. скрин.)), при этом "РеестрДокументов.Ссылка" состоит из сылок на документы(см.скрин).
Прикрепленные файлы:
10. PerlAmutor 155 20.07.17 16:06 Сейчас в теме
Если я все правильно понял, то реализовать это можно приблизительно таким образом:

&НаКлиенте
Процедура Реквизит2ПриИзменении(Элемент)

    ОбработатьТип();

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

&НаСервере
Процедура ОбработатьТип()

    ТипРеквизита2 = ТипЗнч(Объект.Реквизит2);
    ИмяТипа = Метаданные.НайтиПоТипу(ТипРеквизита2).ПолноеИмя();
    ТипВСписке = Элементы.Реквизит1.СписокВыбора.НайтиПоЗначению(ИмяТипа);
    Если ТипВСписке <> Неопределено Тогда
        Объект.Реквизит1 = ИмяТипа;
    КонецЕсли;

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элементы.Реквизит1.СписокВыбора.Очистить();
    СписокТиповДокументов = Новый СписокЗначений;

    РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты("Объект");

    РеквизитСоставногоТипа = Неопределено;
    Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
        Если РеквизитФормы.Имя = "Реквизит2" Тогда
            РеквизитСоставногоТипа = РеквизитФормы;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если РеквизитСоставногоТипа <> Неопределено Тогда
        Для каждого ТипДокумента Из РеквизитСоставногоТипа.ТипЗначения.Типы() Цикл
            ИмяТипа = Метаданные.НайтиПоТипу(ТипДокумента).ПолноеИмя();
            Если ИмяТипа <> Неопределено Тогда
                Элементы.Реквизит1.СписокВыбора.Добавить(ИмяТипа, ТипДокумента);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Показать


Обработку для теста прикрепил. У объекта обработки есть реквизит составного типа (поменяйте на свой состав). Я получаю его как реквизит формы, перечисляю возможные типы в нем, затем заполняю первый реквизит именами полных типов и человеческими представлениями найденных типов. При попытке выбрать во втором реквизите конкретный тип документа - идет поиск выбранного типа в первом реквизите и затем установка значения этого реквизита.

По аналогии думаю можно получить тип выбранного поля динамического списка (не вызывать в запросе ТИПЗНАЧЕНИЯ(), а сразу выводить ссылку), проверять уже в момент активации.
Прикрепленные файлы:
ВнешняяОбработка_ТестТипов.epf
11. direx53 21.07.17 14:06 Сейчас в теме
(10)
умаю можно получить тип выбранного поля динамического списка (не вызывать в запросе ТИПЗНАЧЕНИЯ(), а сразу выводить ссылку), проверят


Документы поменял на свои.И действительно, в поле "Реквизит1"Появился весь список документов.При этом непонятна как работает должен работать "Реквизит2", ибо у меня открывается просто подобное окно, и необходимо выбрать все проведенные поддокументы(см.скрины)
Т.е. нет такого, что "При попытке выбрать во втором реквизите конкретный тип документа - идет поиск выбранного типа в первом реквизите и затем установка значения этого реквизита".
Прикрепленные файлы:
12. PerlAmutor 155 21.07.17 17:37 Сейчас в теме
(11) достаточно выбрать тип документа, не обязательно выбирать сам документ. Но работать должно и в случае отказа от выбора документа.
13. direx53 24.07.17 12:15 Сейчас в теме
(12)
Возможно, я делаю что-то не так, но вот ход моих действий,возможно, Вам удастся понять в чем проблема:
1.Создаю 2 реквизита (1 реквизит - "Выбор"(строка, 255 символов); 2 реквизит - "Тип_фильтрации"(ссылки на все интересующие документы(составной тип)
2.Далее, перемещаю на форму эти 2 реквизита(у "Тип_фильтрации" создаю событие "При изменении" и пишу туда
  ОбработатьТип();
)
3.Так же создаю на форме событие "При изменении" и вставляю следующий код:
Элементы.Выбор.СписокВыбора.Очистить();
    СписокТиповДокументов = Новый СписокЗначений;

    РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты();

    РеквизитСоставногоТипа = Неопределено;
    Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
        Если РеквизитФормы.Имя = "Тип_фильтрации" Тогда
            РеквизитСоставногоТипа = РеквизитФормы;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если РеквизитСоставногоТипа <> Неопределено Тогда
        Для каждого ТипДокумента Из РеквизитСоставногоТипа.ТипЗначения.Типы() Цикл
            ИмяТипа = Метаданные.НайтиПоТипу(ТипДокумента).ПолноеИмя();
            Если ИмяТипа <> Неопределено Тогда
               Элементы.Выбор.СписокВыбора.Добавить(ИмяТипа, ТипДокумента);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
Показать

4.Так же создаю процедуру "ОбработатьТип"
    ТипРеквизита2 = ТипЗнч(Тип_фильтрации);
    ИмяТипа = Метаданные.НайтиПоТипу(ТипРеквизита2).ПолноеИмя();
    ТипВСписке = Элементы.Выбор.СписокВыбора.НайтиПоЗначению(ИмяТипа);
    Если ТипВСписке <> Неопределено Тогда
        Выбор = ИмяТипа;
    КонецЕсли;

5.При этом, у меня есть кнопка "Применить период", где уже производится отбор по периоду, соответственно получается уже такой код
	Список.Отбор.Элементы.Очистить();    
	ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

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

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

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

Появляется ошибка (см. скрин)
Прикрепленные файлы:
14. PerlAmutor 155 27.07.17 11:06 Сейчас в теме
(13) У тебя есть как минимум 2 выхода:
1. Использовать СтрЗаменить/СтрШаблон применительно к тексту запроса (соответственно для динамического списка придется "На Лету" подменять запрос):
ТекстЗапроса = СтрЗаменить("ВЫБРАТь * ИЗ Таблица ГДЕ ТИПЗНАЧЕНИЯ(Таблица.Регистратор) = ТИП(%PlaceHolder%)", "%PlaceHolder%", ТекстовоеНаименованиеОтбираемогоТипа);
)


2. Передавать в качестве параметра не имя типа, а Пустую Ссылку с нужным типом:

Запрос.ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 10
|    *
|ИЗ
|	РегистрНакопления.ПрочиеРасходыНезавершенногоПроизводства КАК ПрочиеРасходыНезавершенногоПроизводства
|ГДЕ
|	ТИПЗНАЧЕНИЯ(ПрочиеРасходыНезавершенногоПроизводства.Регистратор) = ТИПЗНАЧЕНИЯ(&ТЗ)";
Запрос.УстановитьПараметр("ТЗ", ПустаяСсылкаСТипомЛюбогоДокумента);
Показать
15. direx53 27.07.17 15:57 Сейчас в теме
(14)
а куда второй запрос писать в дин. списке?
16. PerlAmutor 155 28.07.17 08:13 Сейчас в теме
(15) Всмысле? Там где идет сравнение в секции "ГДЕ" добавляешь к своему запросу динамического списка. Или у тебя там стоит не произвольный запрос?
Можно даже немного его доработать таким образом:

...
ГДЕ
    ВЫБОР КОГДА &ТЗ <> НЕОПРЕДЕЛЕНО ТОГДА
    	ТИПЗНАЧЕНИЯ(ПрочиеРасходыНезавершенногоПроизводства.Регистратор) = ТИПЗНАЧЕНИЯ(&ТЗ)
    ИНАЧЕ
    	ИСТИНА
    КОНЕЦ
Показать


Чтобы при передаче параметра &ТЗ с типом Неопределено можно было получать выборку по всем документам (в качестве альтернативы отборам построителя).
Можно еще это почитать its. И про процедуру из БСП ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()
17. direx53 28.07.17 09:15 Сейчас в теме
(16)
Запрос - произвольный
Правильно ли я понимаю, что вместо "ПрочиеРасходыНезавершенногоПроизводства.Регистратор" я должен поставить свой РегистрСведений?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот