|   |   | 
| 
 | Спецы, посоветуйте Мане, как программировать на 1С | ☑ | ||
|---|---|---|---|---|
| 0
    
        Maniac 22.11.17✎ 18:29 | 
        Как один огромный запрос, в котором запрос в которм штук 10 запросов с разных регистров.
 Разбить на отдельные тексты запросов, с одними и теми же отборами (построитель на 1С УТ10) И взатем чтобы все в кучу собрать нормально. Выгрузки в таблицы и прочее не предлагать. | |||
| 1
    
        Maniac 22.11.17✎ 18:30 | 
        уже даже не 10 даже запросов а штук 15. текст запроса сейчас на километр.
 Плюс там куча всяких параметров, разрывов текста и прочее. Что его даже в конструкторе уже не отрыть. И все больше и больше хотят. Вот тока что еще два запроса в этот же запрос закинул с новыми данными. | |||
| 2
    
        1c-bs 22.11.17✎ 18:41 | 
        Временные таблицы уже предлагали?     | |||
| 3
    
        Diman000 22.11.17✎ 18:43 | 
        Цель какая?
 Повышение производительности или читабельности? | |||
| 4
    
        nordbox 22.11.17✎ 18:45 | 
        ИМХО может как то так?
 Функция СформироватьЗапрос(<твои параметры>) ТЗ= Новый ТаблицаЗначений; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ .......... ........... ТЗ= Запрос.Выполнить().Выгрузить(); Возврат ТЗ; КонецФукции И так кучу маленьких запросов потом собрать в кучу всё | |||
| 5
    
        Denis_CFO 22.11.17✎ 18:51 | 
        (0) Если чисто текст разбить - раздели как хочешь, а потом собери ТекстЗапроса = ТекстЗапроса + ТекущийТекст.
 Запрос.Текст = ТекстЗапроса; Потом спПараметры = Запрос.НайтиПараметры; Для каждого мПар Из спПараметры Цикл //значение параметра КонецЦикла А вообще вот штука полезная есть: http://catalog.mista.ru/public/617990/ Неужели Maniac такого не знает??? Или я вопроса не понял? | |||
| 6
    
        nordbox 22.11.17✎ 18:53 | 
        Можно поиграться по другому
 Функция ТекстЗапроса() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ .......... ........... Возврат Запрос; КонецФукции Процедура ВыполнитьЗапрос(параметры) ТЗ=ТекстЗапроса() ..... <параметры> ТЗ.Выполнить() КонецПроцедуры | |||
| 7
    
        Maniac 22.11.17✎ 18:55 | 
        (3) все вместе взятое.     | |||
| 8
    
        nordbox 22.11.17✎ 19:03 | 
        Вот так наверное будет правильнее
 Функция ТекстЗапроса1() // и куча таких маленьких запросов Текст = "ВЫБРАТЬ .......... ........... Возврат Текст; КонецФункции Процедура ВыполнитьЗапрос(параметры) ТЗ=Новый Запрос; ТЗ=ТекстЗапроса1()+ТекстЗапроса2(); ..... <параметры> ТЗ.Выполнить() КонецПроцедуры | |||
| 9
    
        1c-bs 22.11.17✎ 19:04 | 
        (8) А параметры? А данные результатов выполнения других подзапросов?     | |||
| 10
    
        mistеr 22.11.17✎ 19:05 | 
        (0) Освоить наконец СКД. Там использовать объединение наборов данных. Отборы будут применяться к каждому запросу.     | |||
| 11
    
        nordbox 22.11.17✎ 19:06 | 
        (9) Я же сказал поиграться )) это как идея ))
 а дальше чисто полет фантазии | |||
| 12
    
        nordbox 22.11.17✎ 19:07 | 
        +11 можно каждый запрос в отдельности выполнять а потом выгружать уже в общую таблицу
 в общем как нДравится ) | |||
| 13
    
        Maniac 22.11.17✎ 19:09 | 
        (10) вариант.     | |||
| 14
    
        Maniac 22.11.17✎ 19:11 | 
        (12) плохой вариант.
 Ибо фишка в условиях. Например база у человека со 100 000 товаров. Если мы ставим условие остаток больше 0 (один запрос) и продажи больше 0 (второй запрос) то в случае одного запроса мы получим таблицу где условие удовлетворяет обоим условиям. | |||
| 15
    
        Maniac 22.11.17✎ 19:13 | 
        (10) а если в одном наборе остатки а в другом наборе продажи.
 Эти наборы выберут только товары у которых были продажи и есть остатки. А не все остатки или не все продажи. а) нам не нужны товары у которых нет остатка, но есть продажи (те исключить даже те у которых он есть но нет продажи) б) нам не нужны проданные товары у которых нет остатка (те даже если продажа была, вывести только те у которых есть остаток) | |||
