Отбор по типу документа в запросе |
Я |
Например есть запрос:
ВЫБРАТЬ
Хозрасчетный.Регистратор
ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный В качестве регистратора могут выступать документы нескольких типов.
Мне извесна конструкция, которая позволяет отобрать данные по типу документа:
ВЫБРАТЬ
Хозрасчетный.Регистратор
ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный ГДЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг Но это не динамический отбор. Я пробовал сделать поле с типом значения ОписаниеТипов и передавать выбранное значение как параметр, но так запрос не понимается:
ВЫБРАТЬ
Хозрасчетный.Регистратор
ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный ГДЕ Хозрасчетный.Регистратор ССЫЛКА &СсылкаНаОбъект Сделать поле типа документа тоже не получается:
ВЫБРАТЬ
Хозрасчетный.Регистратор, ССЫЛКА(Регистратор)//? может по другому надо как-то записывать …
Можно конечно при в ВЫБРАТЬ подставлять конструкцию:
ВЫБОР
КОГДА Хозрасчетный.Регистратор ССЫЛКА Документ.<…> ТОГДА …//Строковое значение ИНАЧЕЕСЛИ ……
…
КОНЕЦ КАК ТипДокумента Но это тоже не универсально, если при дальнейшей разработке расширить список документов для регистратора, придется дописывать новые условия, и отбирать по строковому значению неудобно.
Что Вы можете посоветовать?
Книга знаний: Тип реквизита и тип значения
Книга знаний: Универсальные интерактивные команды для ссылочных объектов
+(1) Книга знаний: v8: Хитрое написание текстов запросов с необязательными условиями;
ВЫБОР или спецреквизит в каждом документе
(3) Спец реквизит это ты конечно загнул
(0) натравить СтрЗаменить на ТекстЗапроса
Если просто отбор по типу, тогда вообще ТаблицаИсточник.Ссылка ССЫЛКА Документ.ЧегоТоТам.
А вот если нужны группировки, множественные отборы, сортировки и пр., то (3)
(6) Да ты че, правда что ли? А (3) ты читал? :)))
В уловии ГДЕ Регистратор.Ссылка ССЫЛКА Документ.ЧеготоТам, также придется добавлять условия при изменении составного типа регистратора.
(3) Мысль о добавлении в документ специального реквизита ТипДокумента была, но это уже изменение конфигурации. Интересно, можноли во внешнем отчете, в запросе это продумать.
Вопрос тогда такой, можно ли получить поле тип которого ОписаниеТиов в запросе в разделе ВЫБРАТЬ. Нет никакого хитрого способа написать что-то вроде:
ВЫБРАТЬ Таблица.Регистратор КАК СамДокумент, ТипЗначения(Таблица.Регистратор) КАК ТипДока …
Тогда ТипДока имел бы тип ОписаниеТипов и при отборе пользователю открывалось окно выбора типов (такое же какое открывается на этапе программирования в конфигураторе при назначении типа реквизитам).
Как можно это сделать? Если никак, то просто скажите мне об этом.
(8)можно, информации достаточно
(4)п1 +1
(8) Тогда только допреквизит, думаю
(8) п1 — 1."Состав" поля Регистратор можно определить по метаданным
2.Если нужно выбирать один тип дока тогда на формы ложишь поле выбора, далее (4.2), если несколько то …
Отбор по типу документа в запросе
непроблема
Нужно предусмотреть возможность возможность выбора нескольких документов. Scooter, как сделать? Подскажите как поля Регистратор определить по метаданным. Не совсем ясно.
Я предполагаю, что нужно положить на форму полеввода поле; установить Тип значения как СписокВыбора, а тип значений списка установить ОписаниеТипа.
Тогда как выбранные типы передать в запрос?
Запрос.Текст="
ВЫБРАТЬ
Хозрасчетный.Регистратор
ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный ГДЕ
Хозрасчетный.Регистратор ССЫЛКА Документ."+ВыбранноеЗначениеВСписке.
Или мне потом в цикле выбранные значения перебирать и добавлять к тексту запроса используя ИЛИ:
ТекстЗапроса =
"ВЫБРАТЬ
Хозрасчетный.Регистратор
ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный ГДЕ"; Для Инд = 0 По ЭлементыФормы.СписокВыбора.Количество()-1 Цикл ТекстЗапроса = ТекстЗапроса + "Хозрасчетный.Регистратор ССЫЛКА Документ."+ ЭлементыФормы.СписокВыбора.Получить + "ИЛИ"; КонецЦикла Что-то подобное должно быть?
Задача решена. Всем спасибо.
TurboConf 5 — расширение возможностей Конфигуратора 1С
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
- Добавить свою публикацию
для этого требуется регистрация
Пишем шаблон для запроса.
ШаблонЗапроса ="|ВЫБРАТЬ| #Таблица.Ссылка КАК Ссылка|ИЗ| #Таблица|";
Затем перебираем все виды документов и составляем текст запроса.
ТекстЗапроса ="";Для каждого ТекДанные из Метаданные.Документы Цикл ТекстЗапроса = ТекстЗапроса +?(ПустаяСтрока(ТекстЗапроса),"","|ОБЪЕДИНИТЬ ВСЕ|")+ СтрЗаменить(ШаблонЗапроса,"#Таблица","Документ."+ ТекДанные.Имя);КонецЦикла;
В результате такой работы у нас будет текст запроса в виде:
ВЫБРАТЬ Документ.АвансовыйОтчет.Ссылка КАК Ссылка ИЗ Документ.АвансовыйОтчет ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Документ.АктВыполненныхРабот.Ссылка КАК Ссылка ИЗ Документ.АктВыполненныхРабот
Дописываем код выполнения запроса.
Запрос =Новый Запрос; Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать();Пока Выборка.Следующий()Цикл Сообщить(Выборка.Ссылка);КонецЦикла;
Весь код быдет выглядеть так:
ШаблонЗапроса ="|ВЫБРАТЬ| #Таблица.Ссылка КАК Ссылка|ИЗ| #Таблица|"; ТекстЗапроса ="";Для каждого ТекДанные из Метаданные.Документы Цикл ТекстЗапроса = ТекстЗапроса +?(ПустаяСтрока(ТекстЗапроса),"","|ОБЪЕДИНИТЬ ВСЕ|")+ СтрЗаменить(ШаблонЗапроса,"#Таблица","Документ."+ ТекДанные.Имя);КонецЦикла; Запрос =Новый Запрос; Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать();Пока Выборка.Следующий()Цикл Сообщить(Выборка.Ссылка);КонецЦикла;
В данной выборке будут все документы базы.
По справочникам просто меняем тип метаданных в цикле.
Для каждого ТекДанные из Метаданные.Справочники Цикл
Весь код будет выглядеть так:
ШаблонЗапроса = " |ВЫБРАТЬ | #Таблица.Ссылка КАК Ссылка |ИЗ | #Таблица |"; ТекстЗапроса = ""; Для каждого ТекДанные из Метаданные.Справочники Цикл ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", " |ОБЪЕДИНИТЬ ВСЕ |") + СтрЗаменить(ШаблонЗапроса, "#Таблица", "Документ." + ТекДанные.Имя); КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Ссылка); КонецЦикла;
предыдущие ()все
≡ к списку статей