Как в запросе проверить наличие реквизита у документа? |
Я |
07.07.08 — 14:26
Есть ряд документов, у которых реквизита контрагент нет, а есть документы у которых он есть.
В запросе нужно получить выборку из регистра накопления по регистратору с контрагентом = &Контрагент и без контрагента вовсе…
вобщем в выборке должны быть все расходные на Пупкина, но и все Перемещения (в которм впринципе реквизита контрагент нет) тоже…..
Проблема именно в том, как узнать есть реквизит у документа или нет?
1 — 07.07.08 — 14:29
Есть Null?
2 — 07.07.08 — 14:29
(0) Через ВЫБОР ССЫЛКА проверяй на тип документов с Контрагентом, для остальных ставь пусто. Выбор в тексте запроса можно сформировать динамически по метаданным.
3 — 07.07.08 — 14:33
(1) ммм.. может быть, надо проверить
(2) не понял насчет динамического формирования выбора
4 — 07.07.08 — 14:34
По идее мне надо аналог такого:
Регистратор.Ссылка.Метаданные().Реквизиты.Найти(«Контрагент»)
5 — 07.07.08 — 14:35
(0) при помощи Метаданные строй текст запроса динамически
6 — 07.07.08 — 14:35
(3) Обходишь типы регистратора, проверяешь у них наличие реквизита Контрагент по метаданным, если есть — добавляешь условие на ВЫБОР.
Можно сделать наоборот, если регистраторов без контрагента меньше.
7 — 07.07.08 — 14:36
(5) Не пойдет, ибо в запросе мне надо получить ВСЕ регистраторы у которых контрагент = Пупкин и плюсом все документы вообще без контрагента…
8 — 07.07.08 — 14:37
(6) Построение текста запроса отпадает по причине (7)
9 — 07.07.08 — 14:37
Контрагент ЕСТЬ NULL ИЛИ Контрагент = &Контрагент
10 — 07.07.08 — 14:38
(9) Где Док.Контрагент ЕСТЬ NULL ИЛИ Док.Контрагент = &Контрагент
11 — 07.07.08 — 14:39
(10) Вот и я к тому же пришел только что
12 — 07.07.08 — 14:39
Ставь в условие:
ВЫБРАТЬ
Док.Ссылка,
Док.Контрагент
ИЗ
Документ.<Твой документ> КАК Док
ГДЕ
ЕСТЬNULL(Док.Контрагент, &Контрагент) = &Контрагент
13 — 07.07.08 — 14:39
Док = Регистратор
14 — 07.07.08 — 14:40
при чем сами документы и контрагент в них если запрос по регистру, контрагент в регистр не пишется?
15 — 07.07.08 — 14:42
Смотри условие, а не источник данных
16 — 07.07.08 — 14:43
(11) Ну-ну Ну и как, не ругается на синтаксическую ошибку, если док без реквизита контрагент?
17 — 07.07.08 — 14:44
(16) самому попытать слабо?
18 — 07.07.08 — 14:53
(17) Мне давно уже не слабо Иначе и не писал бы
19 — 07.07.08 — 14:58
(6) чудак человек… невозможно это, если реквзита КОнтрагент у регистратора нет, то при обращении к нему в запросе получишь куй в виде рантайм-ошибки
20 — 07.07.08 — 14:58
(19) >> (7)
промазал
21 — 07.07.08 — 14:58
Лови обороты за период по контрагенту+без контрагента (это на 1С:Предприятие 8.1):
ВЫБРАТЬ
ТоварыНаСкладахОбороты.Номенклатура,
ТоварыНаСкладахОбороты.Регистратор,
СУММА(ТоварыНаСкладахОбороты.КоличествоОборот) КАК КоличествоОборот,
СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход,
СУММА(ТоварыНаСкладахОбороты.КоличествоРасход) КАК КоличествоРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачДата, &КонДата, Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
ЕСТЬNULL(ТоварыНаСкладахОбороты.Регистратор.Контрагент, &Контрагент) = &Контрагент
СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОбороты.Номенклатура,
ТоварыНаСкладахОбороты.Регистратор
22 — 07.07.08 — 15:10
(21) не взлетит в случае (0)
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
-
Offline
alp
Опытный в 1С- Регистрация:
- 8 янв 2009
- Сообщения:
- 434
- Симпатии:
- 0
- Баллы:
- 26
есть Список реквизитов:
Контрагент
Договор
Договор2
….
Как проверить существует ли этот реквизит в объекте?
подобно методу Выбран() в 77.
alp,
17 апр 2010
#1 -
Offline
mialord
Модераторы
Команда форума
Модератор- Регистрация:
- 31 июл 2009
- Сообщения:
- 5.460
- Симпатии:
- 53
- Баллы:
- 54
Здраствуйте!
Если Вы хотите проверить существует ли реквизит у объекта метаданных контрагент, то самый простой способ попытаться его получить через Метаданные() с использованием оператора Попытка … КонецПопытки;
mialord,
17 апр 2010
#2 -
Offline
Stack_G
Опытный в 1С- Регистрация:
- 10 дек 2007
- Сообщения:
- 786
- Симпатии:
- 2
- Баллы:
- 29
Из типовой:
Код:МетаданныеДокумента = ДокументОбъект.Метаданные();
Код:// Позволяет определить есть ли среди реквизитов шапки документа // реквизит с переданным именем. // // Параметры: // ИмяРеквизита - строковое имя искомого реквизита, // МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск. // // Возвращаемое значение: // Истина - нашли реквизит с таким именем, Ложь - не нашли. // Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции // ЕстьРеквизитДокумента()
Переписать под любой объект не составляет труда:
Код:Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт МетаданныеОбъекта = Объект.Метаданные(); Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции
Как говорит «начальника форума»: «все украдено до нас»
Stack_G,
17 апр 2010
#3
- Похожие темы
-
8.х
Как проверить существование переменной
GRUV,
15 май 2008, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 5
- Просмотров:
- 6.698
- BabySG
- 20 май 2008
-
8.х
Как созданную в SQL таблицу превратить в объект метаданных 1С 8.2?
МалышкА,
8 мар 2014, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 4
- Просмотров:
- 849
- Thelearning
- 12 мар 2014
-
7.7
Проверить существование файла запросом
man37,
21 ноя 2015, в разделе: Конфигурирование на платформе «1С:Предприятие 7.7»
- Ответов:
- 8
- Просмотров:
- 2.765
- man37
- 23 ноя 2015
-
[РЕШЕНО]
Как проверить существование узла при чтении ФабрикаXDTO
Aidis,
27 ноя 2015, в разделе: Конфигурирование на платформе «1С:Предприятие 8»
- Ответов:
- 3
- Просмотров:
- 2.723
- hawksib
- 24 сен 2019
- Ваше имя или e-mail:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
-
- Искать только в заголовках
- Сообщения пользователя:
-
Имена участников (разделяйте запятой).
- Новее чем:
-
- Искать только в этой теме
- Искать только в этом разделе
- Отображать результаты в виде тем
-
Быстрый поиск
- Последние сообщения
Больше…
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
// Объект — Произвольный — объект, у которого нужно проверить наличие реквизита или свойства;
// ИмяРеквизита — Строка — имя реквизита или свойства.
//
// Возвращаемое значение:
// Булево — Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
КлючУникальности = Новый УникальныйИдентификатор;
СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
КонецФункции