Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.
Войдите на сайт как ученик
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: функции и операторы для работы с типами (ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА, ЕСТЬNULL, ВЫРАЗИТЬ)
- Автор уроков и преподаватель школы: Владимир Милькин
- Давайте вспомним, что каждый реквизит (свойство, поле) справочника, документа или любого другого прикладного объекта имеет свой тип. И этот тип мы можем посмотреть в конфигураторе:
В языке запросов существует целый класс функций и операторов для работы с типами реквизитов. Давайте рассмотрим их.
Функция ТИПЗНАЧЕНИЯ
Эта функция принимает один параметр (значение) и возвращает его тип. Для описанного на картинке (выше) реквизита Вкус справочника Еда вернётся следующее:
ВЫБРАТЬ Наименование, Вкус, ТИПЗНАЧЕНИЯ(Вкус) ИЗ Справочник.Еда |
Если мы запросим тип поля Наименование, то, как и ожидается, получим Строка:
ВЫБРАТЬ Наименование, ТИПЗНАЧЕНИЯ(Наименование) ИЗ Справочник.Еда |
- А теперь давайте рассмотрим реквизит ОтличительныйПризнак у справочника Города:
Вы видите, что этот реквизит может иметь один из нескольких типов: Строка, Справочник.Вкусы, Справочник.Цвета. Такой тип реквизитов называется СОСТАВНЫМ.
- Если мы попытаемся заполнить значение такого реквизита в режиме 1С:Предприятие, то система спросит нас, какого типа будет вводимое значение:
- И только после нашего выбора позволит ввести значение выбранного типа.
Таким образом, элементы справочника одного вида (Справочник.Города) смогут хранить в одном и том же реквизите (ОтличительныйПризнак) значения разных типов (Строка, Цвета или Вкусы).
Вы можете убедиться в этом сами пощёлкав по элементам справочника Города в режиме 1С:Предприятие. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
- Здесь значение отличительного признака является элементом справочника Вкусы:
- Здесь строкой:
- А здесь вообще элементом справочника Цвета:
- Вот какие возможности открывает перед нами составной тип данных!
- Интересно, как поведёт себя функция ТИПЗНАЧЕНИЯ на реквизите ОтличительныйЭлемент, имеющий составной тип данных:
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города |
Это уже очень интересно. Давайте разбираться с каждой строкой в отдельности.
Тип значения отличительного признака для элемента Россия равен NULL. Мы впервые сталкиваемся с этим типом. Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных.
Так и есть, ведь элемент Россия является группой, а не обычным элементом справочника Города, поэтому у него отсутствует поле ОтличительныйПризнак. А тип у отсутствующего значения, как мы прочитали выше, всегда равен NULL.
Идём дальше.
Тип значения отличительного признака для Перми равен Вкусы. Так и есть, ведь значение отличительного признака забитое в базе для города Пермь является ссылкой на элемент справочника Вкусы.
Для Красноярска тип признака равен Цвета, потому что значение выбранное в базе является ссылкой на элемент справочника Цвета.
Для Воронежа тип признака равен Строка, потому что значение введенное в базе является обычной строкой.
Индия снова группа, поэтому значение отсутствует. А тип у отсутствующего значения, как мы помним, равен NULL.
Далее всё аналогично, кроме Сан-Паулу. Это не группа, а обычный элемент справочника (город), но тип его значения пустой. Как так?
А дело вот в чём. Если вы зайдёте в элемент справочника Города с наименованием Сан-Паулу, то увидите, что поле ОтличительныйПризнак совершенно никак не заполнено. Оно пустое. А все незаполненные поля составного типа имеют специальное значение НЕОПРЕДЕЛЕНО.
С НЕОПРЕДЕЛЕНО мы также сталкиваемся впервые.
Значение НЕОПРЕДЕЛЕНО применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Это как раз наша ситуация.
А тип для значения, которое не принадлежит ни к одному из типов, как вы уже наверное догадались отсутствует.
Функция ТИП
Она принимает всего один параметр — имя примитивного типа (СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО), либо имя таблицы, тип ссылки которой нужно получить.
Результатом данной конструкции будет значение типа Тип для указанного типа.
Давайте рассмотрим применение данной конструкции и всё сразу станет на свои места.
Пусть нам требуется отобрать все записи справочника Города, у которых составной реквизит ОтличительныйПризнак имеет значение типа СТРОКА:
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города ГДЕ ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) = ТИП(СТРОКА) |
Теперь давайте отберём все записи, у которых значения реквизита ОтличительныйПризнак являются ссылками на элементы справочника Цвета (таблица Справочник.Цвета):
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города ГДЕ ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) = ТИП(Справочник.Цвета) |
Отступление
Как вы помните, некоторые элементы справочника Города не имеют реквизита ОтличительныйПризнак. Функция ТИПЗНАЧЕНИЯ для таких элементов выдаёт NULL.
Как можно сделать отбор таких элементов в запросе? Для этого предусмотрен специальный логический оператор ЕСТЬ NULL (не путать с функцией ЕСТЬNULL, которую мы рассмотрим ниже). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Вот пример его использования:
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города ГДЕ ОтличительныйПризнак ЕСТЬ NULL |
- Отлично.
- Но есть и такие элементы (Сан-Паулу), у которых реквизит ОтличительныйПризнак (составного типа) просто не заполнен и равен специальному значению НЕОПРЕДЕЛЕНО.
- Чтобы отобрать такие записи следует использовать другую конструкцию:
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города ГДЕ ОтличительныйПризнак = НЕОПРЕДЕЛЕНО |
- Но сравнение с НЕОПРЕДЕЛЕНО для определения пустых (не заполненных) реквизитов будет работать только для составных типов.
- Кстати, у логического оператора ЕСТЬ NULL форма отрицания выглядит следующим образом:
ВЫБРАТЬ Наименование, ОтличительныйПризнак ИЗ Справочник.Города ГДЕ ОтличительныйПризнак ЕСТЬ НЕ NULL |
Логический оператор ССЫЛКА
Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного слева от него, ссылкой на таблицу, указанную справа.
К примеру, давайте выберем из справочника Города только те записи, у которых значение составного реквизита ОтличительныйПризнак являются ссылкой на элемент справочника Вкусы:
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города ГДЕ ОтличительныйПризнак ССЫЛКА Справочник.Вкусы |
Как вы помните, эту же задачу мы могли бы решить используя ТИПЗНАЧЕНИЯ и ТИП:
ВЫБРАТЬ Наименование, ОтличительныйПризнак, ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) ИЗ Справочник.Города ГДЕ ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) = ТИП(Справочник.Вкусы) |
Функция ЕСТЬNULL
- Функция предназначена для замены значения NULL на другое значение.
- Мы помним, что значение NULL возвращается в том случае, если запрашиваемый реквизит (поле, свойство) не существует.
- Как например, реквизит ОтличительныйПризнак для групп справочника Города:
ВЫБРАТЬ Наименование, ОтличительныйПризнак ИЗ Справочник.Города |
Функция ЕСТЬNULL поможет нам вывести другое значение в том случае, если это значение равно NULL.
Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Пусть в данном случае это будет строка «Такого реквизита нет!»:
ВЫБРАТЬ Наименование, ЕСТЬNULL(ОтличительныйПризнак, «Такого реквизита нет!») ИЗ Справочник.Города |
Получается, что если первый параметр функции ЕСТЬNULL не равен NULL, то возвращается он. Если же он равен NULL, то возвращается второй параметр.
Функция ВЫРАЗИТЬ
Эта функция предназначена только для полей, имеющих составной тип. Отличным примером такого поля является свойство ОтличительныйПризнак у элементов справочника Города.
Как мы помним, составные поля могут быть одного из нескольких типов, указанных в конфигураторе.
Для поля ОтличительныйПризнак такими допустимыми типами являются СТРОКА, Справочник.Цвета и Справочник.Вкусы.
Иногда возникает необходимость привести значения составного поля к какому-либо определенному типу.
Давайте приведём все значения поля ОтличительныйПризнак к типу Справочник.Цвета:
ВЫБРАТЬ Наименование, ВЫРАЗИТЬ(ОтличительныйПризнак КАК Справочник.Цвета) ИЗ Справочник.Города |
В результате, все значения элементов, которые имели тип Справочник.Цвета, остались заполненными и оказались приведенными к указанному типу. Все значения других типов (СТРОКА, Справочник.Вкусы) теперь стали равны NULL. В этом состоит особенность приведения типа при помощи функции ВЫРАЗИТЬ.
Приводить тип можно или к примитивному типу (БУЛЕВО, ЧИСЛО, СТРОКА, ДАТА) или к ссылочному типу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но тип, к которому делается приведение, обязательно должен входить в список типов для данного составного поля, иначе система выдаст ошибку.
Пройдите тест
а) Напишите запрос, который запрашивает из справочника Города реквизиты Наименование и Мэр, а также тип значения, которое находится в составном поле Мэр:
Источник: https://helpme1c.ru/yazyk-zaprosov-1s-8-3-dlya-nachinayushhix-programmistov-funkcii-i-operatory-dlya-raboty-s-tipami-tipznacheniya-tip-ssylka-estnull-vyrazit
Пустая ссылка составного типа в запросе
Запросы, Программирование
Пришла на днях задачка от клиента: Хочу говорит такой-сякой отчет, с такими то данными, ресурсами, группировкам и т.д. Но главное условие этого отчета, что бы выводились только те документы, у которых некий реквизит “ДокументОснование” был не пустой. Фигня делов, накидал сделал и понял… не работает главное условие. Итак разберемся.
Есть к примеру у нас документ “ЗарплатаСотрудника” с реквизитом “ДокументОснование” составного типа:
Пример документа с реквизитов
Первое что я сделал на автомате при реализации условия, что ссылка составного типа не должны быть пустой, это использовал значение “null”:
ВЫБРАТЬ
ЗарплатаСотрудника.Ссылка КАК Ссылка,
ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование
ИЗ
Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника
ГДЕ
НЕ ЗарплатаСотрудника.ДокументОснование ЕСТЬ NULL
ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника НЕ ЗарплатаСотрудника.ДокументОснование ЕСТЬ NULL |
Соответственно не получив результат вспомнил, что NULL – это по сути отсутствующие значения, а не как не нулевое или пустое. Это значение появляется в результате соединений в запросе, обращениям к реквизитам для битой ссылки…
Тогда пришлось использовать второй на вскидку вариант: значение “Неопределено”:
ВЫБРАТЬ
ЗарплатаСотрудника.Ссылка КАК Ссылка,
ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование
ИЗ
Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника
ГДЕ
НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО
ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО |
Этот вариант оказался более рабочим, но и здесь была проблема: если в документе в реквизите “ДокументОснование” никогда ничего не выбирали, то там действительно будет значение “Неопределено”.
Но если в этом реквизите был выбран тип значения, а само значение выбрано не было – то в этом случае в реквизите будет уже пустая ссылка этого типа, а не значение “Неопределено”.
Что меня не устраивало.
И остался у меня последний вариант: проверка на пустую ссылку для всех типов:
ВЫБРАТЬ
ЗарплатаСотрудника.Ссылка КАК Ссылка,
ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование
ИЗ
Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника
ГДЕ
НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО
И НЕ(ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Анкета.ПустаяСсылка)
ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Встреча.ПустаяСсылка)
ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.ЗапланированноеВзаимодействие.ПустаяСсылка)
ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.НазначениеОпросов.ПустаяСсылка))
ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО И НЕ(ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Анкета.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Встреча.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.ЗапланированноеВзаимодействие.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.НазначениеОпросов.ПустаяСсылка)) |
Данный вариант оказался рабочим и документы с пустым полем “ДокументОснование” не попадали в отчет. Но мне данное решение показалось не оптимальным: как минимум оно выглядело не красиво, а как максимум при добавлении нового типа в данный реквизит, пришлось бы переписывать запрос отчета.
Полазив на форумах и почитав методическую информацию было найдено решение со значением NULL. Поскольку NULL появляется при соединения, то в запросе можно получить у реквизита “ДокументОснование” ссылку. Соответственно на уровне SQL все ссылочные значения, получаемые через точку, формируются через левое соединение, что и даст нам NULL при пустых значениях:
ВЫБРАТЬ
ЗарплатаСотрудника.Ссылка КАК Ссылка,
ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование
ИЗ
Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника
ГДЕ
НЕ ЗарплатаСотрудника.ДокументОснование.Ссылка ЕСТЬ NULL
ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника НЕ ЗарплатаСотрудника.ДокументОснование.Ссылка ЕСТЬ NULL |
Вот таким нехитрым способом удалось решить задачу. Если можете предложить решение лучше или оптимальнее пишите. Всегда интересно узнать что-то новое.
К вопросу о соотношении понятий доменное имя и название сайт а хозяйство и право.
Источник: https://craft1c.ru/pustaja-ssylka-sostavnogo-tipa-v-zaprose/
Проверка типа в запросе
Для работы с типами в запроса для сравнения и отборов существует две функции: ТИП() и ТИПЗНАЧЕНИЯ(), а также конструкция ССЫЛКА для ссылочных типов. В общем случае тип значения применяется для работы с составными полями, так как в других случаях тип значения известен заранее или не меняется.
Примеры проверки типа в запросах:
- Получить тип в полях выборки:
- ВЫБРАТЬ ТИП(Строка), ТИП(Справочник.Контрагенты)
- Получить совпадение типа в выборке
- Выбрать ТИПЗНАЧЕНИЯ(Ссылка) = ТИП(Справочник.Контрагенты)
- Отбор по типу значения:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ ТИПЗНАЧЕНИЯ(ОсновнойМенеджер) = ТИП(Справочник.ФизическиеЛица)
Использование конструкции ССЫЛКА:
ВЫБРАТЬ ИНН ИЗ Справочник.Контрагенты ГДЕ ОсновнойМенеджер ССЫЛКА Справочник.ФизическиеЛица
Последние две конструкции идентичны по результату исполнения, но последняя применима только к ссылочным типам, что не всегда так, но более компактна. Допустимо использование данных конструкций и в качестве условия для соединения таблиц.
На тип значения можно проверять не только поля из выборки запроса, но и параметры:
ВЫБРАТЬ * из Справочник.Контрагенты ГДЕ ТИПЗНАЧЕНИЯ(&Параметр) = ТИП(Справочник.Контрагенты)
Параметром функции ТИПЗНАЧЕНИЯ могут выступать:
СТРОКА, ЧИСЛО, ДАТА, а также все ссылочные типы.
Чтобы проверить на несколько значений применяется условие ИЛИ или множество В()
ВЫБРАТЬ Ссылка ИЗ Справочник.Пользователи ГДЕ ФизЛицо ССЫЛКА Справочник.ФизическиеЛица ИЛИ Физлицо ССЫЛКА Справочник.Пользователи
ВЫБРАТЬ Ссылка ИЗ Справочник.Пользователи ГДЕ ТИПЗНАЧЕНИЯ(Физлицо) В (ТИП(Справочник.ФизическиеЛица),ТИП(Справочник.Пользователи))
При сравнении ссылочных типов пустые ссылки, также дают совпадение, то есть для проверки на заполненность они применимы только как вспомогательные функции
Выбрать * ИЗ Справочник.Пользователи ГДЕ ТИПЗНАЧЕНИЯ(Физлицо) ТИП(Неопределено) И ТИПЗНАЧЕНИЯ(Физлицо) ТИП(NULL) И НЕ Физлицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
Реклама — виновница того, что народ выбрал себе в вожди Гитлера. Реклама призвана убеждать граждан, что ситуация нормальна, когда она катастрофически ненормальна.
— Фредерик Бегбедер
Источник: http://Capitally.ru/1c-development/zaprosy/proverka-tipa-v-zaprose-1s/
Язык запросов 1С 8.3 и 8.2 — полное руководство
Закажите бесплатный расчет стоимости вашей задачи по 1С!Перезвоним за 10 минут! (в рабочие часы)
Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов. В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.
Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, вложенные запросы (запрос в запросе). Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.
В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:
- выбрать
- разрешенные
- различные
- выразить
- первые
- для изменения
- значение
- тип значения (и оператор ССЫЛКА)
- выбор
- сгруппировать по
- имеющие
- ЕСТЬNULL
- Есть NULL
- соединения — правые, левые, внутренние, полные.
А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.
Для отладки запросов в системе 1С 8.2 предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — консоль запросов 1C.
Основные конструкции языка запросов
Рассмотрим самые важные и интересные операторы языка запросов 1С.
ВЫБРАТЬ (SELECT)
В языке запросов 1С предприятия 8 любой запрос начинается с ключевого слова ВЫБРАТЬ. В языке 1С нет конструкций UPDATE, DELETE, CREATE TABLE, INSERT, эти манипуляции производятся в объектной технике. Предназначение его — только чтение данных.
Например:
ВЫБРАТЬ
ТекущийСправочник.Наименование
ИЗ
Справочник.Номенклатура КАК ТекущийСправочник
- Запрос вернёт таблицу с наименованиями номенклатуры.
- Рядом с конструкцией ВЫБРАТЬ можно встретить ключевые слова ДЛЯ ИЗМЕНЕНИЯ, РАЗРЕШЕННЫЕ, РАЗЛИЧНЫЕ, ПЕРВЫЕ …
ДЛЯ ИЗМЕНЕНИЯ — блокирует записи таблицы на время транзакции (не актуально для управляемых блокировок). Подробнее в статье ДЛЯ ИЗМЕНЕНИЯ в запросах 1С.
РАЗРЕШЕННЫЕ — выбирает только записи из таблицы, на которые есть права у текущего пользователя.
РАЗЛИЧНЫЕ — означает, что в результат не попадет дублирующих строк.
ПЕРВЫЕ n — в языке 1С 8.3 запрос отберет только n первых записей.
ВЫБОР (CASE)
Очень часто данная конструкция недооценивается программистами. Пример её использования:
- ВЫБРАТЬ
- ТекущийСправочник.Наименование,
- ВЫБОР
- КОГДА ТекущийСправочник.Услуга ТОГДА
- «Услуга»
- ИНАЧЕ
- «Товар»
- КОНЕЦ КАК ВидНоменклатуры
- ИЗ
- Справочник.Номенклатура КАК ТекущийСправочник
Пример возвратит в поле «ВидНоменклатуры» текстовое значение — «Товар» или «Услуга».
ГДЕ (WHERE)
Конструкция языка запросов 1C, позволяющая наложить отбор на получаемые данные. Учтите, что от сервера система получает все данные, а только потом они отбираются по данному параметру.
Пример:
ВЫБРАТЬ
Справочник.Наименование
ИЗ
ТекущийСправочник.Номенклатура КАК ТекущийСправочник
ГДЕ ТекущийСправочник.Услуга = ИСТИНА
В примере мы отбираем записи, у которых значение реквизита «Услуга» установлено в положение «Истина». В данном примере можно было бы обойтись и таким условием:
«ГДЕ Услуга»
По сути, мы отбираем строки, у которых выражение после ключевого слова равно «Истина».
В выражениях можно использовать прямые условия:
ГДЕ Код = «005215»
С помощью оператора «ЗНАЧЕНИЕ()» в условиях использовать обращение к предопределенным элементам и перечислениям в запросе 1С:
ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Товар)
Значения времени могут указываться следующим образом:
ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01):
Чаще всего условия указываются в виде параметров, передаваемых в запрос:
Получите 267 видеоуроков по 1С бесплатно:
ГДЕ НоменклатурнаяГруппа= &НоменклатурнаяГруппа
Условие можно наложить на тип реквизита, если он составного типа:
ГДЕ РегистрНакопления.Регистратор ССЫЛКА Документ.ПоступленияТоваров
Если необходимо ограничивать отбор из списка значений или массива, можно поступить следующим образом:
ГДЕ РегистрНакопления.Регистратор В (&СписокДокументовДляОтбора)
Условие может быть и сложное, состоящее из нескольких условий:
ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01) И НоменклатурнаяГруппа= &НоменклатурнаяГруппа И НЕ Услуга
СГРУППИРОВАТЬ ПО (GROUP BY)
Конструкция языка запросов 1С 8.2, используемая для группировки результата.
Например:
ВЫБРАТЬ
ПоступлениеТоваровУслугTовары.Товар,
СУММА(ПоступлениеТоваровУслугTовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугTовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугTовары
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугTовары.Товар
Данный запрос просуммирует все поступления по сумме и количеству в разрезе номенклатуры.
Помимо ключевого слова СУММА можно использовать другие агрегатные функции: КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗНЫХ, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ.
ИМЕЮЩИЕ (HAVING)
Конструкция, о которой часто забывают, но она очень важна и полезна. Она позволяет указать отбор в виде агрегатной функции, этого нельзя сделать в конструкции ГДЕ.
Пример использования ИМЕЮЩИЕ в запросе 1С:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Товар,
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
- СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.товар - ИМЕЮЩИЕ
- СУММА(ПоступлениеТоваровУслугТовары.Количество) > 5
Так мы отберем количество товаров, которых поступило более 5 штук.
ЗНАЧЕНИЕ()
В запросе 1C ЗНАЧЕНИЕ () можно использовать для указания предопределенных значений, таких как значения перечисления, пустую ссылку или значение предопределенного элемента (справочника, плана счетов, ПВХ и т.д).
Например:
ГДЕ Банк = Значение(Справочник.Банки.ПустаяСсылка)
или
ГДЕ ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)
или
ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Услуга)
ТИП в запросе
Тип данных можно проверить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью логического оператора ССЫЛКА.
Пример:
ГДЕ ТИПЗНАЧЕНИЯ(Проект.Ссылка) ТИП(Справочник.Проект)
или
ГДЕ Проект.Ссылка ССЫЛКА Справочник.Проект
ВЫРАЗИТЬ()
- Оператор Выразить в запросах 1С служит для преобразования типов данных.
- Синтаксис: ВЫРАЗИТЬ( КАК )
- С помощью него можно преобразовать строковые значения в дату или ссылочные в строковые данные и так далее.
В практическом применении оператор Выразить() очень часто используется для преобразования полей неограниченной длины, потому что поля неограниченной длины нельзя отбирать, группировать и тд.
Если такие поля не преобразовывать, Вы получите ошибку Нельзя сравнивать поля неограниченной длины и поля несовместимых типов.
Пример:
ВЫБРАТЬ
КонтактнаяИнформация.Объект,
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)) КАК Представление
ИЗ
- РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
- СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)), - КонтактнаяИнформация.Объект
ЕСТЬNULL (ISNULL)
Достаточно полезная функция языка запросов 1С, которая проверяет значение в записи, и если оно равно NULL, то позволяет заменить на своё значение. Чаще всего используется при получении виртуальных таблиц остатков и оборотов, чтобы скрыть NULL и поставить понятный 0 (ноль).
Пример:
ЕСТЬNULL(НалогиПредМесяца.ПримененнаяЛьготаФСС, 0)
Такая функция языка запросов 1С ЕСТЬNULL при отсутствии значения вернет ноль, что позволит избежать ошибки.
СОЕДИНЕНИЕ (JOIN)
Соединения бывают 4 типов: ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ, ВНУТРЕННЕЕ.
Левое и правое соединение
Соединения используются для связи двух таблиц по определенному условию. Особенность при ЛЕВОМ СОЕДИНЕНИИ в том, что мы берём первую указанную таблицу полностью и привязываем по условию вторую таблицу. Поля второй таблицы, которые не удалось привязать по условию, заполняются значением NULL.
Пример левого соединения в запросе 1С:
ВЫБРАТЬ
Клиенты.Ссылка КАК Контрагент,
Банки.Ссылка КАК Банк
ИЗ
Справочник.Контрагенты КАК Клиенты
ЛЕВОЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки
ПО
Клиенты.Наименование = Банки.Наименование
Вернет всю таблицу Контрагентов и заполнит поле «Банк» лишь в тех местах, где будет соблюдаться условие «Контрагенты.Наименование = Банки.Наименование». Если условие не соблюдается, в поле Банк будет установлено NULL.
ПРАВОЕ СОЕДИНЕНИЕ в языке 1С 8.3 абсолютно аналогично ЛЕВОМУ соединению, за исключением одного отличия: в ПРАВОМ СОЕДИНЕНИИ «главная» таблица — вторая, а не первая.
Полное соединение
Полное соединение отличается от левого и правого тем, что выводит все записи из двух таблиц, соединяет лишь те, которые может соединить по условию.
Например:
ВЫБРАТЬ
Клиенты.Ссылка КАК Клиенты,
Банки.Ссылка КАК Банк
ИЗ
Справочник.Контрагенты КАК Клиенты
Полное соединение
Справочник.Банки КАК Банки
ПО
Клиенты.Наименование = Банки.Наименование
Язык запросов вернет обе таблицы полностью лишь по выполненному условию Соединить записи. В отличие от левого/правого соединения возможно появления NULL в двух полях.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ отличается от полного тем, что выводит только те записи, которые смогли соединить по заданному условию.
Например:
- ВЫБРАТЬ
Клиенты.Ссылка КАК Клиенты, - Банки.Ссылка КАК Банк
- ИЗ
Справочник.Контрагенты КАК Клиенты - ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки
ПО
Клиенты.Наименование = Банки.Наименование
Данный запрос вернет только строки, в которых у банка и контрагента будет одинаковое наименование.
Заключение
Это лишь небольшая часть синтаксиса из языка запросов 1С 8, в дальнейшем я попробую рассмотреть более подробно некоторые моменты, показать способы оптимизации запросов и многое другое!
Рубрикатор статей сайта по запросам
Видеокурс по 1С
Если вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые виде):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Остались вопросы?
СПРОСИТЕ в х!
Источник: https://programmist1s.ru/yazyik-zaprosa-1s/
Проверка на заполненное значение в запросе 1с. Значение() в запросе
Запрос.Текст =
«ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения
// Пример 1. сравнение с не заполненным булевым значением:
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:
|ГДЕ
| НЕ усЕдиницыХранения.
РазрешитьОтборИзРезервнойЗоны
// Пример 3. выборка по условию не заполненного поля, имеющего тип «справочник конкретного типа»
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
// Пример 3а. выборка по условию не заполненного поля, имеющего тип «документ конкретного типа»
|ГДЕ
| НашРегистрСведений.
Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
// Пример 3б. выборка по условию не заполненного поля, имеющего тип «документы разных типов» (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ…(и т.д.
— последовательно перечисляем условия для всех возможных типов этого составного поля))
// Пример 4. или наоборот, если нужно выбрать заполненное значение типа «строка», то поможет условие:
|ГДЕ
| усЕдиницыХранения.Наименование > «»»»
// Пример 5.
если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре «ВыполняемыеЗадания» ресурс «Задание» имеет составной тип, среди значений которого возможен документ «Отбор»
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
// Пример 5а.
Еще аналогичный пример, когда нужно выбрать документы конкретного типа
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА «»ПоступлениеТоваровУслуг»»
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.
РеализацияТоваровУслуг
| ТОГДА «»РеализацияТоваровУслуг»»
| ИНАЧЕ «»»»
| КОНЕЦ КАК ВидДокумента
// Пример 6. выбор по условию не определенного значения:
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
// Пример 7. выбор по виду движения «Приход» регистра накопления, «Расход» — аналогично):
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.
Приход)
// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например,
нужно программно в зависимости от какого-то условия вернуть пустой результат запроса — Запрос.Текст = СтрЗаменить(Запрос.Текст, «ГДЕ Док.Ссылка = &ДокументСсылка», «ГДЕ ЛОЖЬ»);).
Для этого достаточно добавить условие «Где Ложь».
Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
|ГДЕ ЛОЖЬ
// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Пример 10. выбор по условию не заполненной даты:
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
В языке запросов 1С часто требуется проверить: является ли значение пустой ссылкой. Пустая ссылка — это такое значение ссылочных объектов, когда оно имеет этот же тип, но само значение не выбрано.
На языке программирования 1С
данное значение можно получить через менеджеры объекта.
Например:
- Перечисления.Пол.ПустаяСсылка(),
- Справочники.Организации.ПустаяСсылка(),
- ПланыСчетов.Хозрасчетный.ПустаяСсылка(),
- ПредопредленноеЗначение(«ПланСчетов.Хозрасчетный.ПустаяСсылка»)
Быстрый переход
Как же в запросе 1С сравнить на пустое значение
Для этого у нас есть несколько вариантов в зависимости от требований задачи:
1.Если требуется получить значение пустого типа.
Воспользуемся функцией ЗНАЧЕНИЕ()
Выбрать ЗНАЧЕНИЕ (Перечисление.Пол.ПустаяСсылка)//Без вопроса в единственном числе
- Либо через переданный в запрос параметр: Выбрать
- &ПустойПараметрНужногоТипа
2. Если требуется сравнить со значением не составного типа:
Выбрать Значение(Перечисление.Пол.ПустаяСсылка)Значение(Перечисление.Пол.Мужской) как ЭтоБулевоИстина
Выбрать Выбор когда &ПустойПараметрНужногоТипа ИЛИ Значение(Перечисление.Пол.Мужской) Тогда Истина Иначе Ложь Конец как ЭтоНеЖенскийПол
3. Если требуется проверка составного значения:
В этом случае значение
- может быть неопределенного типа (очищено или ни разу не выбрано)
- пустой ссылкой любого из типов (выбран тип, но не выбрано значение)
- выбранным значением любого из типов (выбрано значение)
В этом случае обычно первые два варианта считаются пустым значением, но пустыми ссылками являются только вторые.
//Мы инициализировали массив заполненных значений и сравнили его с пустым
Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (Значение(Перечисление.Пол.Мужской),Значение(Перечисление.Пол.Женский)) ИЛИ Есть NULL Тогда Истина Иначе Ложь конец ЗначениеПустое
//Мы инициализировали массив пустых ссылок и проверили вхождение в него нашего «неизвестного» значения
Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.Мужской) в (Значение(Перечисление.Пол.ПустаяСсылка),Значение(Справочник.Контрагенты.ПустаяСсылка)) Тогда Истина Иначе Ложь конец ЗначениеПустое
Также мы можем передать массив параметром
Выбрать Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (&МассивВсехПустыхСсылок) Тогда Истина Иначе Ложь конец ЗначениеПустое
Про перечисление в запросе 1С.
Запрос.Текст = «ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения // Пример 1. сравнение с не заполненным булевым значением:
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь // Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:
|ГДЕ
| НЕ усЕдиницыХранения.
РазрешитьОтборИзРезервнойЗоны // Пример 3. выборка по условию не заполненного поля, имеющего тип «справочник конкретного типа»
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка) // Пример 3а. выборка по условию не заполненного поля, имеющего тип «документ конкретного типа»
|ГДЕ
| НашРегистрСведений.
Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка) // Пример 3б. выборка по условию не заполненного поля, имеющего тип «документы разных типов» (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка) | ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка) | ИЛИ…(и т.д.
— последовательно перечисляем условия для всех возможных типов этого составного поля)) // Пример 4. или наоборот, если нужно выбрать заполненное значение типа «строка», то поможет условие:
|ГДЕ | усЕдиницыХранения.Наименование > «»»»
// Пример 5.
если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре «ВыполняемыеЗадания» ресурс «Задание» имеет составной тип, среди значений которого возможен документ «Отбор»
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор // Пример 5а.
Еще аналогичный пример, когда нужно выбрать документы конкретного типа
| ВЫБОР | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг | ТОГДА «»ПоступлениеТоваровУслуг»» | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.
РеализацияТоваровУслуг | ТОГДА «»РеализацияТоваровУслуг»» | ИНАЧЕ «»»» | КОНЕЦ КАК ВидДокумента // Пример 6. выбор по условию не определенного значения:
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО // Пример 7. выбор по виду движения «Приход» регистра накопления, «Расход» — аналогично):
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.
Приход) // Пример 8. Как в запросе указать, что выполнять запрос не нужно (например,
нужно программно в зависимости от какого-то условия вернуть пустой результат запроса — Запрос.Текст = СтрЗаменить(Запрос.Текст, «ГДЕ Док.Ссылка = &ДокументСсылка», «ГДЕ ЛОЖЬ»);).
Для этого достаточно добавить условие «Где Ложь».
Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
|ГДЕ ЛОЖЬ // Пример 9. Проверка на то, что результат выполнения запроса содержит данные: Если НЕ Запрос.Выполнить().Пустой() Тогда // Пример 10. выбор по условию не заполненной даты:
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
Предопределенные значения объектов конфигурации отличный способ заполнить 1с распространенными значениями, а в бухгалтерских конфигурациях в плане счетов без этого не обойтись, ведь набор счетов жестко регламентирован.
Быстрый переход
Как же работать с предопределенными значениями?
В коде модулей обращение к таким элементам производится через менеджер объекта, например:
В языке запросов это производится аналогично, но с использованием функции запросов ЗНАЧЕНИЕ(). Функция значение предназначена для получения ссылки на предопределенные значения справочников, перечислений, планов видов характеристик, планов счетов, планов видов расчетов, точек маршрутов бизнес процессов, к системным перечислениям.
При этом имя вида объекта указывается в запросе в единственном числе.
Примеры использования ЗНАЧЕНИЕ():
ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Услуга)
Для проверки на пустое значение справочника:
Справочник.Контрагенты КАК Контрагенты
Контрагенты.ОсновнойДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
Для получения перечислений:
Справочник.ДоговорыКонтрагентов КАК Договор
Договор.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
ИЛИ Договор.ВидДоговора = ЗНАЧЕНИЕ (Перечисление.ВидыДоговоровКонтрагентов.ПустаяСсылка)
План видов характеристик:
ВЫБРАТЬ ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.ПустаяСсылка)
Счет в плане счетов:
ВЫБРАТЬ ЗНАЧЕНИЕ (ПланСчетов.Хозрасчетный.Товары) КАК СчетТоваров
Системные перечисления:
ВЫБРАТЬ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК Расход, ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК Приход, ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет) КАК Дебет, ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Кредит) КАК Кредит, ЗНАЧЕНИЕ(ВидСчета.Активный) КАК Активный, ЗНАЧЕНИЕ(ВидСчета.Пассивный) КАК Пассивный,
ЗНАЧЕНИЕ(ВидСчета.АктивноПассивный) КАК АктивноПассивный
Аналог функции ЗначениеЗаполнено() в запросе
- В явном виде функции на заполнение нет, но возможна проверка на несовпадение,
например:
ГДЕ НЕ ОсновнойДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагента.ПустаяСсылка)
- проверка на невхождение в список:
ГДЕ НЕ ОсновнойДоговорКонтрагента В (ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагента.ПустаяСсылка), НЕОПРЕДЕЛЕНО, NULL,»»)
То есть, если значение не пустое или не входит в список пустых, его можно считать заполненным.
Ошибки при использовании ЗНАЧЕНИЕ()
При неверном синтаксисе параметра функции возникает ошибка «Неверные параметры».
- указание во множественном числе (например «Справочники» вместо «Справочник»)
- не верное имя предопределенного или его отсутствие
- Недопустима передача в ЗНАЧЕНИЕ параметра вот так:
- ЗНАЧЕНИЕ(&Параметр)
- Выйдет ошибка «Ожидается параметр»:
- Функция как раз предназначена для ухода от параметров для предопределенных в метаданных ссылках.
- Не требуется указание параметра функции в кавычках: это вызовет ошибку «Ожидается имя»
Источник: https://musings.ru/gift/proverka-na-zapolnennoe-znachenie-v-zaprose-1s-znachenie-v/
Проверка типа ссылки в запросах 1С: Предприятия 8
Данную проблему я предлагаю рассмотреть на примере построения запроса в рамках типовой конфигурации «Управление торговлей», редакция 10.2. Собственно, передо мной встала задача — получить количество списанного товара.
Имеется в виду, товар списывается именно документом «Списание товара». При изучении движений этого документа выяснилось, что он, помимо всего прочего, выполняет расход по регистру ТоварыНаСкладах.
С другой стороны, в качестве регистраторов движений по этому регистру выступает большое количество различных документов, следовательно, в запросе нужно отобрать только те регистраторы, тип которых — документ списания товаров.
Ну и еще одно примечание — воспользоваться виртуальной таблицей, к сожалению, не получится, так как в ней не предусмотрены средства отбора по регистратору.
Итак, как же проверить тип ссылки в запросе? Первоначально мои мысли заработали в направлении функции ПОДСТРОКА, и я написал конструкцию вида ГДЕ ПОДСТРОКА(ТоварыНаСкладах.Регистратор.Представление, 1, 8 ) = «Списание».
Разумеется, такая конструкция конструктору запросов крайне не понравилась, и это к лучшему (так как иначе эта статья бы не появилась ). Оказалось, что для решения поставленной задачи нужно применять оператор ССЫЛКА, то есть, условие будет выглядеть так: ГДЕ ТоварыНаСкладах.Регистратор ССЫЛКА Документ.СписаниеТоваров, т.е. оператор проверяет, является ли значение выражения, указанного слева от него, ссылкой на таблицу, указанной справа (кстати в документации почему-то наоборот написано. Ошибка ). Таким образом, наш запрос будет выглядеть так:
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
СУММА(ТоварыНаСкладах.Количество) КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
ТоварыНаСкладах.Регистратор ССЫЛКА Документ.СписаниеТоваров
И ТоварыНаСкладах.Период МЕЖДУ &НачПер И &КонПер
СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура
В запрос необходимо будет передать два параметра (начало и конец периода). Условие по виду движения, очевидно, не нужно, так как «маловероятно» , что документ списания будет делать приход
Вопросы и ответы
- Несколько вопросов и ответов со старого сайта.
- Вопрос (ZolteR): а вот у меня параметр &Контрагент составной (Склады или контрагенты) и почему при выборе одного из них в поле ввода выдает ошибку на другое?
- Если Склады:
&Контрагент ССЫЛКА Справочник.Контрагенты
Если Контрагенты:
&Контрагент ССЫЛКА Справочник.Склады
Ответ: на первый взгляд, нужно определять тип значения поля до вызова запроса и, соответственно, использовать разные запросы. Если честно, не понял вопрос. Желательно задачу полностью поставить.
Вопрос (Владимир): несовместимые типы «ССЫЛКА»
И НЕ СчетФактураПолученный.ДокументОснование ССЫЛКА Документ.ОтчетКомитентуОПродажах
Соотвественно ошибка идет и при выполнении программы. Галка о том, что ДокументОсновние может быть основанием ОтчетаКомитента поставлена. Какие могут быть идеи?
Ответ: СчетФактураПолученный.ДокументОснование В данном случае это реквизит, поэтому в первую очередь нужно проверять состав типов реквизита, а не возможность ввода на основании. Также необходимо убедиться, что при вводе на основании (процедура ОбработкаЗаполнения, если не ошибаюсь) этот реквизит заполняется ссылкой на собственно документ-основание.
Вопрос (Владимир): пока сходу могу добавить только, что Документов ОтчетКомитентуОПродажах не заведено на предприятии вообще ни одного. Но это не должно влиять на сравнение по типу. ДокументОснование — да, там я поставил галку в качестве состава реквизитов и на ОтчетеКомитента.
Ответ: по идее-то да (не должно влиять на сравнение по типу), но для отладки все-таки попробуйте завести. Еще можно попробовать выполнить тестирование и исправление ИБ (включая реиндексацию и реструктуризацию).
Источник: https://comp.dmkos.ru/publ/proverka_tipa_ssylki_v_zaprosah_1c_enterprise_8/
Функции языка запросов — 1С-справочник типовых задач (парадигмов) 8.х
К полям запроса можно применять различные функции. В этом разделе я рассмотрю наиболее часто применяемые (лично мною) из них. ДАТАВРЕМЯ(,,,,,) Запрос.Текст = «ВЫБРАТЬ | ДАТАВРЕМЯ(2013, 1, 1) КАК ОМГ»;//1 января 2013 РАЗНОСТЬДАТ(, , ) Запрос.Текст = «ВЫБРАТЬ | РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2013, 2, 28), ДАТАВРЕМЯ(2013, 1, 1), ДЕНЬ) | КАК ДнейДоКонцаЗимы»; ЗНАЧЕНИЕ() Запрос.Текст = «ВЫБРАТЬ //предопределенный элемент справочника | ЗНАЧЕНИЕ(Справочник.Валюты.Рубли) КАК Рубль, //пустая ссылка на документ | ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка) КАК ПустойСчет, //значение перечисления | ЗНАЧЕНИЕ(Перечисление.ПолФизическихЛиц.Мужской) КАК Мужчина, //предопределенный счет из плана счетов | ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) КАК Счет_41»; Пример 1: ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ Запрос.Текст = «ВЫБРАТЬ //если цена меньше 100, то запрос все равно вернет 100 //в противном случае запрос вернет реальную цену | ВЫБОР | КОГДА Товары.Цена > 100 | ТОГДА Товары.Цена | ИНАЧЕ 100 | КОНЕЦ КАК Цена |ИЗ | Справочник.Товары КАК Товары»; Пример 2:
ССЫЛКА Замечу, что NULL следует обязательно обрабатывать, т.к. это очень «капризный» тип (в системе «1С:Предприятие 8» определен специальный тип NULL с одним элементом). Если вы попытаетесь сравнить со значением данного типа или присвоить его, то обязательно нарветесь на ошибку, поэтому не забывайте о данной конструкции. Когда может выскочить NULL: после соединения таблиц, кроме внутреннего (о соединениях следующая статья); Это далеко не полный список функций языка запросов 1С 8, если заинтересует работа каких-либо еще — пишите в х. |
Источник: https://www.sites.google.com/site/1sspravocniktipovyhzadac/13-zaprosy-otcety/zaprosy/funkcii-azyka-zaprosov