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

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

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