Как в запросе проверить наличие реквизита в документе

Как в запросе проверить наличие реквизита у документа?

Я
   WED

07.07.08 — 14:26

Есть ряд документов, у которых реквизита контрагент нет, а есть документы у которых он есть.

В запросе нужно получить выборку из регистра накопления по регистратору с контрагентом = &Контрагент и без контрагента вовсе…

вобщем в выборке должны быть все расходные на Пупкина, но и все Перемещения (в которм впринципе реквизита контрагент нет) тоже…..

Проблема именно в том, как узнать есть реквизит у документа или нет?

  

Партнерская программа EFSOL Oblako

   Mitriy

1 — 07.07.08 — 14:29

Есть Null?

   GenV

2 — 07.07.08 — 14:29

(0) Через ВЫБОР ССЫЛКА проверяй на тип документов с Контрагентом, для остальных ставь пусто. Выбор в тексте запроса можно сформировать динамически по метаданным.

   WED

3 — 07.07.08 — 14:33

(1) ммм.. может быть, надо проверить
(2) не понял насчет динамического формирования выбора

   WED

4 — 07.07.08 — 14:34

По идее мне надо аналог такого:

Регистратор.Ссылка.Метаданные().Реквизиты.Найти(«Контрагент»)

   Лефмихалыч

5 — 07.07.08 — 14:35

(0) при помощи Метаданные строй текст запроса динамически

   GenV

6 — 07.07.08 — 14:35

(3) Обходишь типы регистратора, проверяешь у них наличие реквизита Контрагент по метаданным, если есть — добавляешь условие на ВЫБОР.

Можно сделать наоборот, если регистраторов без контрагента меньше.

   WED

7 — 07.07.08 — 14:36

(5) Не пойдет, ибо в запросе мне надо получить ВСЕ регистраторы у которых контрагент = Пупкин и плюсом все документы вообще без контрагента…

   WED

8 — 07.07.08 — 14:37

(6) Построение текста запроса отпадает по причине (7)

   acsent

9 — 07.07.08 — 14:37

Контрагент ЕСТЬ NULL ИЛИ Контрагент = &Контрагент

   Mitriy

10 — 07.07.08 — 14:38

(9) Где Док.Контрагент ЕСТЬ NULL ИЛИ Док.Контрагент = &Контрагент

   WED

11 — 07.07.08 — 14:39

(10) Вот и я к тому же пришел только что :)

   BAGER

12 — 07.07.08 — 14:39

Ставь в условие:

ВЫБРАТЬ

   Док.Ссылка,

   Док.Контрагент

ИЗ

   Документ.<Твой документ> КАК Док

ГДЕ

   ЕСТЬNULL(Док.Контрагент, &Контрагент) = &Контрагент

   Mitriy

13 — 07.07.08 — 14:39

Док = Регистратор

   kumena

14 — 07.07.08 — 14:40

при чем сами документы и контрагент в них если запрос по регистру, контрагент в регистр не пишется?

   BAGER

15 — 07.07.08 — 14:42

Смотри условие, а не источник данных

   GenV

16 — 07.07.08 — 14:43

(11) Ну-ну :) Ну и как, не ругается на синтаксическую ошибку, если док без реквизита контрагент?

   Mitriy

17 — 07.07.08 — 14:44

(16) самому попытать слабо?

   GenV

18 — 07.07.08 — 14:53

(17) Мне давно уже не слабо :) Иначе и не писал бы :)

   Лефмихалыч

19 — 07.07.08 — 14:58

(6) чудак человек… невозможно это, если реквзита КОнтрагент у регистратора нет, то при обращении к нему в запросе получишь куй в виде рантайм-ошибки

   Лефмихалыч

20 — 07.07.08 — 14:58

(19) >> (7)

промазал

   BAGER

21 — 07.07.08 — 14:58

Лови обороты за период по контрагенту+без контрагента (это на 1С:Предприятие 8.1):

ВЫБРАТЬ

   ТоварыНаСкладахОбороты.Номенклатура,

   ТоварыНаСкладахОбороты.Регистратор,

   СУММА(ТоварыНаСкладахОбороты.КоличествоОборот) КАК КоличествоОборот,

   СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход,

   СУММА(ТоварыНаСкладахОбороты.КоличествоРасход) КАК КоличествоРасход

ИЗ

   РегистрНакопления.ТоварыНаСкладах.Обороты(&НачДата, &КонДата, Регистратор, ) КАК ТоварыНаСкладахОбороты

ГДЕ

   ЕСТЬNULL(ТоварыНаСкладахОбороты.Регистратор.Контрагент, &Контрагент) = &Контрагент

СГРУППИРОВАТЬ ПО

   ТоварыНаСкладахОбороты.Номенклатура,

   ТоварыНаСкладахОбороты.Регистратор

   Лефмихалыч

22 — 07.07.08 — 15:10

(21) не взлетит в случае (0)

   BAGER

23 — 07.07.08 — 15:31