| 16
    
        nordbox 22.11.17✎ 19:23 | 
        Погоди, что то не понятно
 например: Остаток=0 Продажи=5 Продажи=5 Остаток=0 эти товары исключить Но эти условия одинаковы Так что ли ? или я что то не так понял? | |||
| 17
    
        mistеr 22.11.17✎ 19:26 | 
        (15) Без отбора выберут все остатки и все продажи.
 Называешь поля Остаток и СуммаПродаж одинаково и ставишь один отбор на два запроса. Называешь поля Остаток и СуммаПродаж по-разному и ставишь отборы как хочешь. | |||
| 18
    
        Maniac 22.11.17✎ 20:18 | 
        (16) тогда в итоге 0
 Остаток=0 Продажи=5 Остаток=1 Продажи=5 Остаток=5 Продажи=0 Итог Остаток=1 Продажи=5 | |||
| 19
    
        4St 23.11.17✎ 09:11 | 
        (1) Если надо протащить одни и те же параметры в несколько запросов/подзапросов одной большой простыни, и состав этих параметров постоянно меняется, то можно сделать как-то так.
 1. В текстах запросов нужные параметры задаем в виде выбрать .... из ... Где ... И &НашНаборПараметров (и так в каждом запросе) 2. Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НашНаборПараметров", "Номенклатура = &Номенклатура И Контрагент = &Контрагент"); | |||
| 20
    
        RomaH naïve 23.11.17✎ 09:20 | 
        схему запроса не смотрел?     | |||
| 21
    
        VladZ 23.11.17✎ 09:22 | 
        (0) Где можно запрос посмотреть?     | |||
| 22
    
        VladZ 23.11.17✎ 09:25 | 
        Ха-ха... Кто ветку переименовал? "Спецы, посоветуйте Мане, как программировать на 1С" - прикольное название ветки. :)     | |||
| 23
    
        ildary 23.11.17✎ 09:25 | 
        (21) бойтесь своих желаний - иногда они сбываются     | |||
| 24
    
        Serg_1960 23.11.17✎ 09:40 | 
        Типовая УПП:
 ТекстЗапроса = ТекстЗапроса_Материалы; ТаблицаЗатрат = ПолучитьТаблицуЗатратДляПечатиИЗаполненияДокументов(СсылкаНаОбъект, ТекстЗапроса, СтруктраПараметров); ... Функция ПолучитьТаблицуЗатратДляПечатиИЗаполненияДокументов(ДокументСсылка, ТекстЗапроса, СтруктраПараметров) Запрос = Новый Запрос(); Запрос.Текст = ТекстЗапроса; ... Если глЗначениеПеременной("ИспользоватьРасширеннуюАналитикуУчетаНоменклатурыИЗатрат") И (глЗначениеПеременной("ДатаНачалаИспользованияРасширеннойАналитикиУчетаНоменклатурыИЗатрат") <= ДокументСсылка.Дата) Тогда ДополнитьЗапросЗатратамиРасширеннаяАналитика(ДокументСсылка, Запрос, ВидУчета, КоэффициентПересчетаВВалюту); Иначе ДополнитьЗапросЗатратамиПартионныйУчет(ДокументСсылка, Запрос, ВидУчета, КоэффициентПересчетаВВалюту); КонецЕсли; ... PS: надеюсь я ответил на вопрос автора :) | |||
| 25
    
        ptiz 23.11.17✎ 09:41 | 
        (0) Пригласить программиста.     | |||
| 26
    
        Волшебник модератор 23.11.17✎ 09:42 | 
        (25) Или таксиста-программиста     | |||
| 27
    
        xxTANATORxx 23.11.17✎ 09:45 | 
        (0)смотрите как в ЗУПе 3.1 сделано     | |||
| 28
    
        Balabass 23.11.17✎ 09:50 | 
        (0) Следи за кармой - делай читабельно и понятно.     | |||
| 29
    
        ildary 23.11.17✎ 09:51 | 
        (26) бетонщика помню, геодизист был в этом году, на днях появился программист-обнюхивальщик. А когда был таксист? Или это история как Маньяк знакомого учил?     | |||
| 30
    
        GANR 23.11.17✎ 09:53 | 
        (0) Я считаю, что первопричиной громоздких запросов являются не очень хорошо подходящие под прикладную задачу структуры данных. Пока от них не избавишься - хороших запросов не видать как своих ушей, имхо.     | |||
