Перейти в раздел примеры кода 1С 8.3:
При наличии в конфигурации БСП, желательно использовать метод ЕстьРеквизитИлиСвойствоОбъекта (ссылка выше). Но что делать если конфигурация нетиповая? Вариантов (в зависимости от поставленной задачи) несколько: скопировать метод из БСП, проверить на свойство объекта, проверить через поиск, использовать попытку (не рекомендуется, только как временная заплатка).
Проверка реквизита через свойство объекта в 1С 8.3:
Функция ПроверкаНаСвойствоОбъекта(Объект, ИмяСвойстваОбъекта) Экспорт
ЕстьСвойство = Ложь;
СтруктураОбъекта = Новый Структура(ИмяСвойстваОбъекта, Неопределено);
ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);
Если СтруктураОбъекта[ИмяСвойстваОбъекта] = Неопределено Тогда
СтруктураОбъекта[ИмяСвойстваОбъекта] = Ложь;
ЗаполнитьЗначенияСвойств(СтруктураОбъекта, Объект);
Если СтруктураОбъекта[ИмяСвойстваОбъекта] <> Ложь Тогда
ЕстьСвойство = Истина;
КонецЕсли;
Иначе
ЕстьСвойство = Истина;
КонецЕсли;
Возврат ЕстьСвойство;// Булево
КонецФункции
Проверка реквизита через Найти в 1С 8.3:
Функция ПроверитьНаРеквизит(ИмяРеквизита, МетаданныеДок) // универсальная функция
// Например ИмяРеквизита=»ДрагМеталлы»;
Если МетаданныеДок.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Функция НайтиДрагМеталлы(Номенклатура, Материал, ОсновноеСредство) // пример использования в универсальной обработке
// если реквизит шапки
ИмяРеквизита=«ДрагМеталлы»;
Если Метаданные.Справочники.Товары.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат Номенклатура.ДрагМеталлы;
ИначеЕсли Метаданные.Справочники.Материалы.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат Материал.ДрагМеталлы;
ИначеЕсли Метаданные.Справочники.ОсновныеСредства.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда
Возврат ОсновноеСредство.ДрагМеталлы;
Иначе
Возврат Ложь;
КонецЕсли;
// если реквизит таб.части
//Если НЕ ТекущаяСтрока.Свойство(ИмяРеквизита) ИЛИ НЕ ТекущаяСтрока.ДрагМеталлы Тогда
// ЗаполнитьЗначенияСвойств(ТаблицаДок.Добавить(), ТекущаяСтрока); // приёмник, источник
//КонецЕсли;
КонецФункции
Проверка реквизита через Попытка (&НаКлиенте) в 1С 8.3:
&НаКлиенте
Функция ПроверитьНаНаличиеРеквизитаЧерезПопытку(ИмяРеквизита)
Попытка
РеквизитФормыПоИмени = ЭтаФорма[ИмяРеквизита];
ЕстьРеквизитНаФорме = Истина;
Исключение
ЕстьРеквизитНаФорме = Ложь;
КонецПопытки;
Возврат ЕстьРеквизитНаФорме;
КонецФункции
В определенных задачах можно использовать метод в 1С 8.3:
ПолучитьРеквизиты(GetAttributes)
Синтаксис:
ПолучитьРеквизиты(<Путь>)
Параметры:
<Путь> (необязательный)
Тип: Строка.
Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Возвращаемое значение:
Тип: Массив.
Массив объектов РеквизитФормы.
Описание:
Получает описание реквизитов формы.
Copyright©, «Программист 1С в г.Минске», 06.11.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Как проверить наличие реквизита у управляемой формы. |
Я |
18.09.19 — 12:00
Разбираюсь с поведением управляемой формы.
Выявляется что нужно проверять наличие реквизита у Форма — тип которой УправляемаяФорма.
Так как реквизит появляется при использовании Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты). Как то по передаваемому массиву эти реквизиты видимо создаются.
Подскажите пожалуйста, как проверять есть ли у Форма, тот или иной реквизит ?
1 — 18.09.19 — 12:04
Купи у меня наконец синтакс-помощник и уроки по его чтению. Столько вопросов сразу снимется — ты даже не представляешь…
2 — 18.09.19 — 12:04
ПолучитьРеквизиты
3 — 18.09.19 — 12:09
Форма.ИспользоватьДопСведения = Ложь — то есть реквизит есть
почему он не находится?
Форма.ПолучитьРеквизиты().Найти(«ИспользоватьДопСведения») — неопределено
4 — 18.09.19 — 12:11
Или как правильно искать в этом случае? (3)
Массив реквизитов получил, как определять наличие реквизита? Перебором массива?
5 — 18.09.19 — 12:15
проще через по попытку
6 — 18.09.19 — 12:28
(5) Так метода никакого нет, проверить есть реквизит или нет.
Можно перебором массива как вариант.
Или попытка, и все?
7 — 18.09.19 — 12:31
(5) Как через попытку?
Вот реквизит Форма.ИспользоватьДопСведения, то есть то нет.
То значение, то поле не обнаружено.
И как на него проверять?
8 — 18.09.19 — 12:33
Попытка а = Форма.ИспользоватьДопСведения ЕстьРеквизит = Истина; Исключение ЕстьРеквизит = Ложь; КонецПопытки;
9 — 18.09.19 — 12:50
(8) И это будет считаться нормально?
10 — 18.09.19 — 12:55
(9) Да фик знает, но перебором массива с проверкой имени реквизита тоже как-то не то…
11 — 18.09.19 — 12:56
(10) Ну не знаю, а что не так? Перебирается массив, и выявляется реквизит.
То есть это лучше (8) ? И правильнее?
12 — 18.09.19 — 12:57
(10) перебор коллекции, тем более априори небольшой, да ещё в памяти — совершенно нормальный и очень быстрый вариант.
(8) А вот с этим отлаживать потом тяжко.
13 — 18.09.19 — 12:58
(12) То есть функция проверки массива на наличие значения будет лучше?
14 — 18.09.19 — 12:59
Ну массив можно в ТЗ запихать. А в ней уже поиском)))
15 — 18.09.19 — 13:00
(13) конечно.
Я имел удовольствие отлаживать код который был весь в попытках — то ещё испытание для нервов
16 — 18.09.19 — 13:01
(15) пару десятков элементов коллекции переберется за ничтожное время.
А если на форме будут тысячи реквизитов, поверьте, Вам будет не до быстродействия береборщика, хотя время все равно будет ничтожным.
17 — 18.09.19 — 13:04
Подскажите пожалуйста, как удалить элемент «ИспользоватьДопСведения» если он есть у формы ?
МассРеквизитов = Форма.ПолучитьРеквизиты();
Для каждого ЭлМасс Из МассРеквизитов Цикл
Если ЭлМасс.Имя = «ИспользоватьДопСведения» Тогда
КонецЕсли;
КонецЦикла;
18 — 18.09.19 — 13:06
(17) удалить можно только программно добавленные реквизиты.
Методом ИзменитьРеквизиты
19 — 18.09.19 — 13:08
(18) Мне нужно удалить этот реквизит, если он есть, перед методом Форма.ИзменитьРеквизиты(Реквизиты);
так как на нем выходит ошибка, что он не уникален, уже есть у формы. Там не ясное её поведение.
как его удалить подскажите, он вроде как и создается программно
20 — 18.09.19 — 13:09
(18) Как удалить именно этот реквизит?
21 — 18.09.19 — 13:09
(19) ну дык удали перед проблемной строчкой.
Удаляемые реквизиты это 2 параметр
22 — 18.09.19 — 13:12
(21) Эта строчка и есть проблемная
Форма.ИзменитьРеквизиты(Реквизиты);
То есть будет так?
МассРеквизитов = Форма.ПолучитьРеквизиты();
Для каждого ЭлМасс Из МассРеквизитов Цикл
Если ЭлМасс.Имя = «ИспользоватьДопСведения» Тогда
Форма.ИзменитьРеквизиты(Реквизиты, «ИспользоватьДопСведения»);
КонецЕсли;
КонецЦикла;
Форма.ИзменитьРеквизиты(Реквизиты);
Или я не пойму ((((
Там одна ситуация, точнее не одна.
На строке
Форма.ИзменитьРеквизиты(Реквизиты);
Выходит ошибка что реквизит «ИзменитьДопСведения» не уникальный
и я смотрю по коду, он в Форма, то есть то нет, вот ошибка когда есть.
Как тут правильнеесделать тогда?
23 — 18.09.19 — 13:20
Или вот так? Проверяю сейчас это.
Попытка
ЕстьРеквизитИспользоватьДопСведения = Форма.ИспользоватьДопСведения;
Форма.ИзменитьРеквизиты(Реквизиты, «ИспользоватьДопСведения»);
Исключение
Форма.ИзменитьРеквизиты(Реквизиты);
КонецПопытки;
24 — 18.09.19 — 13:37
Так ты удали его из массива Реквизиты перед тем, как делается
Форма.ИзменитьРеквизиты(Реквизиты);
25 — 18.09.19 — 13:37
ПОПРОБОВАЛ ТАК, НИЧЕГО НЕ РАБОТАЕТ. ПОДСКАЖИТЕ КАК избавиться от реквизита «ИспользоватьДопСведения»
перед строчкой
Форма.ИзменитьРеквизиты(Реквизиты);
/////////////////////////////////////////////////
Попытка
ЕстьРеквизитИспользоватьДопСведения = Форма.ИспользоватьДопСведения;
ЕстьРеквизитИспДопСведения = Истина;
Исключение
ЕстьРеквизитИспДопСведения = Ложь;
КонецПопытки;
Если ЕстьРеквизитИспДопСведения Тогда
УдаляемыйРеквДопСведения = Новый Массив;
УдаляемыйРеквДопСведения.Добавить(Реквизиты[0]);
Форма.ИзменитьРеквизиты(Реквизиты, УдаляемыйРеквДопСведения);
Иначе
Форма.ИзменитьРеквизиты(Реквизиты);
КонецЕсли;
26 — 18.09.19 — 13:38
(24) Понял, то есть я не с того конца, пробую решить вопрос.
Сейчас попробую.
27 — 18.09.19 — 14:06
(23) Коллега, вы изобрели третий вид ЯП. Ещё вчера они были трансляторы и компиляторы. Теперь, благодаря Вам, мир узнал, что код можно выполнять на форуме.
Там Столману замену ищут. У вас с английским тоже хорошо?
falselight
28 — 18.09.19 — 16:42
(27) Не все не так. Я просто решал не известную мне проблему.
И тема этой главы не есть её решение, там сложилось все по другому.
А тема эта была как путь к решению. Мне нужно было топливо.
Я завел её так как думал, что это одна из идей.
Но это ничего не пригодилось. Там все по другому.
И как я узнаю дальше.
Проверяет наличие свойства по идентификатору и получает его значение
Синтаксис
Метод Свойство()
имеет следующий синтаксис:
Булево Свойство(Ключ, [Значение = Неопределено])
А также альтернативный англоязычный синтаксис:
boolean Property(Key, [Value = Undefined])
Параметры
Описание параметров метода Свойство()
:
Имя параметра* | Тип | Описание |
---|---|---|
Ключ | Строка | Идентификатор свойства |
Значение | Произвольный | В данный параметр возвращается найденное значение.
Значение по умолчанию: |
*Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Булево
Истина | — ключ найден |
Ложь | — ключ не найден |
Описание
Метод Свойство()
проверяет наличие свойства по его ключу (идентификатору) и помещает его значение в параметр Значение
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример использования
Пример кода с использованием метода Свойство()
:
Структура = Новый Структура; //... Если Структура.Свойство("Код") = Ложь Тогда Структура.Вставить("Код", 100); КонецЕсли; //... Значение = Неопределено; Если Структура.Свойство("Код", Значение) Тогда Сообщить("Значение = " + Значение); КонецЕсли; //Значение = 100
Поделиться страницей в соц.сетях
Содержание:
1. Когда возникает необходимость проверить наличие реквизита 1С?
2. Как можно получить метаданные объекта 1С?
1. Когда возникает необходимость проверить наличие реквизита 1С
Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).
В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт
Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
КонецФункции
2. Как можно получить метаданные объекта 1С
Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:
через функцию Метаданные() объекта
пример синтаксиса: СправочникСсылка.Метаданные()
ДокументСсылка.Метаданные()
через свойство глобального контекста Метаданные
пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]
Метаданные.Документы.[ИмяДокумента]
Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.
Пример 1
Метаданные = Контрагент.Метаданные();
Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
Пример 2
Функция ПолучитьОрганизацию(Контрагент, Пользователь)
Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда
Возврат Контрагент.Организация;
Иначе
Возврат Пользователь.Организация;
КонецЕсли;
КонецФункции
Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:
Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).
При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.
Пример синтаксиса:
Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда
ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);
КонецЕсли;
Специалист компании ООО «Кодерлайн»
Кондренко Анна Сергеевна
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
[Практика программирования] Управляемые формы 1С 8: как программно определить основной реквизит формы
Среди зарезервированных методов и функций 1С 8 на момент написания данной публикации (последний релиз платформы 8.3.20) до сих пор отсутствует код, который бы позволял получить или определить, какой из реквизитов управляемой формы является основным.
Основной реквизит формы в списке реквизитов выделяется жирным шрифтом. Не будем в этом тексте описывать всю суть относительно основного реквизита управляемой формы в 1С, достаточно обратиться к статье на эту тему: «Основной реквизит формы 1С 8».
Необходимость определять основной реквизит управляемой формы возникла в рамках прикладной задачи, которая выразилась в доработке по реализации механизма «печать по умолчанию» в формах документов и справочников, как это было в типовых конфигурациях, работающих в режиме обычного приложения. И, как показала практика, поиск основного реквизита формы возможен и в других прикладных задачах. Поэтому можно найти обсуждения по этому вопросу начиная с 2012 года, например в обсуждении на форуме программирования 1С «Можно ли программно узнать основной реквизит управляемой формы?». Из близких по сути вопроса функций подходит только «Форма.ПолучитьРеквизиты()», но она не является решением, т.к. она только возвращает список всех реквизитов формы, представленный в виде коллекции значений типа «Массив». Проблема отсутствия в коде предопределенной процедуры или функции языка программирования 1С сохраняется. Поэтому не остается ничего, как только с помощью дополнительного кода описать поиск основного реквизита. Исходник кода был найден на странице форума mista. Благодаря тому, что с помощью «ПолучитьРеквизиты()» можно получить список реквизитов формы, а каждый реквизит имеет свойства «Заголовок» типа «Строка», «Имя» типа «Строка», «Путь» типа «Строка», «Сохраняемые данные» типа «Булево», «Тип значения» типа «ОписаниеТипов», становится возможным с помощью кода, пример которого приведен ниже определить основной реквизит управляемой формы в 1С 8:
Реквизиты = Форма.ПолучитьРеквизиты();
Для Каждого Реквизит Из Реквизиты Цикл
Если ТипЗнч(Форма[Реквизит.Имя]) = Тип(«ДанныеФормыСтруктура») ИЛИ
ТипЗнч(Форма[Реквизит.Имя]) = Тип(«ДинамическийСписок») Тогда
Возврат Реквизит.Имя;
КонецЕсли;
КонецЦикла;
Решение базируется на том основании, что в зачастую в типовых решениях 1С 8 основным реквизитом формы является либо реквизит типа «ДанныеФормыСтруктура», либо «ДинамическийСписок». Конечно, в нетиповых решениях или даже в вручную сконфигурированных формах ситуация может быть другой и тогда нужно придумывать еще другой вариант поиска с помощью кода. Но это будет встречаться крайне редко.
Оцените, оказалась ли эта публикация полезна для Вас?
© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
10-05-2022
Журавлев А.С.
(Сайт azhur-c.ru)
Назад