(22) Ошибаешься, в список попадают ВСЕ документы по указанному контрагенту и ВСЕ документы без реквизита «контрагент»

(19) Никаких ошибок, ибо запрос для документа без контрагента как раз NULL и подставляет
(21) Взлетело, ибо это почти аналог моего запроса :)

Вопрос закрыт.
Спасибо Mitriy
и его (10) Где Док.Контрагент ЕСТЬ NULL ИЛИ Док.Контрагент = &Контрагент

Подскажите как  в запросе можно проверить на наличие реквизита, количество. Дело в том, что в некоторых документах он есть, в некоторых отсутствует, если количество отсутствует выводить нуль.

не прокатит, запрос не выполнится, если в объекте нет реквизита

у тебя имя объекта через переменную в запрос попадает? Тогда формируй текст запроса динамически, в зависимости от наличия реквизита

Находил посты где люди ЕСТЬNULL проверяли и всё было ок

ток у меня чет не получается.

У тебя в собеседовании куча дебильных задач на работу с метаданными.

в этом случае можно через параметр в запрос сунуть проверку Выбор когда &НетКоличества тогда 0 Иначе документ.количество НетКоличества узнай перед запросом

Точняк, такая скука, щас сдохну, всякая херь, ниче интересного в целом.

Спасибо сделал как сказал, а то бы мучился с ЕСТЬNULL

«Док.Ссылка.Сумма» лишнее, достаточно Док.Сумма и вместо выбора можно короче — «ЕСТЬNULL(Док.Сумма, 0) КАК Сумма»

+ Но если в документе нет реквизита «Сумма» — вам запрос не помощник — нет в языке запросов функционала, позволяющего обработать ситуацию обращения к «отсутствующему».

если и только в запросе выбрать все поля (выбрать *), поместить в временную таблицу и работать уже дальше с ней

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

 0 

   

Распечатать

1С 8.3 : Функции ЕстьРеквизитДокумента и ЕстьРеквизитОбъекта

При разработке частенько нужно проверить наличие реквизита в документе или справочнике.

Ниже приведены функции позволяющие проверить наличие заданных реквизитов в объектах конфигурации:

Код 1C v 8.х

 // Позволяет определить есть ли среди реквизитов шапки Объекта реквизит с переданным именем.
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт

МетаданныеОбъекта = Объект.Метаданные();
Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли; 

КонецФункции 

Для документа:

Код 1C v 8.х

 // Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
//
// Параметры: 
//  ИмяРеквизита - строковое имя искомого реквизита, 
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт

Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли; 

КонецФункции

P.S. Посмотрите еще Полезные функции по работе с метаданными

Содержание:

1.      Когда возникает необходимость проверить наличие реквизита 1С?

2.      Как можно получить метаданные объекта 1С?  

1.    Когда возникает необходимость проверить наличие реквизита 1С

Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).

В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)

Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт

            Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);

КонецФункции   

2. Как можно получить метаданные объекта 1С

Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:

через функцию Метаданные() объекта

пример синтаксиса: СправочникСсылка.Метаданные()

                                    ДокументСсылка.Метаданные()

через свойство глобального контекста Метаданные

пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]

                                    Метаданные.Документы.[ИмяДокумента]

Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.

Пример 1

Метаданные = Контрагент.Метаданные();

Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда

            Возврат Ложь;

Иначе

            Возврат Истина;

КонецЕсли;

Пример 2

Функция ПолучитьОрганизацию(Контрагент, Пользователь)

            Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда

                        Возврат Контрагент.Организация;

            Иначе

                        Возврат Пользователь.Организация;

            КонецЕсли;

КонецФункции

Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:

Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).

При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.

Пример синтаксиса:

Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда

            ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);

КонецЕсли;

Специалист компании ООО «Кодерлайн»

Кондренко Анна Сергеевна

Вопрос Как определить программно, существует ли у документа требуемый реквизит

С давних времен в типовых конфигурациях для этого существовала специальная функция.
В конфигурациях последних редакций эта функция стала более универсальной и кроме того стала неожиданно оригинальной, даже эстетически восхитительной.

Так, на сегодня, в 2019 г., эта функция называется ЕстьРеквизитИлиСвойствоОбъекта и располагается в общем модуле ОбщегоНазначенияКлиентСервер. Обращение к функции:

ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "ПериодРегистрацииИсправленногоДокумента")

Сама функция проверки выглядит сейчас (2019 год) так:

// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
//  Объект       - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства;
//  ИмяРеквизита - Строка       - имя реквизита или свойства.
//
// Возвращаемое значение:
//  Булево - Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
	
	КлючУникальности   = Новый УникальныйИдентификатор;
	СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
	ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
	
	Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
	
КонецФункции

В типовых конфигурациях 1С по состоянию на 2010 г. для этой цели использовалась функция, например, «ЕстьРеквизитДокумента» общего модуля «ОбщегоНазначения» и была построена на получении метаданных. Обращение к функции:

Если ОбщегоНазначения.ЕстьРеквизитДокумента("БанковскийСчет", МетаданныеДокумента) Тогда ...

