Форма клиентского приложения 1с проверить наличие реквизита

Наличие реквизита формы проверить

Я
   seraf

08.10.20 — 09:36

Привет, я что-то не пойму, если мне на клиенте нужно проверить существует ли у формы реквизит, единственный способ обратиться на сервер с Форма.ПолучитьРеквизиты() или использовать Попытку на Клиенте?

Как-то еще можно не обращаясь на сервер и не перебирая в цикле реквизиты

  

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

   Галахад

1 — 08.10.20 — 09:51

Вот такой костыль есть. Довольно универсальный:

http://catalog.mista.ru/1c/articles/1100169/

   seraf

2 — 08.10.20 — 10:02

годно, спасибо, хотя для разового применения подмывает попытку использовать)

   H A D G E H O G s

3 — 08.10.20 — 10:03

Это не костыль, а нормальное решение, используемое в типовых.

   Галахад

4 — 08.10.20 — 10:13

(3) Как автор назвал, так будет называться. )

   seraf

5 — 08.10.20 — 10:32

Но подождите, РеквизитыДокумента = Метаданные.Документы.ТестовыйДокумент.Реквизиты;

это я могу выполнить только на сервере же

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

   seraf

6 — 08.10.20 — 10:42

Я получаю с клиента в ОМ на клиенте ФормаКлиентскогоПриложения, в котором реквизиты. Как мне определить их наличие не обращаясь к серверу и не перебирая цикл?

   Галахад

7 — 08.10.20 — 11:00

(5) Не работает что-ли?

   seraf

8 — 08.10.20 — 11:11

а как должно работать, я получаю на клиент форму клиентского приложения и должен передать её метаданные в ПеременнаяСодержитСвойство(Переменная, ИмяСвойства)

но Метаданные работает только на сервере

а уйдя на сервер я уже могу и ПолучитьРеквизиты() выполнить

   Галахад

9 — 08.10.20 — 11:13

(8) Попробуй передать форму.

   seraf

10 — 08.10.20 — 11:30

(9) я понял как работает, благодарю

  

Сияющий в темноте

11 — 08.10.20 — 16:17

а экспортная переменная на клиенте в модуле формы так тоже проявится

а она совсем не реквизит.

Быстрый старт в Python для 1С Разработчиков | 1s-to-python.ru

Содержание:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример 1

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

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

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

Иначе

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

КонецЕсли;

Пример 2

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

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

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

            Иначе

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

            КонецЕсли;

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

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

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

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

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

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

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

КонецЕсли;

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

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

Перейти в раздел примеры кода 1С 8.3:

При наличии в конфигурации БСП, желательно использовать метод ЕстьРеквизитИлиСвойствоОбъекта (ссылка выше). Но что делать если конфигурация нетиповая? Вариантов (в зависимости от поставленной задачи) несколько: скопировать метод из БСП, проверить на свойство объекта, проверить через поиск, использовать попытку (не рекомендуется, только как временная заплатка).

Проверка реквизита через свойство объекта в 1С 8.3:

Функция ПроверкаНаСвойствоОбъекта(Объект, ИмяСвойстваОбъекта) Экспорт

   ЕстьСвойство = Ложь;
   СтруктураОбъекта = Новый Структура(ИмяСвойстваОбъекта, Неопределено);
   ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);

   Если СтруктураОбъекта[ИмяСвойстваОбъекта] = Неопределено Тогда
       СтруктураОбъекта[ИмяСвойстваОбъекта] = Ложь;
       ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);
       Если СтруктураОбъекта[ИмяСвойстваОбъекта] <> Ложь Тогда
           ЕстьСвойство = Истина;
       КонецЕсли;
   Иначе
       ЕстьСвойство = Истина;
   КонецЕсли;

   Возврат ЕстьСвойство;// Булево

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

Проверка реквизита через Найти в 1С 8.3:

Функция ПроверитьНаРеквизит(ИмяРеквизита, МетаданныеДок) // универсальная функция

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

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

Функция НайтиДрагМеталлы(Номенклатура, Материал, ОсновноеСредство) // пример использования в универсальной обработке

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

   // если реквизит таб.части
   //Если НЕ ТекущаяСтрока.Свойство(ИмяРеквизита) ИЛИ НЕ ТекущаяСтрока.ДрагМеталлы Тогда
   //    ЗаполнитьЗначенияСвойств(ТаблицаДок.Добавить(), ТекущаяСтрока); // приёмник, источник
   //КонецЕсли;

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

Проверка реквизита через Попытка (&НаКлиенте) в 1С 8.3:

&НаКлиенте
Функция ПроверитьНаНаличиеРеквизитаЧерезПопытку(ИмяРеквизита)

   Попытка
       РеквизитФормыПоИмени = ЭтаФорма[ИмяРеквизита];
       ЕстьРеквизитНаФорме = Истина;
   Исключение
       ЕстьРеквизитНаФорме = Ложь;
   КонецПопытки;

   Возврат ЕстьРеквизитНаФорме;

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

В определенных задачах можно использовать метод в 1С 8.3:

ПолучитьРеквизиты(GetAttributes)

Синтаксис:

ПолучитьРеквизиты(<Путь>)

Параметры:

<Путь> (необязательный)

Тип: Строка.

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

Возвращаемое значение:

Тип: Массив.

Массив объектов РеквизитФормы.

Описание:

Получает описание реквизитов формы.

Copyright©, «Программист 1С в г.Минске», 06.11.2021

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

 0 

   

Распечатать

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

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

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

Код 1C v 8.х

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

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

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

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

Код 1C v 8.х

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Next Post

  • v8

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

Ср Ноя 10 , 2010

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

Breaking News

рубрики: Платформа 8.3 | Дата: 12 июля, 2018

Одной из стандартных задач при работе с формами различных объектов является проверка реквизитов формы на заполненность.
Рассмотрим несколько способов проверки заполненности реквизитов на форме. Рассматривать будем на примере элемента справочника.

Проверка средствами платформы

Как правило у различных объектов метаданных (справочники, документы и т.д.) часть реквизитов обязательны к заполнению. Это могут быть как стандартные реквизиты, например, для справочника наименование и код, так и реквизиты созданные в процессе конфигурирования. Для таких реквизитов свойство «Проверка заполнения» обычно устанавливается в значение «Выдавать ошибку»
Проверка заполнения
Кроме этого в свойствах самой формы должен быть установлен флаг Проверять Заполнение Автоматически
Форма. Проверять автоматически
Это позволяет выполнять проверку средствами платформы в момент записи объекта без написания дополнительного кода. Давайте посмотрим как это работает в режиме предприятия.
Ошибка в режиме предприятия
При выполнении такой проверки платформа осуществляет вызов предопределенной процедуры ОбработкаПроверкиЗаполненияНаСервере(), расположенной в модуле формы, а затем и вызов процедуры ОбработкаПроверкиЗаполнения(), которая находится уже в модуле объекта, если конечно эти процедуры имеются в наличии. И как мы видим организация такого рода проверки занимает минимальное количество усилий.

Программная проверка реквизитов с флагом «Выдавать ошибку»

Для реквизитов у которых свойство «Проверка заполнения» установлено в значение «Выдавать ошибку» достаточно легко можно организовать программную проверку буквально одной строчкой кода c помощью метода ПроверитьЗаполнение():


&НаСервере
Процедура ПроверитьРеквизитыНаСервере()

	ПроверитьЗаполнение();

КонецПроцедуры

В отличие от предыдущего способа (когда проверка происходит в момент записи), мы можем вызвать данную проверку в любом месте своего кода. И точно также как и в предыдущем случае будут выполнены процедуры ОбработкаПроверкиЗаполненияНаСервере() и ОбработкаПроверкиЗаполнения()

Программная проверка реквизитов

И конечно же мы всегда можем программно проверить заполненность реквизитов вне зависимости от значения свойства «Проверка заполнения». В самом простейшем случае с помощью метода ЗначениеЗаполнено():


Если НЕ ЗначениеЗаполнено(Поставщик) Тогда

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Не заполнен поставщик";
	Сообщение.Сообщить();

КонецЕсли;

Давайте теперь попробуем разобраться в каком из предопределенных модулей лучше выполнять проверку, когда речь идет о записи объекта. Если мы обратимся к схеме событий при проведении документа, то увидим, что логично будет выполнить проверку до начала транзакции. То есть это следующие предопределенные процедуры:

  • Модуль формы. ПередЗаписью()
  • Модуль формы. ОбработкаПроверкиЗаполненияНаСервере()
  • Модуль объекта. ОбработкаПроверкиЗаполнения()
  • Модуль формы. ПередЗаписьюНаСервере()

Как правило проверка реквизитов выполняется в предопределенной процедуре модуля объекта ОбработкаПроверкиЗаполнения(). По умолчанию она выглядит следующим образом:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

КонецПроцедуры

Здесь ПроверяемыеРеквизиты — это массив с именами реквизитов, которые подлежат проверке. Тип элементов массива — строка. Естественно, что платформа автоматически добавляет в этот массив имена реквизитов для которых установлено свойство «Выдавать ошибку». Но мы можем программно добавлять или удалять элементы массива и таким образом менять перечень проверяемых реквизитов:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

	ПроверяемыеРеквизиты.Добавить("Поставщик");

КонецПроцедуры

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

Выводы

Из всего вышесказанного можно сделать вывод, что выбирать способ проверки заполненности реквизитов нужно для каждого случая индивидуально, но по возможности лучше возлагать эту обязанность на саму платформу.

