1с скд поле не входит в группу
Чудеса с СКД или «Поле не входит в группу».
Написал отчет. Отладил в консоле отчетов. Все работает.
Переношу в СКД. Ошибка: https://s.mail.ru/FMPS/x6nRPFZXW
Даже не знаю в какую сторону копать.
Заранее спасибо.
Пытался делать отчет в базе копии. Тоже самое.
Ошибка на строки:
ВЫБРАТЬ
ПЕРВЫЕ 10000
КОЛИЧЕСТВО(*) КАК Номер,
ВТ4.Соглашение,
ВТ4.Путевой,
ВТ4.КодировкаДоставки
ПОМЕСТИТЬ ВТ55
ИЗ
ВТ4 КАК ВТ4,
ВТ4 КАК ВТ41
ГДЕ
ВТ4.КодировкаДоставки >= ВТ41.КодировкаДоставки
СГРУППИРОВАТЬ ПО
ВТ4.Соглашение,
ВТ4.Путевой,
ВТ4.КодировкаДоставки
УПОРЯДОЧИТЬ ПО
ВТ4.КодировкаДоставки
ВЫБРАТЬ
АВЭКС_ЗаданияТрейдПойнт.Идентификатор,
АВЭКС_ЗаданияТрейдПойнт.Соглашение,
АВЭКС_АвтомобилиТрейдПойнт.ТранспортноеСредство,
АВЭКС_АвтомобилиТрейдПойнт.НомерТелефона,
АВЭКС_ЗаданияТрейдПойнт.Регистратор,
АВЭКС_ЗаданияТрейдПойнт.Период,
АВЭКС_ЗаданияТрейдПойнт.Статус
ПОМЕСТИТЬ ВТ1
ИЗ
РегистрНакопления.АВЭКС_ЗаданияТрейдПойнт КАК АВЭКС_ЗаданияТрейдПойнт
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АВЭКС_АвтомобилиТрейдПойнт КАК АВЭКС_АвтомобилиТрейдПойнт
ПО АВЭКС_ЗаданияТрейдПойнт.Идентификатор = АВЭКС_АвтомобилиТрейдПойнт.ИдентификаторТрейдПойнт
ГДЕ
АВЭКС_АвтомобилиТрейдПойнт.Работает
И АВЭКС_АвтомобилиТрейдПойнт.ТранспортноеСредство = &ТранспортноеСредство
И АВЭКС_ЗаданияТрейдПойнт.Период МЕЖДУ &ДатаНачала И КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
И АВЭКС_ЗаданияТрейдПойнт.Активность
И АВЭКС_ЗаданияТрейдПойнт.ТипЗадания = ЗНАЧЕНИЕ(Перечисление.Авэкс_ТипыЗаданийТрейдПойнт.d)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МАКСИМУМ(ВТ1.Регистратор.ДатаВремяРейсаФактС) КАК ВремяСтарта,
МАКСИМУМ(ВТ1.Регистратор.ДатаВремяРейсаПланПо) КАК ВремяПрибытия,
ВТ1.Регистратор
ПОМЕСТИТЬ ДатаСтартаПрибытия
ИЗ
ВТ1 КАК ВТ1
ГДЕ
ВТ1.Статус = 0
СГРУППИРОВАТЬ ПО
ВТ1.Регистратор
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ2.Идентификатор,
ВТ2.Соглашение,
ВТ2.ТранспортноеСредство,
К.КОЛИЧЕСТВО
ПОМЕСТИТЬ ВТ22
ИЗ
ВТ2 КАК ВТ2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ К КАК К
ПО (ИСТИНА)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ22.Идентификатор,
ВТ22.Соглашение,
ВТ22.КОЛИЧЕСТВО,
ВТ22.ТранспортноеСредство,
ВТ1.Регистратор.Дата,
ВТ1.Регистратор,
ВТ1ПУТЕВОЙ.Регистратор КАК Путевой,
ВЫБОР
КОГДА ВТ1.Регистратор ССЫЛКА Документ.АВЭКС_ВыполнениеЗаданийТрейдПойнт
ТОГДА ВТ1.Регистратор.ДокОснование.ДатаВремяРейсаФактС
ИНАЧЕ NULL
КОНЕЦ КАК ВремяСтарта,
ВЫБОР
КОГДА ВТ1.Регистратор ССЫЛКА Документ.АВЭКС_ВыполнениеЗаданийТрейдПойнт
ТОГДА ВТ1.Регистратор.ДокОснование.ДатаВремяРейсаПланПо
ИНАЧЕ NULL
КОНЕЦ КАК ВремяПрибытия,
Партнеры.КодировкаДоставки КАК КодировкаДоставки
ПОМЕСТИТЬ ВТ3
ИЗ
ВТ22 КАК ВТ22
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ1
ПО (ВТ1.Идентификатор = ВТ22.Идентификатор)
И (ВТ1.Соглашение = ВТ22.Соглашение)
И (ВТ1.ТранспортноеСредство = ВТ22.ТранспортноеСредство)
И (ВТ1.Статус = 1)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
ПО ВТ22.Соглашение.Партнер = Партнеры.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ1ПУТЕВОЙ
ПО (ВТ1ПУТЕВОЙ.Идентификатор = ВТ22.Идентификатор)
И (ВТ1ПУТЕВОЙ.Соглашение = ВТ22.Соглашение)
И (ВТ1ПУТЕВОЙ.ТранспортноеСредство = ВТ22.ТранспортноеСредство)
И (ВТ1ПУТЕВОЙ.Статус = 0)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПЕРВЫЕ 10000
КОЛИЧЕСТВО(*) КАК Номер,
ВТ4.Соглашение,
ВТ4.Путевой,
ВТ4.КодировкаДоставки
ПОМЕСТИТЬ ВТ55
ИЗ
ВТ4 КАК ВТ4,
ВТ4 КАК ВТ41
ГДЕ
ВТ4.КодировкаДоставки >= ВТ41.КодировкаДоставки
СГРУППИРОВАТЬ ПО
ВТ4.Соглашение,
ВТ4.Путевой,
ВТ4.КодировкаДоставки
УПОРЯДОЧИТЬ ПО
ВТ4.КодировкаДоставки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ55.Номер,
ВТ55.Соглашение,
ВТ55.Путевой,
ДатаСтартаПрибытия.ВремяСтарта,
ДатаСтартаПрибытия.ВремяПрибытия
ПОМЕСТИТЬ ВТ5
ИЗ
ВТ55 КАК ВТ55
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатаСтартаПрибытия КАК ДатаСтартаПрибытия
ПО ВТ55.Путевой = ДатаСтартаПрибытия.Регистратор
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ3.Идентификатор,
ВТ3.Соглашение,
ВТ3.КОЛИЧЕСТВО,
ВТ3.ТранспортноеСредство,
ВТ3.Регистратор,
ВТ5.Путевой,
ВТ3.КодировкаДоставки,
ВТ5.Номер,
ВТ5.ВремяСтарта,
ВТ5.ВремяПрибытия,
ВЫБОР
КОГДА ВТ3.КОЛИЧЕСТВО <> 0
ТОГДА ДОБАВИТЬКДАТЕ(ВТ5.ВремяСтарта, СЕКУНДА, ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ВТ5.ВремяСтарта, ВТ5.ВремяПрибытия, СЕКУНДА) / ВТ3.КОЛИЧЕСТВО * ВТ5.Номер КАК ЧИСЛО(15, 0)))
ИНАЧЕ 0
КОНЕЦ КАК Шаг
ПОМЕСТИТЬ ВТ6
ИЗ
ВТ5 КАК ВТ5
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ3 КАК ВТ3
ПО ВТ5.Соглашение = ВТ3.Соглашение
И ВТ5.Путевой = ВТ3.Путевой
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
// ВТ6.Идентификатор,
ВТ6.Соглашение,
// ВТ6.КОЛИЧЕСТВО,
ВТ6.ТранспортноеСредство,
ВТ6.Регистратор,
ВТ6.Путевой,
ВТ6.КодировкаДоставки,
ВТ6.Номер,
ВТ6.ВремяСтарта,
ВТ6.ВремяПрибытия,
ВТ6.Шаг,
ВЫБОР
КОГДА ВТ6.Шаг Cyberhawk
Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 3
Добавление отбора ко всем таблицам пакета
В предыдущем разделе, посвященном расширению языка запросов 1С для СКД, мы разбирали пример, в котором нам нужно было получить список расходных накладных и связанных по номенклатуре приходных накладных.
Я обещал разобрать, почему при отборе по контрагенту наш отчет работает неправильно. Посмотрим на примере другого отчета, в котором нам нужно выбрать данные из расходных накладных и связанные с номенклатурой данные по ВСЕМ заявкам.
Вот такой исходный запрос будет в нашем отчете:
Если в отчете не установлен отбор по заказу покупателя, то выполняемый запрос получается верный:
Если же нам нужно установить отбор по заказу расходной накладной (для этого в последнем запросе пакета мы с помощью расширения языка запросов указали, что пользователь может устанавливать отбор по заказу накладной), то запрос получается неверный:
Здесь мы видим, что в результате замены текста запроса система компоновки данных добавила в параметры виртуальной таблицы отбор по заказу покупателя. Что не соответствует логике работы нашего отчета. Мы уже рассматривали один из способов как можно исправить данную ошибку – отключаем опцию «Автозаполнение», настраиваем с помощью расширения языка запросов поля для условий и место применения этих условий, настраиваем также список выбираемых полей (так как автозаполнение мы отключили).
Можно решить эту проблему проще. Для этого мы установим алиас для поля «ЗаказПокупателя» в секции «ГДЕ», а также установим ограничение использования в условии для поля «ЗаказПокупателя»:
Как видно на картинке, при установке алиаса, в поля набора добавляется новое поле с именем равным алиасу. Это поле может использоваться только в условии. Если не установить ограничения на использование в условии для поля «ЗаказПокупателя», то пользователь сможет установить отбор по этому полю, и отчет снова будет формироваться неверно.
В таком подходе есть один минус – если выключить автозаполнение и снова его включить, установленные вами ограничения не сохранятся. Поэтому, какой вариант решения использовать – выбирать вам.
Добавление отбора в объединение
Кроме добавления отбора во все запросы пакета СКД добавляет отбор также в части запроса выполненного с помощью оператора «ОБЪЕДИНИТЬ». Рассмотрим такой исходный запрос:
Если установить отбор по номенклатуре, то получим такой запрос:
Если установить отбор по полю расход, то получим вот такой запрос:
Такая замена производится при включенном автозаполнении.
При включенном автозаполнении и при использовании отбора по реквизиту одного из полей производится такая замена:
Здесь видно, чтоб отбор был добавлен только в ту часть запроса, в которой склад не NULL. Замена работает согласно документации 1С:
При отключенном автозаполнении в таком исходном запросе и при установленных отборах:
Получим такой выполняемый запрос:
Такое поведение платформы работает, начиная с релиза 1С 8.3.14. До этого релиза даже при отключенной опции «Автозаполнение», отбор по полю со значением NULL (склад в нашем случае) добавлялся и в первую часть объединения (что не всегда бывает необходимо и при отключенной опции ожидалось, что отбор будет срабатывать как указано).
При использовании связанных наборов имеется также особенность работы СКД при установке отбора. В документации 1С написано:
«При использовании в схеме нескольких наборов данных, если в главном отборе накладывается условие на поле некоторого дочернего набора данных, то в сгенерированном макете компоновки данных дочерний набор данных будет связан с родительским набором данных с типом связи «Внутренняя»».
Здесь важно понимать, что:
Посмотрим на примере такого отчета:
Набор главный (Заказы):
Дочерний наборы данных (Остатки):
В анализе данной ситуации нам может помочь только консоль компоновки данных от 1С (о консолях в следующем разделе). Проанализируем в консоли выполняемые запросы и связь наборов без установленного отбора:
Здесь мы получаем все позиции из заказов. Сами запросы нам не интересны там ничего необычного. Интересно как установлена связь наборов:
Теперь установим отбор по полю «КоличествоОстаток» набора «Остатки»:
Если не знать особенность работы СКД, мы будем ожидать, что из главного набора будут выбираться все записи, затем к дочернему набору применится отбор, и наборы будут связаны между собой левым соединением. В итоге в отчет должны попасть все строки из заказов, в колонке остаток остаться только числа больше 30. Но мы получаем другой результат:
В отчет попали только заказы, по которым есть соответствующий остаток. Посмотрим снова в консоли связь наборов:
Здесь мы видим, что связь наборов, которую выполняет сама СКД, стала внутренней. Причем как я уже писал выше такое поведение получается только при установке отбора по полям дочернего набора, которых нет в главном наборе. Если установить отбор по полю «Номенклатура» соединение наборов останется левым.
Глобальный отбор и отбор на группировках
До сих пор мы рассматривали так называемый глобальный отбор – отбор, который устанавливается на уровне всего отчета. Такой отбор обычно СКД переносит в текст запроса. Исключением может быть, например, отбор по вычисляемому полю. Кроме глобального отбора в системе компоновки данных имеется возможность накладывать отборы на уровне группировки. Такие отборы в 1С СКД обрабатывает самостоятельно и соответственно не переносит в текст запроса.
В платформе 1С до релиза 8.3.14 в запросе, который мы уже рассматривали, но с другой структурой отбора данный отбор не переносится в текст запроса для платформы (и соответственно выполняется СКД после получения результата запроса):
Важное отличие здесь в том, что отборы включены в группу.
Видно, что в итоговом запросе условия не включены:
При этом если условия находятся вне группы, то они включаются в текст запроса:
В релизе 1С 8.3.14 условия включаются в текст запроса платформы независимо от того расположены они в группе или нет.
Доброго времени суток.
Вступление
1. Подготовка и демонстрация
ВЫБРАТЬ
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура КАК Продукция,
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Комплектующая,
СРЕДНЕЕ(СпецификацииНоменклатурыИсходныеКомплектующие.Количество / ВЫБОР
КОГДА СпецификацииНоменклатурыВыходныеИзделия.Количество <> 0
ТОГДА СпецификацииНоменклатурыВыходныеИзделия.Количество
ИНАЧЕ 1
КОНЕЦ) КАК КоличествоНа1
ИЗ
Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецификацииНоменклатурыВыходныеИзделия
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
ПО СпецификацииНоменклатурыВыходныеИзделия.Ссылка = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
ГДЕ
СпецификацииНоменклатурыВыходныеИзделия.Ссылка.Активная
И СпецификацииНоменклатурыВыходныеИзделия.Номенклатура В ИЕРАРХИИ(&Номенклатура)
СГРУППИРОВАТЬ ПО
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура,
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
ТоварыНаСкладахОстатки.Номенклатура КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Комплектующая>) КАК ТоварыНаСкладахОстатки
Ресурсы пока простые: Сумма(КоличествоНа1) и Сумма(ОстатокКомлектующей).
Дальше была идея Склады в колонки, но тогда получается очень широко и почти не заполнено. Ну если одна комплектующая только на одном складе, то по всем остальным пусто. В общем не очень красиво выходит.
Проблема:
Тогда я еще не знал про «замену Левого на Внутреннее, если есть отбор».
2. Попытка выкрутиться
Но вот беда: в отборе по группировке, среди доступных полей, нет поля «СкладОтбора»:
Хорошо, попробую использовать СкладКомплектующей. Добавил отборы в каждую группировку, но выключенные и стал включать по очереди. Первым включаю у группировки Комплектующая. Результат такой же, как с отбором по отчету целиком. Отключаю.
3. Хотелки и их исполнение.
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладПродукции,
ТоварыНаСкладахОстатки.Номенклатура КАК Продукция,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокПродукции
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Продукция>) КАК ТоварыНаСкладахОстатки
Ну и добавляем еще одну связь.
Ну и в ресурсах определяем ОстатокПродукции.
Тут на помощь пришла вторая статья Агрегатные функции СКД, о которых мало кто знает. Сначала использовал функцию ТаблицаЗначений. Но при простом повторении формирования отчета строки складов прыгают. Тогда добавил Упорядочить в итоге получилось так:
Для ОстаткаКомплектующих: Упорядочить(ТаблицаЗначений(Различные СкладКомплектующей Как Склад, ОстатокКомплектующей Как Остаток), «Склад Автоупорядочивание»)
Для ОстаткаПродукции: Упорядочить(ТаблицаЗначений(Различные СкладПродукции Как Склад, ОстатокПродукции Как Остаток), «Склад Автоупорядочивание»)
Дальше немного «причесал» структуру: выключил детальные записи, сгруппировал поля, отключил «Общие Итоги по вертикали».
Теперь влючаю отбор по складу и вижу результат, опять исчезли строки (что в прочем уже ожидаемо):
4. Поиск решения
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
СпрНоменклатура.Ссылка КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, ) КАК ТоварыНаСкладахОстатки
ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
<ГДЕ
ТоварыНаСкладахОстатки.Склад.* КАК СкладОтбора>
Дальше экспериментировал с настройками. Работало долго. На каком-то этапе вообще получил от сервера отлуп по памяти. Бросил.
День бодался. На следующий день пошел по второму кугу. Только все создавал с нуля.
5. Решение
И начал снова с Левого соединения в запросе. Получился такой запрос (правильный):
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
СпрНоменклатура.Ссылка КАК Комплектующая,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(<(&КонецПериода)>, <(Склад).* КАК СкладОтбора, (Номенклатура).* КАК Комплектующая>) КАК ТоварыНаСкладахОстатки
ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
Сформировал, посмотрел нормальный результат. Включил отбор и увидел это:
Но самым удивительным для меня оказался такой результат (отбор по другому складу и еще одна продукция):
В общем дальше можно пытаться улучшить. Например, если основной запрос не сложный, то в НабореДанных2 связывать не со справочником номенклатуры, а поместить результат основного запроса во временную таблицу и связать с ним.
Конец
Прошу специалистов не смеяться над стилем изложения, я курсов не проходил. Общаюсь в большинстве своем с пользователями, которым надо объяснить понятно что, почему и как. Да и статья это первая, не потому что писать нечего, а потому, что большая часть уже написана Вами и надо только найти :).
В СКД отображаются не все поля
Суть проблемы: есть отчет на скд, под полными правами он работает так как мне надо. Если запускаю его не под полными правами, то пропадают некоторые поля. Права на чтение/просмотр у пользователя с неполными правами есть на регистры и на документы используемые в запросе.
пробовал запускать под пользователем с неполными правами запрос из отчета в консоли запросов, всё работает правильно. Но в скд почему то поля просто теряются. их нет в выбранных полях.
пробовал выгружать настройку скд под полными и загружать не под полными правами. поля не появляются.
куда копать? помогите)
выше текст запроса.
нету вот этих полей :
то есть это реквизит документов «сумма документа»
Действительно если у пользователя есть право «Чтение», но нет права «Просмотр» регистра сведений, поле из него не попадает в список доступных полей.
Удивительно, но факт.
Результат НУЛЕВОЙ!
Поля видны только тем пользователям, у которых есть роль «Полные права».
Конфигурация: Управление торговлей, редакция 11.1 (11.1.9.61)
Платформа: 1С:Предприятие 8.3 (8.3.5.1517)
Нужно смотреть не только права на регистратор, но и на все объекты
отчета, где этот объект как таковой может использоваться в качестве
реквизита.
В моем случае использовалось измерение «АналитикаУчетаПопартнерам» в измерении
регистра «РасчетыСПоставщиками». Вот из-за того, что на сам справочник права
были только для роли «ПолныкеПрава» отбор по его реквизитам «Организация», «Партнер»
и «Контрагент» был невозможен. Не смотря на то, что на сами эти объекты у пользователей
разрешения были.
(19) valerasv,
Еще один вариант решения проблемы:
Делается соединения с таблицами объектов.
А уже эти таблицы используются дальше.
Пример.
Текст запроса для КД:
ВЫБРАТЬ
КлючиАналитикиУчетаПоПартнерам.Организация КАК Организация_КлючАналитики
ИЗ
Справочник.КлючиАналитикиУчетаПоПартнерам КАК КлючиАналитикиУчетаПоПартнерам
Для пользователя, у которого не полные права, из-за того, что на справочник КлючиАналитикиУчетаПоПартнерам
установлено разрешение только на чтение, мы ни где не увидим поле «Организация».
Изменив же запрос, можно получить желаемое.
Как пример:
ВЫБРАТЬ
Организации.Ссылка КАК Организация_КлючАналитики
ИЗ
Справочник.КлючиАналитикиУчетаПоПартнерам КАК КлючиАналитикиУчетаПоПартнерам
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
ПО КлючиАналитикиУчетаПоПартнерам.Организация = Организации.Ссылка
Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 2
Рассмотрим такой пакетный запрос, в котором по каждому виду цен нам нужно вывести количество позиций номенклатуры, для которых этот вид цен задан:
При выполнении отчета с группировкой по виду цен получаем запрос (первая часть пакета):
Поле «Номенклатура» исключено из запроса. Естественно в отчете получаем неверные данные. Чтобы исправить ситуацию, изменяем роль для поля «Номенклатура». Для этого предварительно необходимо поле включить в окончательный запрос, чтобы редактирование роли было доступно:
В итоге получаем правильный результирующий запрос:
Подобная ситуация может получиться в отчетах, получающих развернутое сальдо и в других запросах, в которых важен набор полей в предложении «СГРУППИРОВАТЬ ПО».
С помощью расширения языка запросов 1С для СКД можно управлять местом применения отборов. Также нужно знать, что в случае отсутствия элементов расширения языка запросов, система компоновки данных по умолчанию размещает отбор:
Рассматривать будем на таком исходном запросе.
В параметрах виртуальных таблиц при отборе по измерениям:
В секции «ГДЕ» при использовании отборов по ресурсам:
В секции «ИМЕЮЩИЕ» при отборе по полю запроса, вычисляемого с помощью агрегатной функции (в исходный запрос добавлена группировка по номенклатуре и контрагенту):
В документации на диске ИТС написано, что в случае левого соединения двух таблиц, отбор, накладываемый по измерению, отсутствующему в первой (левой) таблице применяется в секции «ГДЕ». Однако в релизе платформе 8.3.15 такое поведение не подтверждается:
При наличии опции «Автозаполнение» система компоновки данных всегда пытается добавить отбор в параметр виртуальной таблицы, если с помощью расширения языка запросов этот отбор не установлен:
Если отключить опцию автозаполнения, то отбор будет установлен только там, где было указано:
Если в запросе пакета используются временные таблицы и данные из этих таблицы не используются в конечном запросе, то такие временные таблицы из пакета исключаются. Причем независимо от опции «Автозаполнение». Эту особенность СКД можно использовать для оптимизации текста запроса, который выполняет платформа 1С. Рассмотрим такой текс запроса:
Было бы хорошо, если первый запрос пакета исключался в случае, когда пользователь захочет выбирать все заказы. Для этого необходимо, чтобы условие в «ГДЕ» стало необязательным. Второй запрос пакета перепишем так:
и посмотрим, что получилось после выполнения:
Это весь запрос. Временная таблица исключена, исключено условие. Но теперь не понятно как быть, если условие по остаткам нужно вернуть в запрос. Как видно СКД добавила алиас «Поле2» и данное поле добавляется в набор доступных полей. Если пользователь сделает отбор по этому полю, то условие вернется в запрос вместе со временной таблицей, но будет это выглядеть совсем не так как нам необходимо:
Чтобы получить нужный результат добавить параметр «ТолькоОстатки» в запрос:
Важно чтобы параметр и условие с подзапросом были в общих скобках «()» и обязательно без алиаса. Добавление алиаса по всей видимости превращает условие в одно из полей и если в настройках нет обращения к нему, то условие из запроса исчезает. Итак, в режиме пользователя мы включаем использование параметра или выключаем. При этом само значение параметра всегда должно быть равно «Истина»:
Если параметр включен, то получаем:
Если параметр выключен, то просто запрос по заказам. Можно сделать то же самое несколько по-другому. Таблицу с остатками добавить через левое соединение как необязательную. И добавлять или не добавлять отбор по полю остатка:
При этом управление отбором для пользователя можно сделать средствами СКД без дополнительных усилий:
В настройках это выглядит как:
Ну и результирующий запрос, в случае если отбор установлен:

















