где «БанковскийСчет» — пример наименования искомого реквизита,
«МетаданныеДокумента«:

МетаданныеДокумента = ДокументОбъект.Метаданные();

Сама функция проверки (расположенная в общем модуле «ОбщегоНазначения«):

// Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
//
// Параметры: 
//  ИмяРеквизита - строковое имя искомого реквизита, 
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт
	Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
		Возврат Ложь;
	Иначе
		Возврат Истина;
	КонецЕсли; 

КонецФункции // ЕстьРеквизитДокумента()

Next Post

  • v8

  • Программисту 1C

Ср Ноя 10 , 2010

Примеры работы с регистами сведений см. также в Шпаргалке по программированию для системы 1С:Предприятие 8.2 Оглавление 1. Как из регистра сведений «РасчетчикиЗарплатыОрганизации» получить в виде массива всех расчетчиков зарплаты определенного подразделения организации 2. Как добавить запись в непериодический независимый регистр сведений 3. Как считать содержимое непериодического независимого регистра сведений «СобственныеКонтрагенты» […]

Breaking News

Войти или зарегистрироваться

8.х Как проверить реквизит/Объект метаданных на существование?

Тема в разделе «Конфигурирование на платформе «1С:Предприятие 8″», создана пользователем alp, 17 апр 2010.




0/5,
Голосов: 0
  1. TopicStarter Overlay

    alp

    Offline

    alp
    Опытный в 1С

    Регистрация:
    8 янв 2009
    Сообщения:
    434
    Симпатии:
    0
    Баллы:
    26

    есть Список реквизитов:
    Контрагент
    Договор
    Договор2
    ….
    Как проверить существует ли этот реквизит в объекте?
    подобно методу Выбран() в 77.


    alp,
    17 апр 2010
    #1

  2. mialord

    Offline

    mialord
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.460
    Симпатии:
    53
    Баллы:
    54

    Здраствуйте!

    Если Вы хотите проверить существует ли реквизит у объекта метаданных контрагент, то самый простой способ попытаться его получить через Метаданные() с использованием оператора Попытка … КонецПопытки;


    mialord,
    17 апр 2010
    #2

  3. Stack_G

    Offline

    Stack_G
    Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    29

    Из типовой:

    Код:
    МетаданныеДокумента = ДокументОбъект.Метаданные();
    
    
    Код:
    // Позволяет определить есть ли среди реквизитов шапки документа
    // реквизит с переданным именем.
    //
    // Параметры: 
    //  ИмяРеквизита - строковое имя искомого реквизита, 
    //  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
    //
    // Возвращаемое значение:
    //  Истина - нашли реквизит с таким именем, Ложь - не нашли.
    //
    
    
    Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт
    
    Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
    Возврат Ложь;
    Иначе
    Возврат Истина;
    КонецЕсли; 
    
    КонецФункции // ЕстьРеквизитДокумента()
    

    Переписать под любой объект не составляет труда:

    Код:
    Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт
    
    МетаданныеОбъекта = Объект.Метаданные();
    Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
    Возврат Ложь;
    Иначе
    Возврат Истина;
    КонецЕсли; 
    
    КонецФункции 
    

    Как говорит «начальника форума»: «все украдено до нас» :)


    Stack_G,
    17 апр 2010
    #3
(Вы должны войти или зарегистрироваться, чтобы ответить.)
Показать игнорируемое содержимое
Похожие темы

  1. GRUV

    8.х
    Как проверить существование переменной

    GRUV,
    15 май 2008
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    5
    Просмотров:
    6.698
    BabySG
    20 май 2008

  2. МалышкА

    8.х
    Как созданную в SQL таблицу превратить в объект метаданных 1С 8.2?

    МалышкА,
    8 мар 2014
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    4
    Просмотров:
    849
    Thelearning
    12 мар 2014

  3. man37

    7.7
    Проверить существование файла запросом

    man37,
    21 ноя 2015
    , в разделе: Конфигурирование на платформе «1С:Предприятие 7.7»
    Ответов:
    8
    Просмотров:
    2.765
    man37
    23 ноя 2015

  4. Aidis

    [РЕШЕНО]
    Как проверить существование узла при чтении ФабрикаXDTO

    Aidis,
    27 ноя 2015
    , в разделе: Конфигурирование на платформе «1С:Предприятие 8»
    Ответов:
    3
    Просмотров:
    2.723
    hawksib
    24 сен 2019

Загрузка…
Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Поиск

  • Искать только в заголовках
Сообщения пользователя:

Имена участников (разделяйте запятой).

Новее чем:
  • Искать только в этой теме
  • Искать только в этом разделе
    • Отображать результаты в виде тем

Быстрый поиск

  • Последние сообщения

Больше…

// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
//  Объект       — Произвольный — объект, у которого нужно проверить наличие реквизита или свойства;
//  ИмяРеквизита — Строка       — имя реквизита или свойства.
//
// Возвращаемое значение:
//  Булево — Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт

   КлючУникальности   = Новый УникальныйИдентификатор;
   СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
   ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);

   Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;

КонецФункции

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии