1С 8.3 Проверка реквизита на наличие на форме — Программист 1С Минск. Автоматизация бизнеса.
ПРИМЕРЫ КОДА 1С
Перейти в раздел примеры кода 1С 8.3:

При наличии в конфигурации БСП, желательно использовать метод ЕстьРеквизитИлиСвойствоОбъекта (ссылка выше). Но что делать если конфигурация нетиповая? Вариантов (в зависимости от поставленной задачи) несколько: скопировать метод из БСП, проверить на свойство объекта, проверить через поиск, использовать попытку (не рекомендуется, только как временная заплатка).
Проверка реквизита через свойство объекта в 1С 8.3:
Функция ПроверкаНаСвойствоОбъекта ( Объект , ИмяСвойстваОбъекта ) Экспорт
ЕстьСвойство = Ложь;
СтруктураОбъекта = Новый Структура ( ИмяСвойстваОбъекта , Неопределено);
ЗаполнитьЗначенияСвойств ( СтруктураОбъекта , Объект );
Если СтруктураОбъекта [ ИмяСвойстваОбъекта ] = Неопределено Тогда
СтруктураОбъекта [ ИмяСвойстваОбъекта ] = Ложь;
ЗаполнитьЗначенияСвойств ( СтруктураОбъекта , Объект );
Если СтруктураОбъекта [ ИмяСвойстваОбъекта ] <> Ложь Тогда
ЕстьСвойство = Истина;
КонецЕсли;
Иначе
ЕстьСвойство = Истина;
КонецЕсли;
Возврат ЕстьСвойство ; // Булево
Проверка реквизита через Найти в 1С 8.3:
Функция ПроверитьНаРеквизит ( ИмяРеквизита , МетаданныеДок ) // универсальная функция
// Например ИмяРеквизита=»ДрагМеталлы»;
Если МетаданныеДок . Реквизиты . Найти ( ИмяРеквизита ) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
Функция НайтиДрагМеталлы ( Номенклатура , Материал , ОсновноеСредство ) // пример использования в универсальной обработке
// если реквизит шапки
ИмяРеквизита = «ДрагМеталлы» ;
Если Метаданные . Справочники . Товары . Реквизиты . Найти ( ИмяРеквизита ) <> Неопределено Тогда
Возврат Номенклатура . ДрагМеталлы ;
ИначеЕсли Метаданные . Справочники . Материалы . Реквизиты . Найти ( ИмяРеквизита ) <> Неопределено Тогда
Возврат Материал . ДрагМеталлы ;
ИначеЕсли Метаданные . Справочники . ОсновныеСредства . Реквизиты . Найти ( ИмяРеквизита ) <> Неопределено Тогда
Возврат ОсновноеСредство . ДрагМеталлы ;
Иначе
Возврат Ложь;
КонецЕсли;
// если реквизит таб.части
//Если НЕ ТекущаяСтрока.Свойство(ИмяРеквизита) ИЛИ НЕ ТекущаяСтрока.ДрагМеталлы Тогда
// ЗаполнитьЗначенияСвойств(ТаблицаДок.Добавить(), ТекущаяСтрока); // приёмник, источник
//КонецЕсли;
Как проверить существование реквизита формы 1с
Разбираюсь с поведением управляемой формы.
Выявляется что нужно проверять наличие реквизита у Форма — тип которой УправляемаяФорма.
Так как реквизит появляется при использовании Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты). Как то по передаваемому массиву эти реквизиты видимо создаются.
Подскажите пожалуйста, как проверять есть ли у Форма, тот или иной реквизит ?
Купи у меня наконец синтакс-помощник и уроки по его чтению. Столько вопросов сразу снимется — ты даже не представляешь.
ПолучитьРеквизиты
Форма.ИспользоватьДопСведения = Ложь — то есть реквизит есть
почему он не находится?
Или как правильно искать в этом случае? (3)
Массив реквизитов получил, как определять наличие реквизита? Перебором массива?
проще через по попытку
(5) Так метода никакого нет, проверить есть реквизит или нет.
Можно перебором массива как вариант.
Или попытка, и все?
(5) Как через попытку?
Вот реквизит Форма.ИспользоватьДопСведения, то есть то нет.
То значение, то поле не обнаружено.
И как на него проверять?
Попытка
а = Форма.ИспользоватьДопСведения
ЕстьРеквизит = Истина;
Исключение
ЕстьРеквизит = Ложь;
КонецПопытки;
(8) И это будет считаться нормально?
(9) Да фик знает, но перебором массива с проверкой имени реквизита тоже как-то не то.
(10) Ну не знаю, а что не так? Перебирается массив, и выявляется реквизит.
То есть это лучше (8) ? И правильнее?
(10) перебор коллекции, тем более априори небольшой, да ещё в памяти — совершенно нормальный и очень быстрый вариант.
(8) А вот с этим отлаживать потом тяжко.
(12) То есть функция проверки массива на наличие значения будет лучше?
Ну массив можно в ТЗ запихать. А в ней уже поиском)))
(13) конечно.
Я имел удовольствие отлаживать код который был весь в попытках — то ещё испытание для нервов
(15) пару десятков элементов коллекции переберется за ничтожное время.
А если на форме будут тысячи реквизитов, поверьте, Вам будет не до быстродействия береборщика, хотя время все равно будет ничтожным.
Подскажите пожалуйста, как удалить элемент «ИспользоватьДопСведения» если он есть у формы ?
МассРеквизитов = Форма.ПолучитьРеквизиты();
Для каждого ЭлМасс Из МассРеквизитов Цикл
Если ЭлМасс.Имя = «ИспользоватьДопСведения» Тогда
(17) удалить можно только программно добавленные реквизиты.
Методом ИзменитьРеквизиты
(18) Мне нужно удалить этот реквизит, если он есть, перед методом Форма.ИзменитьРеквизиты(Реквизиты);
так как на нем выходит ошибка, что он не уникален, уже есть у формы. Там не ясное её поведение.
как его удалить подскажите, он вроде как и создается программно
(18) Как удалить именно этот реквизит?
(19) ну дык удали перед проблемной строчкой.
Удаляемые реквизиты это 2 параметр
(21) Эта строчка и есть проблемная
То есть будет так?
МассРеквизитов = Форма.ПолучитьРеквизиты();
Для каждого ЭлМасс Из МассРеквизитов Цикл
Если ЭлМасс.Имя = «ИспользоватьДопСведения» Тогда
Форма.ИзменитьРеквизиты(Реквизиты, «ИспользоватьДопСведения»);
КонецЕсли;
КонецЦикла;
Форма.ИзменитьРеквизиты(Реквизиты);
Там одна ситуация, точнее не одна.
Выходит ошибка что реквизит «ИзменитьДопСведения» не уникальный
и я смотрю по коду, он в Форма, то есть то нет, вот ошибка когда есть.
Как тут правильнеесделать тогда?
Или вот так? Проверяю сейчас это.
Попытка
ЕстьРеквизитИспользоватьДопСведения = Форма.ИспользоватьДопСведения;
Форма.ИзменитьРеквизиты(Реквизиты, «ИспользоватьДопСведения»);
Исключение
Форма.ИзменитьРеквизиты(Реквизиты);
КонецПопытки;
Так ты удали его из массива Реквизиты перед тем, как делается
Форма.ИзменитьРеквизиты(Реквизиты);
ПОПРОБОВАЛ ТАК, НИЧЕГО НЕ РАБОТАЕТ. ПОДСКАЖИТЕ КАК избавиться от реквизита «ИспользоватьДопСведения»
перед строчкой
Попытка
ЕстьРеквизитИспользоватьДопСведения = Форма.ИспользоватьДопСведения;
ЕстьРеквизитИспДопСведения = Истина;
Исключение
ЕстьРеквизитИспДопСведения = Ложь;
КонецПопытки;
Если ЕстьРеквизитИспДопСведения Тогда
УдаляемыйРеквДопСведения = Новый Массив;
УдаляемыйРеквДопСведения.Добавить(Реквизиты[0]);
Форма.ИзменитьРеквизиты(Реквизиты, УдаляемыйРеквДопСведения);
Иначе
Форма.ИзменитьРеквизиты(Реквизиты);
КонецЕсли;
(24) Понял, то есть я не с того конца, пробую решить вопрос.
(23) Коллега, вы изобрели третий вид ЯП. Ещё вчера они были трансляторы и компиляторы. Теперь, благодаря Вам, мир узнал, что код можно выполнять на форуме.
Там Столману замену ищут. У вас с английским тоже хорошо?
(27) Не все не так. Я просто решал не известную мне проблему.
И тема этой главы не есть её решение, там сложилось все по другому.
А тема эта была как путь к решению. Мне нужно было топливо.
Я завел её так как думал, что это одна из идей.
Но это ничего не пригодилось. Там все по другому.
И как я узнаю дальше.
Как проверить существование реквизита формы 1с
Загрузка. Пожалуйста, подождите.