| 31
    
        DrShad 23.11.17✎ 09:54 | 
        текст запроса в студию - думаю там много лишнего     | |||
| 32
    
        arsik гуру 23.11.17✎ 09:58 | 
        (0) Разработка через выгрузку во временные таблицы. В продакшен все собирается в один запрос.
 Ну и по крайней мере привести к виду что бы конструктор открывал. | |||
| 33
    
        nordbox 23.11.17✎ 09:58 | ||||
| 34
    
        pavig 23.11.17✎ 10:00 | 
        (0)
 Если цель тоьлко в отборах то используй СКД - это лучший вариант. Если цель повысить читабельность - то используй ВТ типа как в ЗУПе - куча запросов с одним менеджером временных таблиц. | |||
| 35
    
        DrShad 23.11.17✎ 10:03 | 
        (34) если Маня ни разу не юзал СКД, прикинь как он намучается с отборами на разных уровнях СКД?   ))))     | |||
| 36
    
        Denis_CFO 23.11.17✎ 10:04 | 
        (26) "Или таксиста-программиста"
 Сначала прочитал как "Таксидермиста" :)) | |||
| 37
    
        ildary 23.11.17✎ 10:06 | 
        (34) не знаю как в ЗУП-е, но в УТ11 куча куча запросов с одним менеджером временных таблиц - ни разу не читабельно, а в отладке вообще ужас.     | |||
| 38
    
        DrShad 23.11.17✎ 10:06 | 
        (37) все нормально отлаживается при наличии прямых рук     | |||
| 39
    
        ptiz 23.11.17✎ 10:07 | 
        (27) +
 И так не делайте | |||
| 40
    
        mehfk 23.11.17✎ 10:07 | 
        (37) ирПортативные в помощь.     | |||
| 41
    
        DrShad 23.11.17✎ 10:09 | 
        (40) в УТ 11!? ха-ха три раза     | |||
| 42
    
        Timon1405 23.11.17✎ 10:09 | 
        (37)  ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(...)     | |||
| 43
    
        DrShad 23.11.17✎ 10:10 | 
        (42) +1
 если даже таковой нет, можно свою написать - там всего 4 строчки | |||
| 44
    
        тарам пам пам 23.11.17✎ 10:12 | 
        (43) Последние версии платформы умеют показывать ВТ даже без снятия режима совместимости. МенеджерВременныхТаблиц.Таблицы.Найти("втНоменклатура").ПолучитьДанные() можно прямо в отладчике писать теперь.     | |||
| 45
    
        ildary 23.11.17✎ 10:14 | 
        (37) Они же не поддерживали УФ.
 (38) Подскажите направление для учебы пожалуйста. Батарею для рук постараюсь сам найти. Или речь идёт о (42) и (43)? | |||
| 46
    
        patria0muerte 23.11.17✎ 10:37 | 
        Там же кстати впилили в одном из релизов платформы - объектную модель запроса. Можно кодом текст собирать и вот это вот все.     | |||
| 47
    
        DrShad 23.11.17✎ 10:38 | 
        (45) именно, да и с менеджером теперь намного проще работать     | |||
| 48
    
        Starhan 23.11.17✎ 10:38 | 
        (37) сейчас (=в последних платформах) можно временные таблицы в отладке смотреть без всяких приблуд.     | |||
| 49
    
        Starhan 23.11.17✎ 10:40 | 
        блин опередили     | |||
| 50
    
        ildary 23.11.17✎ 10:42 | 
        (47) век живи, век учись, спасибо за науку!     | |||
| 51
    
        ildary 23.11.17✎ 10:46 | 
        (47) А можно подробности простоты работы с менеджером? Я кроме  возможности получить его таблицы в отладчике не нашел в справке?     | |||
| 52
    
        patria0muerte 23.11.17✎ 10:49 | 
        (51) У этой таблицы есть метод ПолучитьДанные(), который тебе возвращает РезультатЗапроса     | |||
| 53
    
        ildary 23.11.17✎ 10:55 | 
        (52) Функцию ПолучитьДанные() уже упоминали. Мне интересно, что скрывается под "да и с менеджером теперь намного проще работать"     | |||
| 54
    
        DrShad 23.11.17✎ 10:57 | 
        (53) ну к примеру вот 
 МенеджерВременныхТаблиц (TempTablesManager) Таблицы (Tables) Использование: Только чтение. Описание: Тип: ВременныеТаблицыЗапроса. Содержит временные таблицы, находящиеся в менеджере. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). | |||
| 55
    
        ildary 23.11.17✎ 11:02 | 
        (54) понял, спасибо!     | |||
