Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Автоматическая генерация текста запроса в динамическом списке

Автоматическая генерация текста запроса в динамическом списке
Я
   dubolom
 
04.08.21 - 09:08
Всем доброго времени суток!
Подскажите, пожалуйста, как именно динамический список автоматически генерирует текст запроса на основании основной таблицы (если флаг ПроизвольныйЗапрос - Ложь)? Я правильно понимаю, что это - выбор всех возможных полей справочника и всех возможных полей табличных частей (типа ТабличнаяЧасть1.*)?
Как это правильно реализовать программно? (Переделываю в расширении автоматическую генерацию на произвольный запрос через схему запроса).
   brainguard
 
1 - 04.08.21 - 09:10
(0)  Выбор всех возможных полей справочника, но не табличных частей
   dubolom
 
2 - 04.08.21 - 09:11
(1) Когда я вижу произвольные запросы в типовых, там обычно фигурируют конструкции типа ОчереднаяТабличнаяЧасть.*
   brainguard
 
3 - 04.08.21 - 09:13
(2) А ты не ориентируйся на типовые. Создателям типовых нужно получать зарплату, а тебе нужно решать задачи. Делай то, что тебе нужно
   mistеr
 
4 - 04.08.21 - 09:16
(0) Не всех, а тех, которые отображаются в ДС.

А чем не устраивает стандартный запрос?
   acht
 
5 - 04.08.21 - 09:16
(3) > Делай то, что тебе нужно
Без зарплаты
   Вафель
 
6 - 04.08.21 - 09:19
Да и не всех полей, а только видимых
   Вафель
 
7 - 04.08.21 - 09:20
А сам запрос дает возможность вывода полей
   dubolom
 
8 - 04.08.21 - 09:22
(3) Главное, чтобы ничего не слетело от этого. Не пропало поле, на которое что-нибудь ссылается, например.
(4) Нужно добавить соединение с ещё одной таблицей.
   dubolom
 
9 - 04.08.21 - 09:23
Это где-то формализовано, как именно генерируется автоматический запрос?
   ДенисЧ
 
10 - 04.08.21 - 09:24
А зачем его нужно создавать программно?
   dubolom
 
11 - 04.08.21 - 09:25
(10) Ну добавление любого нового поля в запрос или соединения с новой таблицей - это ведь уже произвольный запрос.
   ДенисЧ
 
12 - 04.08.21 - 09:27
(11) Ты не понял вопроса. Зачем это делать _программно_ ?
   dubolom
 
13 - 04.08.21 - 09:30
(12) Хочется сделать по уму, чтобы при обновлениях на следующие релизы, если добавится какое-нибудь новое поле, не пришлось запрос переписывать. Можно ведь и забыть про это.
   Вафель
 
14 - 04.08.21 - 09:31
Слект * фром
   ДенисЧ
 
15 - 04.08.21 - 09:33
(13) Ну если ты вместо обычного котячьего занятия решил заняться подростковым грехом в присядку - кто тебе мешает пробежаться по метаданным и собрать запрос?
   dubolom
 
16 - 04.08.21 - 09:34
(15) Хотелось бы какого-то формального описания, как он генерируется. Просто чтобы всё по фэн-шую сделать, точь-в-точь как было, но с моими изменениями.
Нагуглить я его не смог.
   Вафель
 
17 - 04.08.21 - 09:35
(16) формальное в (14)
   ДенисЧ
 
18 - 04.08.21 - 09:35
(16) И не нагуглишь. Ибо коты, когда им заняться нечем, не в гугль пишут, а немного другим занимаются.
Всё это вшито в платформе.
Можешь устроиться в 1с и посмотреть исходники.
   dubolom
 
19 - 04.08.21 - 09:36
(17) (18) Ок понял вас, спасибки.
   mistеr
 
20 - 04.08.21 - 09:39
(16) Там сложнее, генерируется сразу SQL с пейджингом. Общее описание где-то было, но тебе оно мало поможет.
   ДенисЧ
 
21 - 04.08.21 - 09:49
(20) Пейджинг уже потом добавляется. При отрисовке.
   dubolom
 
22 - 04.08.21 - 10:31
Расковырял, что там в автоматической генерации.
В общем, выбраны практически все реквизиты (будем считать, что все, пофиг). Все табличные части. И поля: Ссылка, Номер, Дата, МоментВремени, ПометкаУдаления, Проведен.
Из них и буду собирать запрос.
   brainguard
 
23 - 04.08.21 - 10:33
(5) Точно
   brainguard
 
24 - 04.08.21 - 10:35
(16) В 1С нет "фэн-шуя"
   dubolom
 
25 - 04.08.21 - 10:36
(24) Значит, у меня - будет.
   dubolom
 
26 - 04.08.21 - 11:32
Ура, я это домучил! Кому интересно:

СхемаЗапроса = Новый СхемаЗапроса;
    ЗапросСписка = СхемаЗапроса.ПакетЗапросов.Добавить();
    ОператорЗаказов = ЗапросСписка.Операторы[0];
    ИсточникЗаказы = ОператорЗаказов.Источники.Добавить("Документ.ЗаказКлиента", "ЗаказКлиента");
    ИсточникАдресаДоставки = ОператорЗаказов.Источники.Добавить("РегистрСведений.Адр1_АдресаДокументов", "АдресаДокументов");
    СоединениеАдресаДоставки = ИсточникАдресаДоставки.Соединения[0];
    СоединениеАдресаДоставки.ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
    СоединениеАдресаДоставки.Условие = Новый ВыражениеСхемыЗапроса("ЗаказКлиента.Ссылка = АдресаДокументов.Документ");
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.Ссылка");
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.Номер");
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.Дата");
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.ПометкаУдаления");
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.Проведен");
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.МоментВремени");
    РеквизитыЗаказа = Метаданные.Документы.ЗаказКлиента.Реквизиты;
    Для Каждого РеквизитЗаказа Из РеквизитыЗаказа Цикл
        ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента." + РеквизитЗаказа.Имя);
    КонецЦикла;    
    Для Каждого ТЧЗаказа Из Метаданные.Документы.ЗаказКлиента.ТабличныеЧасти Цикл
        ДоступнаяВложеннаяТаблица = ЗапросСписка.ДоступныеТаблицы.Найти("Документ.ЗаказКлиента." + ТЧЗаказа.Имя);
        ОператорЗаказов.ВыбираемыеПоля.Добавить(ДоступнаяВложеннаяТаблица);
    КонецЦикла;        
    КоличествоКолонок = ЗапросСписка.Колонки.Количество();
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЗаказКлиента.Партнер.ГруппаДоступа");    
    ЗапросСписка.Колонки[КоличествоКолонок].Псевдоним = "Адр1_ГруппаДоступа";
    ОператорЗаказов.ВыбираемыеПоля.Добавить("ЕСТЬNULL(АдресаДокументов.АдресДоставки, ЗНАЧЕНИЕ(Справочник.Адр1_АдресаДоставки.ПустаяСсылка))");
    ЗапросСписка.Колонки[КоличествоКолонок+1].Псевдоним = "Адр1_АдресДоставки";
    Список.ПроизвольныйЗапрос = Истина;
    Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
   ДенисЧ
 
27 - 04.08.21 - 11:44
(26) Нам извращения не интересны...
   dubolom
 
28 - 04.08.21 - 11:46
(27) То, что делают взрослые дееспособные люди по согласию и к своему удовольствию - не извращение.


Список тем форума
 
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.