Сообщение сайта
(Сообщение закроется через 2 секунды)
lolmatrix —>
lolmatrix
![]()

Просмотр профиля

Найти сообщения пользователя
24.12.21, 9:28
Здравствуйте 1с 8.3 управляемые формы, хочу проверить есть ли в документе такой реквизит как ОбъектДокумента.ПериодРегистрации, чтобы обойти ситуацию когда его нет. Неопределено не помогает. вылетает ошибка
Поле объекта не обнаружено (ПериодРегистрации)
подскажите пожалуйста как проверить на существование этого реквизита документа я в цикле прохожусь по метаданным, заранее спасибо
спасибо разобрался использовал функцию БСП
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ОбъектДокумента, "ПериодРегистрации")
One —>
One
![]()

Просмотр профиля

Найти сообщения пользователя
25.04.22, 19:34
lolmatrix @ 24.12.21, 10:28 ,
Саму процедуру ЕстьРеквизитИлиСвойствоОбъекта выложите
Сообщение отредактировал Vofka — 26.04.22, 8:48
Wersia44 —>
Wersia44
![]()

Просмотр профиля

Найти сообщения пользователя
04.05.22, 14:19
One @ 25.04.22, 20:34 ,
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
// Объект - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства;
// ИмяРеквизита - Строка - имя реквизита или свойства.
//
// Возвращаемое значение:
// Булево - Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
КлючУникальности = Новый УникальныйИдентификатор;
СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
КонецФункции
Сообщение отредактировал Vofka — 04.05.22, 14:38
Проверка на наличие реквизита в форме
Здравствуйте!
Подскажите как мне сделать проверку в форме на наличие реквизита.
При открытии формы программно создается реквизит и нужно поставить проверку,
если есть такой реквизит пропустить, если нет тогда создает.
Я делаю вот так:
Если ЭтаФорма[НаименованиеРеквизита] = Неопределено Тогда
Сообщить(1);
Иначе
Сообщить(2);
КонецЦикла;
Тут получаю ошибка Поле объекта не обнаружено
По теме из базы знаний
- Проверка обновления измененных конфигураций
- Сравнение ЛЮБЫХ данных ЛЮБЫХ баз (и РИБ, по правилам конвертаций) по контрольным суммам выбранных реквизитов, работающих на платформе 8.3. и выше
- Динамические реквизиты на управляемой форме и передача файла Excel на сервер
- Параметризация печатных форм под контрагентов (подключаемое расширение)
- Проверка документов
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
4. noprogrammer 234 14.10.21 09:39 Сейчас в теме
(1) На текущий момент времени (на сколько я понимаю) нет возможности проверить существование добавленного реквизита кроме как через «попытка\исключение»
2. BullTi 14.10.21 09:37 Сейчас в теме
Посмотрите как работает функция ЗначениеЗаполнено(), скорее всего вам подойдет
3. noprogrammer 234 14.10.21 09:38 Сейчас в теме
(2) Нет, не подойдет, ему нужно не значение реквизита проверить а существует ли сам реквизит (создан или нет)
8. BullTi 14.10.21 09:50 Сейчас в теме
(3) при использовании ЗначениеЗаполнено Для Неопределено и Null всегда возвращается Ложь.
Честно не сталкивался ни разу с проверкой реквизита на форме, думал что если реквизита нет как раз и возвращает Неопределено или Null , могу быть не прав, сам только недавно программист
11. Release 14.10.21 09:55 Сейчас в теме
(8)Насколько я помню, будет вызвано исключение: «поле объекта не существует».
noprogrammer; + 1 – Ответить
13. noprogrammer 234 14.10.21 12:19 Сейчас в теме
(11) Именно так и будет.
5. Release 14.10.21 09:39 Сейчас в теме
ПолучитьРеквизиты (GetAttributes) Синтаксис: ПолучитьРеквизиты() Параметры: (необязательный) Тип: Строка. Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня. Возвращаемое значение: Тип: Массив. Массив объектов РеквизитФормы. Описание: Получает описание реквизитов формы.
Istur; Aliya_St; GV.; Raf_f; Kutuzov; noprogrammer; + 6 – 1 Ответить
6. noprogrammer 234 14.10.21 09:40 Сейчас в теме
(5) точно, совсем забыл про это.
7. soft_wind 14.10.21 09:41 Сейчас в теме
&НаКлиенте Функция ПроверитьРеквизит(ИмяРеквизита) Попытка тест = ЭтаФорма[ИмяРеквизита]; ЕстьРеквизит = Истина; Исключение ЕстьРеквизит = Ложь; КонецПопытки; Возврат ЕстьРеквизит; КонецФункции
9. user1563139 14.10.21 09:53 Сейчас в теме
Спасибо всем! Попытка помогла
10. Release 14.10.21 09:53 Сейчас в теме
Или универсально для любого объекта:
Функция ЕстьСвойствоОбъекта(Объект, ИмяСвойства) Экспорт ЕстьСвоство = Ложь; Структура = Новый Структура(ИмяСвойства, Неопределено); ЗаполнитьЗначенияСвойств(Структура, Объект); Если Структура[ИмяСвойства] = Неопределено Тогда Структура[ИмяСвойства] = Ложь; ЗаполнитьЗначенияСвойств(Структура, Объект); Если Структура[ИмяСвойства] <> Ложь Тогда ЕстьСвоство = Истина; КонецЕсли; Иначе ЕстьСвоство = Истина; КонецЕсли; Возврат ЕстьСвоство; КонецФункции
Не люблю умышленно создавать исключения.
mc2; kabantus; Anatolia; Rataev; Valerianich; Vary; igor_karma; Yury1001; Sanario; fokses; frkbvfnjh; xdt_savon; gofforsk; Aili; romanpolyashov@yandex.ru; independ; wau8824ru; user797130; collider; NeLenin; Kutuzov; 33lab; + 22 – Ответить
24. quisl 24.01.23 03:07 Сейчас в теме
Функция ЕстьСвойствоОбъекта( Знач Объект, ИмяСвойства) Экспорт
ЕстьСвоство = Ложь;
Структура = Новый Структура(ИмяСвойства, Неопределено);
Если Структура[ИмяСвойства] = Неопределено Тогда
Структура[ИмяСвойства] = Ложь;
Если Структура[ИмяСвойства] <> Ложь Тогда
ЕстьСвоство = Истина;
КонецЕсли;
Иначе
ЕстьСвоство = Истина;
КонецЕсли;
Возврат ЕстьСвоство;
КонецФункции
Так получше будет
igor_karma; + 1 – Ответить
25. Release 24.01.23 14:19 Сейчас в теме
(24) Непринципиально вообще. В конкретной реализации данные объекта не изменяются, а только считываются.
12. d.batovskiy 14.10.21 11:55 Сейчас в теме
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным. // // Параметры: // Объект - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства; // ИмяРеквизита - Строка - имя реквизита или свойства. // // Возвращаемое значение: // Булево - Истина, если есть. // Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт КлючУникальности = Новый УникальныйИдентификатор; СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности); ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект); Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности; КонецФункции
andrew_alen; raul19996; Altez50; Renesans; mc2; hcooh; kabantus; avmironov; igmis; user1840125; Valerianich; BlinOFF; silkwey; Pavel_Vladivostok; Demlan; wauri; eufes; zoikins; rusmil; Alex17; redsun; fieryfist; Nihonjin; frkbvfnjh; pavlov_a; katrineKA; eaa; mip128; rpgshnik; Mallok; z.snega; NeLenin; arshanskiyav; tdml; Kutuzov; Sergey_Borisovi4; GRAFin.by; volkov-mv; + 38 – Ответить