Делаю отчет вида № пп  Документ  Коментарий в документе Документы выбирает пользователь из списка всех документов в базе. Я думаю, что реквизит «Коментарий» бует не во всех документах. По этому хочу сделать проверку на предмет того, есть ли вообще такой реквизит на форме. Если есть — то печатать отчет. Если нет — обломать пользователя :) Может кто подскажет как такую проверку сделать? //ТиС 7.7 //В отчете в основном будет ПКО и РКО.

Вообщето в ТиС как и многих типовых — Комментарий — общи

Комментарий Синтаксис: Метаданные.Документ(х).Комментарий Метаданные.Документ(ВидДока).Комментарий Назначение:  Запрос комментария х-того дока в конфигурации. Возвращаемое значение  Строка — комментарий дока

Ну вы блин даете… (с) х/ф ЗЫ: Тады может так Метаданные.ОбщийРеквизитДокумента(«Комментарий»).Выбран Метаданные.Документ(ВидДока).РеквизитШапки(«Комментарий»).Выбран

Можно попробовать: Попытка —— ЗЫ Не путаешь реквизит формы и реквизит документа?

Наверное таки он имеет в виду реквизит комментарий. :-)

(6,8) фиг его знает … я из питовского алса копипастю…

Спасибо за ответы. Когда мы в программе открываем ПКО и начинаем его заполнять, там есть строчка — Коментарий.  Это реквизит формы? Или документа? Наверное я путаю эти понятия…

Кстати ежели автор точно имеет виду «реквизит на форме», то обломается… ;-)

Прямо на форме это элемент диалога, связанный с каким-нибудь реквизитом документа… или не связанный.   ;-)

Это комментарий ВидаДокумента Скорее всего документа, раз речь о ТиС Почему? (см7)

Открой в конфигураторе и посмотри на ветках присутствие реквизита «Комментарий». Список возможных веток:

Эт получение комментария, который написан в конфигурации для объекта метаданных, тама же где и Идентификатор с Синонимом

«Почему? (см7)» 1. Уточняю, черем метаданные обламается. 2. По контексту в видно что делается это не в контексте формы документа.

Если это общий реквизит документа, то забей и не проверяй. Если конечно не делаешь универсальный отчет :)

Отчет будет использоваться для ПКО и РКО (причем выбираются только не проведенные доки), но если юзверь захочет посмотреть другие доки и полезут ошибки (типа не найден такой реквизит (Коментарий), они же ко мне побегут… Хотелось бы сделать все красиво.

Читай внимательно всю ветку с самого начала — ответы ужу давно даны. и как проверить че у тя эт за реквизит и как программно поставить затычку

На такую конструкцию: Прога ругается вот так: Камент=Метаданные.ОбщийРеквизитДокумента(ТекДок).Комментарий; : Значение не представляет агрегатный объект (Комментарий) Что я не так указал? //ТекДок — текущий документ в цикле

Объясни еще раз, чего тебе надо? Проверить наличие реквизита у документа ИЛИ наличие реквезита на форме?

Метаданные.ОбщийРеквизитДокумента(«Комментарий»).Выбран = 1 //Есть реквизит

В конфугураторе я выбираю Документы-ПКО. Дальше есть кнопка «Форма» А там уже есть «Коментарий» Что это форма или коментарий? А как после проверки «Сообщить» этот камент?

Если Метаданные.ОбщийРеквизитДокумента(«Комментарий»).Выбран = 1 Тады    Сообщить(ВыбДок.ПолучитьАтрибут(«Комментарий»)) Конесс…

Это реквизит документа, выведенный на форму. Но может быть, что реквизит у документа есть, но на форму он не выведен. Т.е. в реквизит можно программно складывать/считывать информацию, но интерактивно юзер её не введет. В твоем случае, тебя интересует наличие реквизита документа, чтобы к нему можно было обратиться без ошибки…

+32 Однако, если «комментарий» — это общийРеквизит, тогда проверка не требуется, т.е. Общий — значит есть у всех документов. Можешь смело к нему обращаться.

А вот если тебе нужно проверить именно его наличие на форме, тогда сложнее

Всем большое спасибо!!! Заработало. Теперь буду под себя дорабатывать.

мдя… 45 минут на 2 строчки кода…. ну блин и скорость….

Ну, учится человек, что привязался? ;))

Ну не все же гуру :) Некоторые еще только учатся :)

проверяет реквизит формы…

а если внутри транзакции? :)

40 А смысл обращаться к реквииту формы вне контекста… Он же не сохраняется… ;)

Поиск смысла — уже другая задача :)))

Тэги:

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

Понравилась статья? Поделить с друзьями:
  • Часы работы сбербанка в анжеро судженске на софьи перовской
  • Форма обращения в управляющую компанию по электронной почте
  • Часы работы кардиоцентра в твери на комсомольском проспекте
  • Часы работы сбербанка в архангельске на сульфате расписание
  • Форма согласия на раскрытие налоговой тайны для it компаний