| 56
    
        DexterMorgan 23.11.17✎ 11:22 | 
        (0) Кстати, в одной конторе, году так в 11ом купили твое рм по закупкам, помнится там был ДС в котором куча ОБЪЕДИНИТЬ, когда всех пользователей запустили в базу тормозило нереально. В итоге аналитические показатели (типа средние продажи за период и т.д.) вынесли в отдельный РС, который заполнялся рег заданием раз в сутки, по-другому никак имхо.     | |||
| 57
    
        DexterMorgan 23.11.17✎ 11:24 | 
        (56) + оперативные (типа остатков) соединяли с этим РС, на 500+ пользователей норм работало     | |||
| 58
    
        DexterMorgan 23.11.17✎ 11:27 | 
        А по сабжу, чем СхемаЗапроса не подходит?     | |||
| 59
    
        Fish гуру 23.11.17✎ 11:28 | 
        (0) А что, разве твой мегапрайс не умеет этого делать? :)     | |||
| 60
    
        d4rkmesa 23.11.17✎ 11:52 | 
        (0) (1) Заюзай схему запроса. Разрывы текста и нечитаемый запрос для конструктора - обычно, плохой стиль, ну да мне ли Маниака учить. Лучше схему запроса изначально запилить, раз уж хочешь отдельно кучу маленьких запросов править. Также, если есть текст запроса, с помощью схемы можно добавить отбор и все-все-все, муторно немного, правда.     | |||
| 61
    
        d4rkmesa 23.11.17✎ 11:58 | 
        Примитивный пример добавления отбора в один из запросов из пакета(с объединением из нескольких таблиц документов):
 Процедура ДобавитьОтборВТекстЗапросаПоДокументам(ТекстЗапроса, ПолеОтбора, ИмяПараметраЗапроса = "") СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса); Для Каждого СтрОператоры Из СхемаЗапроса.ПакетЗапросов[0].Операторы Цикл Для Каждого СтрИсточники Из СтрОператоры.Источники Цикл Если Найти(СтрИсточники.Источник.ИмяТаблицы, ""Документ."") > 0 Тогда СтрОператоры.Отбор.Добавить(СтрИсточники.Источник.Псевдоним + ""."" + ПолеОтбора + "" = &"" + ИмяПараметраЗапроса); КонецЕсли; КонецЦикла; КонецЦикла; ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса(); КонецПроцедуры | |||
| 62
    
        Efir12 23.11.17✎ 12:01 | 
        (0) через объединение цеплял и привел к виду:
 -значение; -наименование колонки; -ид поля для сортировки; -имя таблицы данных; -группировки. Выводил в скд кросс таблицу - в строках группировки в колонках поле "Наименование колонки", "значение" в ресурсы. Благодаря этому изврату получился отчет на 60 колонок малой кровью) ибо даже в скд перспектива тыкать столько полей мне не улыбалась. | |||
| 63
    
        Maniac 23.11.17✎ 12:05 | 
        Вы не учитываете одного, что сейчас отборы на форме это таблица от построителя. Обычные формы.
 Они все автоматически помещаются в таблицу исходя из запроса - просто вытаскиваем на форму таблицу обьекта построитель. и получаем все отборы что в нем были установлены. Короче я понял что все усложнится еще больше чем просто простынь одного запроса в котором. все. Хотя бы так читать его можно, а не лазить по куче процедур и разрывов. | |||
| 64
    
        Maniac 23.11.17✎ 12:06 | 
        ладно фиг с ним пусть остается как есть. я не готов еще месяц потратить на то чтобы переписывать написанное.
 Трудозатраты не очевидны. | |||
