Ссылка на документ в запросе

Очередная краткая заметка по не вполне очевидному оператору языка запросов 1С: Предприятия 8.

Данную проблему я предлагаю рассмотреть на примере построения запроса в рамках типовой конфигурации "Управление торговлей", редакция 10.2. Собственно, передо мной встала задача – получить количество списанного товара. Имеется в виду, товар списывается именно документом "Списание товара". При изучении движений этого документа выяснилось, что он, помимо всего прочего, выполняет расход по регистру ТоварыНаСкладах. С другой стороны, в качестве регистраторов движений по этому регистру выступает большое количество различных документов, следовательно, в запросе нужно отобрать только те регистраторы, тип которых – документ списания товаров. Ну и еще одно примечание – воспользоваться виртуальной таблицей, к сожалению, не получится, так как в ней не предусмотрены средства отбора по регистратору.

Итак, как же проверить тип ссылки в запросе? Первоначально мои мысли заработали в направлении функции ПОДСТРОКА , и я написал конструкцию вида ГДЕ ПОДСТРОКА(ТоварыНаСкладах.Регистратор.Представление, 1, 8 ) = "Списание" . Разумеется, такая конструкция конструктору запросов крайне не понравилась, и это к лучшему (так как иначе эта статья бы не появилась ). Оказалось, что для решения поставленной задачи нужно применять оператор ССЫЛКА , то есть, условие будет выглядеть так: ГДЕ ТоварыНаСкладах.Регистратор ССЫЛКА Документ.СписаниеТоваров , т.е. оператор проверяет, является ли значение выражения, указанного слева от него, ссылкой на таблицу, указанной справа (кстати в документации почему-то наоборот написано. Ошибка ). Таким образом, наш запрос будет выглядеть так:

В запрос необходимо будет передать два параметра (начало и конец периода). Условие по виду движения, очевидно, не нужно, так как "маловероятно" , что документ списания будет делать приход

Читайте также:  Форель это лосось или нет

Вопросы и ответы

Несколько вопросов и ответов со старого сайта.

Вопрос (ZolteR): а вот у меня параметр &Контрагент составной (Склады или контрагенты) и почему при выборе одного из них в поле ввода выдает ошибку на другое?

Ответ: на первый взгляд, нужно определять тип значения поля до вызова запроса и, соответственно, использовать разные запросы. Если честно, не понял вопрос. Желательно задачу полностью поставить.

Вопрос (Владимир): несовместимые типы "ССЫЛКА"

Соотвественно ошибка идет и при выполнении программы. Галка о том, что ДокументОсновние может быть основанием ОтчетаКомитента поставлена. Какие могут быть идеи?

Ответ: СчетФактураПолученный.ДокументОснование
В данном случае это реквизит, поэтому в первую очередь нужно проверять состав типов реквизита, а не возможность ввода на основании. Также необходимо убедиться, что при вводе на основании (процедура ОбработкаЗаполнения , если не ошибаюсь) этот реквизит заполняется ссылкой на собственно документ-основание.

Вопрос (Владимир): пока сходу могу добавить только, что Документов ОтчетКомитентуОПродажах не заведено на предприятии вообще ни одного. Но это не должно влиять на сравнение по типу. ДокументОснование – да, там я поставил галку в качестве состава реквизитов и на ОтчетеКомитента .

Ответ: по идее-то да (не должно влиять на сравнение по типу), но для отладки все-таки попробуйте завести.
Еще можно попробовать выполнить тестирование и исправление ИБ (включая реиндексацию и реструктуризацию).

Категория: Программирование, 1С | Опубликовано 07.06.2009 | Редакция от 15.01.2017

Примеры по программированию в 1с 7.7, 8.1, 8.2

вторник, 21 августа 2012 г.

Использование ССЫЛКА и ЗНАЧЕНИЕ 1с 8 в запросах

Пустая ссылка:
Номенклатура.ОсновноеИзображение = ЗНАЧЕНИЕ(Справочник.ХранилищеДополнительнойИнформации.ПустаяСсылка)

Существующие объекты:
КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
Перечисление.ВидыДоговоровКонтрагентов.СПоставщиком

Предопределенные значения справочника:
КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(справочник.видыконтактнойинформации.ЮрАдресКонтрагента)
КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(справочник.видыконтактнойинформации.ФактАдресФизЛица)

План видов характеристик:
СвойстваОбъектов.НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Склады)
КатегорииОбъектов.НазначениеКатегории = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документы)

Читайте также:  Программа для просмотра российских каналов

Проверка по виду объекту:
КонтактнаяИнформация.Объект ССЫЛКА Справочник.Контрагенты

ПродажиОбороты.Регистратор ССЫЛКА Документ.КорректировкаЗаписейРегистров

Значения типа Тип в запросах 1С могут использоваться при наложении условий, в сравнениях, упорядочивании и группировках. Для работы с типами предусмотрено несколько механизмов, которые покрывают все потребности разработчика. Рассмотрим их.

Функция ТИПЗНАЧЕНИЯ

Функция ТИПЗНАЧЕНИЯ имеет единственный параметр, куда передается значение, для которого требуется определить тип. Функция возвращает значения типа Тип. Чаще всего функция используется совместно с литералом ТИП в условиях запроса.

Рассмотрим примеры использования. Вывод в результат запроса типа Регистратора:

Закупки.Регистратор КАК Регистратор ,

ТИПЗНАЧЕНИЯ( Закупки.Регистратор ) КАК ТипРегистратора

РегистрНакопления.Закупки КАК Закупки

Использование функции ТИПЗНАЧЕНИЯ в операции сравнения:

Закупки.Регистратор КАК Регистратор

РегистрНакопления.Закупки КАК Закупки

ТИПЗНАЧЕНИЯ( Закупки.Регистратор ) = ТИП( Документ.ПриобретениеТоваровУслуг )

Литерал ТИП

В литерал ТИП передается имя примитивного типа или таблицы ссылочного типа. Результатом конструкции будет значение типа Тип.

Примеры имен типов:

ТИП(Строка)
ТИП(Число)
ТИП( Перечисление.СтавкиНДС )
ТИП( Справочник.Номенклатура )
ТИП( Документ.ПриобретениеТоваровУслуг )
ТИП( ПланСчетов.Хозрасчетный )
ТИП( ПланОбмена.Полный )

Использование в запросе:

Закупки.Регистратор КАК Регистратор ,

КОГДА ТИПЗНАЧЕНИЯ( Закупки.Регистратор ) = ТИП( Документ.ПриобретениеТоваровУслуг )

ТОГДА «Приобретение товаров»

КОНЕЦ КАК ТипИсточника

РегистрНакопления.Закупки КАК Закупки

Оператор ССЫЛКА

Оператор позволяет проверить, является ли значение выражения, указанного справа от него, ссылкой на таблицу, указанную слева. Результат оператора — значение типа Булево.

Закупки.Регистратор КАК Регистратор

РегистрНакопления.Закупки КАК Закупки

Закупки.Регистратор ССЫЛКА Документ.ПриобретениеТоваровУслуг

Для ссылочных таблиц оператор ССЫЛКА является эквивалентом сравнения

Остались вопросы?
Спросите в комментариях к статье.

1 комментарий

Скажите, пжст, для оптимальной производительности что лучше использовать:

ТипЗначения() ИЛИ «Регистартор Ссылка Документ…»?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *