Есть документ Приход, хочу выбрать его строки из табличной части, так, что бы к каждой строке привязать остаток на момент времени документа. Просто не понимаю как сделать. Если был бы чистый SQL, то тут два пути:
1.
sel ect pr.*, (sel ect kol_ost from Ostatki_na_moment_dokumenta).*
from doc_prihod pr
2.
sel ect pr.*, os.*
from doc_prihod
left join Ostatki_na_moment_dokumenta os on pr.nomenklatura = os.nomenklatura
:)
Как быть в 1С?
Подзапрос из первого варианта не дает сделать, говорит низяяяя писать ВЫБОР.
Левым соединением не получилось передать параметр в виртуальную таблицу Остатки(Приход.Ссылка) ругается на "Приход.Ссылка".
ВЫБРАТЬ
Док.Номенклатура,
ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура В (&Номенклатура)) КАК ТоварыНаСкладахОстатки
ПО Док.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
ГДЕ
Док.Ссылка = &Ссылка
Показать полностью
В качестве параметра в запрос передаешь документ, дату документа и массив номенклатуры из его табличной части.
Неправильно вы меня поняли. Мне не нужно по конкретному документу (я быстро нашел и понял как это сделать), мне нужно получить массив документов, если есть возможность одним запросом и такую таблицу на выходе:
где поле ОстатокПоДокументуКоличество - это остаток на МоментВремени документа в данной строке, по номенклатуре в данной строке, без учета других разрезов регистра накопления.
(2) На мой взгляд , это неверный подход к построению запросов.
В приведенном запросе вначале будет сделано левое соединение таблицы
документов с таблицей регистров (что очень и очень затратно) и полученная ,
возможно огромная, промежуточная таблица будет отфильрована по условию Док.Ссылка = &Ссылка.
Вначале нужно получить временную таблицу , содержащую табличную часть
указанного документа и лишь затем левым соединением с таблицей регистра получить итоговый результат.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПоступлениеТоваровУслугТовары.Ссылка,
ПоступлениеТоваровУслугТовары.Ссылка.Дата,
ПоступлениеТоваровУслугТовары.Ссылка.Номер,
ПоступлениеТоваровУслугТовары.Номенклатура,
ПоступлениеТоваровУслугТовары.Количество,
ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
ПоступлениеТоваровУслугТовары.Цена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ПО ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
(11) Я , конечно , извинясь.
Но запрос неверный..
Нужно сделать две временных таблицы .
Первая должна быть получена из Документ.ПоступлениеТоваровИУслуг за период &ДатаНач,&ДатаКон
Вторая должна быть получена из РегистраНакопления за тот же период с полями Период,Регистратор,Номенклатура.
И лишь за тем эти две таблицы должны быть соединены левым соединением по условию
ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
1. У Вас не задан период.
2. Левое соединение не с вирт. таблицей регистра , с временной таблицей которая получена из вирт.таблицы с явным указанием нужных полей Период,Регистратор, Номенклатура,НачОстаток.
(26) Введи новую номенклатуру. Оприходуй ее все и продай в прошлом месяце. Сделай отчет "ведомость по складам" за текущий месяц и посмотри, будет ли твоя новая номенклатура в отчете...
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПоступлениеТоваровУслугТовары.Ссылка,
ПоступлениеТоваровУслугТовары.Ссылка.Дата,
ПоступлениеТоваровУслугТовары.Ссылка.Номер,
ПоступлениеТоваровУслугТовары.Номенклатура,
ПоступлениеТоваровУслугТовары.Количество,
ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
ПоступлениеТоваровУслугТовары.Цена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ПО ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
Показать
еще раз посмотри: в запрос попадут все записи из таблицы Документ.ПоступлениеТоваровУслуг.Товары и соединятся с ОстаткамиИОбротами, вот эта строчка:
ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток - если есть записи, вернет остаток, а если нет вернет 0
ну если вы не знаете азов, может надо начать с простейшего?
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
если не знаете где руками вставить, то пользуйтесь Конструктором запросов, я им тоже пользуюсь.
для реальных таблиц на вкладке "Условия", для виртуальных - в параметрах таблицы.
По-моему это легкий запрос, вот лучше посмотрите конфигурацию "Зарплата и управление персоналом", модуль "Проведение расчетов", функция "ПолучитьДанныеДляРасчета", вот там есть где подумать...
ну если не сможете вставить условие, то напишите, обязательно помогу
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПоступлениеТоваровУслугТовары.Ссылка,
ПоступлениеТоваровУслугТовары.Ссылка.Дата,
ПоступлениеТоваровУслугТовары.Ссылка.Номер,
ПоступлениеТоваровУслугТовары.Номенклатура,
ПоступлениеТоваровУслугТовары.Количество,
ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
ПоступлениеТоваровУслугТовары.Цена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ПО ПоступлениеТоваровУслугТовары.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
И ПоступлениеТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
Огромное спасибо! Не знал и не догадался, что в таблице ОстаткиИОбороты считают все промежуточные агрегатные значения для всех видов регистрации. Супер!
Из такой таблицы в легкую, по идее, OLAP кубик нарисовать можно!
Всем спасибо! Выручили.
PS. Может посоветуете что почитать человеку хорошо знающему 7.7 и работавшему с большими системами (Oracle, Microsoft Dynamics AX) по программированию в 8.1 ?
(35) Как будет работать Ваш запрос ?
Давайте разберем последовательность получения результирующей таблицы Вашего запроса с условием "ГДЕ".
Вначале будет выполнено левое соединение (внимание !) ВСЕЙ (без ограничения периода) таблицы
"Документ. ПоступлениеТоваровУслуг.Товары" с виртуальной таблицей регистра.
Затем из полученного соединения будет выбрана таблица с указанными Вами полями "Ссылка,Ссылка.Дата,..."
И лишь потом последняя таблица будет отфильтрована по дате (Ваше условие "Где").
Согласитесь , что такой алгоритм не оптимален.
Лучше вначале с отбором по дате из таблицы "Документ. ПоступлениеТоваровУслуг.Товары" получить временную таблицу.
И вот её то и соединять с вирт.таблицей регистра левым соединением.
Учитывая, что ВСЯ таблица "Документ. ПоступлениеТоваровУслуг.Товары" может быть очень большой ,Ваш запрос
может работать очень медленно.
Поэтому помещение в Вашем запросе условия "ГДЕ " в конец запроса - считается грубой ошибкой.
я читал диски ИТС, Радченко(ксати скачал прямо с сайта 1С http://online.1c.ru/books/allbooks/enterprise/ стоит 25 р.), Профессиональная разработка в системе 1С:Предприятие - это большая дорогая книга, правда видел где в инете
(37) ну да согласен, но временные таблицы не обязательно использовать, можно вложенный запрос,
а насчет грубой ошибки, у вас она еще грубее, потому-что у вас вообще нет решения
оптимизированный вариант:
ВЫБРАТЬ
ВложенныйЗапрос.Ссылка,
ВложенныйЗапрос.Дата,
ВложенныйЗапрос.Номер,
ВложенныйЗапрос.Номенклатура,
ВложенныйЗапрос.Количество,
ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК Остаток,
ВложенныйЗапрос.Цена
ИЗ
(ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,
ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК Номер,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ПоступлениеТоваровУслугТовары.Количество КАК Количество,
ПоступлениеТоваровУслугТовары.Цена КАК Цена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ПО ВложенныйЗапрос.Ссылка = ТоварыНаСкладахОстаткиИОбороты.Регистратор
И ВложенныйЗапрос.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
(40) Да , ладно чего там.. Груб..еще грубее.
А вот как Вы считаете , не следует ли и к регистру обращаться не напрямую , а вначале сделать вложенный запрос и выбрать только нужные поля ?
Ish_2 а в 1С-ке что-то типа Плана запроса посмотреть можно? Я к чему, нормальный SQL сервер (MS SQL, Oracle) сам сначала сделает hash-фильтр по таблице документа и только потом будет присоединять. Это проверено. Можно ли в этом убедиться в 1С? Какие инструменты анализа запросов там присуствуют?
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|
| 0 КАК ТипПериода,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
| ВЫБОР КОГДА СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток) = 0 ТОГДА 0
| ИНАЧЕ СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток)*
| СУММА(КонтрагентыВзаиморасчетыУпр.СуммаУпрКонечныйОстаток)/
| СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток)
| КОНЕЦ КАК Долг,
| СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК ДолгВзаиморасчеты,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период КАК Период,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДок,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом КАК Док
|
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачПериода, &КонПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыПереданные.Обороты КАК ОстаткиТоваровКомпанииОтданныеОбороты
| ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = ОстаткиТоваровКомпанииОтданныеОбороты.ДоговорКонтрагента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачПериода, &КонПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыУпр
| ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = КонтрагентыВзаиморасчетыУпр.ДоговорКонтрагента
| И КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период = КонтрагентыВзаиморасчетыУпр.Период
|
|ГДЕ
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА И
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|
|СГРУППИРОВАТЬ ПО
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период";
Если ФлагПредПериод Тогда
Запрос.УстановитьПараметр("НачПредПериода", Новый Граница(НачалоПредПериода, ВидГраницы.Включая));
Запрос.УстановитьПараметр("КонПредПериода", Новый Граница(КонецПредПериода, ВидГраницы.Включая));
Запрос.Текст = Запрос.Текст + "
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
| 1 КАК ТипПериода,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
| ВЫБОР КОГДА СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток) = 0 ТОГДА 0
| ИНАЧЕ СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток)*
| СУММА(КонтрагентыВзаиморасчетыУпр.СуммаУпрКонечныйОстаток)/
| СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток)
| КОНЕЦ КАК Долг,
| СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК ДолгВзаиморасчеты,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период КАК Период,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДок,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом КАК Док
|
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачПредПериода, &КонПредПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыПереданные.Обороты КАК ОстаткиТоваровКомпанииОтданныеОбороты
| ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = ОстаткиТоваровКомпанииОтданныеОбороты.ДоговорКонтрагента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачПредПериода, &КонПредПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыУпр
| ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = КонтрагентыВзаиморасчетыУпр.ДоговорКонтрагента
| И КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период = КонтрагентыВзаиморасчетыУпр.Период
|
|ГДЕ
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА И
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|
|СГРУППИРОВАТЬ ПО
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период";
КонецЕсли;
Если ФлагАналогПериод Тогда
Запрос.УстановитьПараметр("НачАналогПериода", Новый Граница(НачалоАналогПериода, ВидГраницы.Включая));
Запрос.УстановитьПараметр("КонАналогПериода", Новый Граница(КонецАналогПериода, ВидГраницы.Включая));
Запрос.Текст = Запрос.Текст + "
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
| 2 КАК ТипПериода,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
| ВЫБОР КОГДА СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток) = 0 ТОГДА 0
| ИНАЧЕ СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток)*
| СУММА(КонтрагентыВзаиморасчетыУпр.СуммаУпрКонечныйОстаток)/
| СУММА(КонтрагентыВзаиморасчетыУпр.СуммаВзаиморасчетовКонечныйОстаток)
| КОНЕЦ КАК Долг,
| СУММА(КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток) КАК ДолгВзаиморасчеты,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период КАК Период,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом.Дата КАК ДатаДок,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом КАК Док
|
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачАналогПериода, &КонАналогПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыПереданные.Обороты КАК ОстаткиТоваровКомпанииОтданныеОбороты
| ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = ОстаткиТоваровКомпанииОтданныеОбороты.ДоговорКонтрагента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачАналогПериода, &КонАналогПериода, " + Периодичность + ", , ) КАК КонтрагентыВзаиморасчетыУпр
| ПО КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента = КонтрагентыВзаиморасчетыУпр.ДоговорКонтрагента
| И КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период = КонтрагентыВзаиморасчетыУпр.Период
|
|ГДЕ
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА И
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|
|СГРУППИРОВАТЬ ПО
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДокументРасчетовСКонтрагентом,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента,
| КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.Период";
КонецЕсли;
(46) документация по нему можно найти в c:\Program Files\1cv81\AddDoc\RU\V8AddDoc81.htm и на ИТС, на диске ИТС есть обработка НастройкаТехнологическогоЖурнала.epf
ГДЕ КонтрагентыВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности = ИСТИНА - как то странно они пишут, сам удивлен, по моему опыту семерошники так пишут по привычке
(45) Я всего лишь задал вопрос в (43) .
И, кстати говоря, одназначно в данном конкретном случае ответить не могу.
Склоняюсь , что все-таки что лучше делать вложеный запрос.
(44) Инструменты анализа запроса в 1с Предприятие 8 мне неизвестны. Другим думаю тоже.
От 1сПредприятия 8 на вход SQL-сервера поступают SQL-запросы. Как он их интерпретирует -
одному Богу известно.
И насколько мне известно , MS не документирует описание внутреннего оптимизатора запросов в
SQl-сервере. И , строго говоря , мы не знаем как он их будет исполнять.
Думаю , следует избегать написания "километровых" запросов.
Я так и поступаю. И разбиваю большой запрос на мелкие (т.е. создаю временные таблицы и затем их соединяю).
По крайней мере на небольших и ясных запросах неожиданностей от SQL-сервера меньше.
ксати посмотрел модули наборов записей регистров накопления, там куча соединений и ГДЕ стоит в конце, так что спорный вопрос, где нужно ставить условие, поэтому считаю если самим 1С можно так писать, то нам тем более, можно поинтересоваться у Гилева, вроде как он спец по крупным внедрениям, я то не в москве живу, чтоб 500 пользователей у нас работало, таких случаев не знаю
(50) А почему бы не проверить ? Я даже никогда не задумывался над проверкой
- считал это совершенно очевидным.
Таблица Документа должна быть большой. Период очень маленьким (1 день).
И сравнить два варианта соединения с условием "ГДЕ " в конце и вариант с вложенным запросом.
+52 Потому что описывая порядок исполнения запроса с условием "ГДЕ " на конце я исходил из тупого варианта
(отуствия оптимизатора запроса) , но такой запрос , будучи подан в SQL-сервер вполне
может быть оптимизирован и по быстродействию не уступит варианту с вложенным запросом.
Если же используется файловый режим (внутренний 1с-формат) , то работает ли там оптимизатор запроса и как ?
я не знаю.
Давно обжегшись на быстродействии запросов , я просто взял за правило не надеяться
ни на какие оптимизаторы и писать запросы так , чтобы их не нужно было оптимизировать.
Вот так обстоит дело.