| 65
    
        Admin_Net_1C 23.11.17✎ 12:11 | 
        (0) аналогичная ситуация: нужно в запрос, который формируется программно, передать отборы построителя из формы настроек. Всю голову сломал, пока не придумал варианта...(     | |||
| 66
    
        Ёпрст гуру 23.11.17✎ 12:16 | 
        (65) 
 ПостроительОтчета1= Новый ПостроительОтчета(ТекстЗапроса); ПостроительОтчета1.УстановитьНастройки(ПостроительОтчета.ПолучитьНастройки()); //Получаем запрос со всеми настройками из построителя ЗапросПостроителя = ПостроительОтчета1.ПолучитьЗапрос(); //Устанавливаем параметры из построителя в текст запроса Для каждого Парам Из ЗапросПостроителя.Параметры Цикл Запрос.УстановитьПараметр(Парам.Ключ,Парам.Значение); Конеццикла; ТекстЗапросаПостроителя = ЗапросПостроителя.Текст; Запрос.Текст = ТекстЗапросаПостроителя; | |||
| 67
    
        Ёпрст гуру 23.11.17✎ 12:18 | 
        +66
 ПостроительОтчета - реквизит с типом ПостроительОтчета, на форме валяется табличноеПоле с источником - ПостроительОтчета.Отбор Запрос = Новый Запрос; При желании, можно лепить временные таблички через "обманки". | |||
| 68
    
        mistеr 23.11.17✎ 14:51 | 
        (63) Переходи на СКД, там все почти так же. Вместо отборов построителя будут отборы СКД на форме.     | |||
| 69
    
        Maniac 23.11.17✎ 15:10 | 
        (68) только в СКД нельзя делать выборку программную. с группировками и прочее     | |||
| 70
    
        Злопчинский 23.11.17✎ 16:18 | 
        Клиент хочет универсальный инструмент, который быстр эффективен и удобен? Три раза хаха. Это очень редкий зверек.     | |||
| 71
    
        Вафель 23.11.17✎ 16:24 | 
        (69) можно. но 1 раз придется попотеть     | |||
| 72
    
        Вафель 23.11.17✎ 16:25 | 
        как вариант по отбору формировать некую табличку договорв/товаров/итд и по ней уже делать остальные запросы     | |||
| 73
    
        Ц_У 23.11.17✎ 16:30 | 
        (0) Пиши в запросе 1=1, 2=2 и т.д. 
 В конце меня СтрЗаменить(Запрос.Текст,"1=1","Контрагент=&Контрагент") И в конструкторе откроется и условия в одном месте будут | |||
| 74
    
        Вафель 23.11.17✎ 16:35 | 
        (73) тогда уж лучше 
 &Контрагент=&Контрагент | |||
| 75
    
        mehfk 23.11.17✎ 17:35 | 
        (41) А что "Ха"?     | |||
| 76
    
        DrShad 23.11.17✎ 17:37 | 
        (69) а я не знал и делал, пойду выпью яду     | |||
| 77
    
        wt 23.11.17✎ 18:15 | 
        А чего не взять пример с 1с. Рассчитать промежуточные итого и хранить их где либо. Как бухитоги например.     | |||
| 78
    
        sdf 23.11.17✎ 18:46 | 
        (34) (27)  +1 за ВТ и МВТ. 
 программисты ЗУП3 дают хороший пример программирования запросов | |||
| 79
    
        Admin_Net_1C 24.11.17✎ 06:28 | 
        (66)(67) спасибо, то что нужно! Ёпрс - реал профи )     | |||
| 80
    
        Адинэснег 24.11.17✎ 08:10 | ||||
| 81
    
        Ёпрст гуру 24.11.17✎ 10:22 | 
        (79) в ПриОткрытии, так можешь еще влепить
 Процедура ПриОткрытии() ПостроительОтчета.Текст="ВЫБРАТЬ | 0 КАК Шняга |{ГДЕ | 0 как Процент, // | (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяССылка)).* КАК Склад, | (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяССылка)).* КАК Номенклатура, // | (ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПустаяССылка)).* КАК Бренд, | (ЗНАЧЕНИЕ(Справочник.Организации.ПустаяССылка)).* КАК Организация, // | (ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяССылка)).* КАК ТипЦен, // | (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент, | (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент, // | (ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяССылка)).* КАК ТорговыйПредставитель | (ЗНАЧЕНИЕ(Документ.реализацияТоваровУслуг.ПустаяССылка)).* КАК Регистратор | }"; ДоступныеПоляОтбора = ПостроительОтчета.Отбор.ПолучитьДоступныеПоля(); Для каждого Поле ИЗ ДоступныеПоляОтбора Цикл Поле.Отбор = Истина; КонецЦикла; Отбор = ПостроительОтчета.Отбор; Если Отбор.Найти("Регистратор") = Неопределено Тогда Отбор.Добавить("Регистратор"); КонецЕсли; Если Отбор.Найти("Номенклатура") = Неопределено Тогда Отбор.Добавить("Номенклатура"); КонецЕсли; КонецПроцедуры Если используешь сохранение/восстановление настроек, то сохраняй как СтруктураСНастройками.Вставить("Построитель",ПостроительОтчета.ПолучитьНастройки()); и восстанавливай потом как ПостроительОтчета.УстановитьНастройки(СтруктураСНастройками.Построитель); если нужны временные таблицы в запросе, например, из ТЗ, то лепи запрос обманку для построителя и заменяй его нормальным текстом для запроса | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |