1с проверить существование элемента формы

Универсальная замена метода «Свойство()»


О чем собственно речь

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

Для значений типа «Структура» доступен метод «Свойство()»:

Если же мы попытаемся таким же образом узнать о существовании какого-либо элемента формы или параметра на области макета (как пример), то это вызовет следующую ошибку:

497px error

По подробной информации об ошибке видно, что коллекция элементов управляемой формы (переменная «Элементы») не имеет метода «Свойство()». Тоже самое относится к абсолютому большинству коллекций, которые поддерживает платформа.

Для некоторых коллекций, таких как «КолонкиТабличногоПоля», «КоллекцияЭлементовМетаданных» для использования доступен метод «Найти()», в качестве первого параметра которому предеатеся имя элемента для поиска. Методы возвращают найденный элемент или «Неопределено», если значение не найдено. Таким образом, с помощью метода найти можно унать наличие того или иного свойства для тех коллекций, которые поддерживают работу с ним.

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

Сегодня в статье будет идти речь об универсальном подходе, позволяющим определить наличие свойства у значения любого типа данных 1С:Предприятие 8.x.

Как это реализовать

Предлагаю написать универсальную функцию для определения наличия свойства у любого типа значения и затем перейти к использованию ее на небольшом примере.

Работа предлагаемого подхода основывается на использовании метода «ЗаполнитьЗначенияСвойств()» и переменной с типом «Структура». На следующем листинге приведен програмный код данной функции:

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

Практический пример

В качестве примера в тестовой конфигурации добавим документ «ТестовыйДокумент» с несколькими реквизитами. На его форму добавлены соответствующие элементы формы.

tyr

В поле «Имя элемента» вводится имя элемента формы. По кнопке найти отрабатывает созданная нами ранее функция. После выполнения команды, программа уведомляет пользователя об успешности поиска. На следующем листинге приведен программный код обработчика команды и вызываемая процедура поиска свойств.

Подведем итог

Описанный в статье подход позволяет проверять наличия свойст в коллекциях любого типа. Элементы формы, коллекция метаданных, параметры макета и много другое. Отрицательного влияния на производительность не имеет. Работает на любой версии платформы.

Источник

Как проверить наличие реквизита

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

IT Блог Сергея Бобошко

1С Предприятие, конфигурации, обработки, услуги программиста, помощь программиста

1С Предприятие 8.3 Как проверить наличие реквизита документа или табличной части программно

В типовых конфигурациях это делается просто:

Но если у вас не типовая конфигурация, или же, как я, привыкли работать методами, предоставляемыми платформой по возможности максимально их используя, где это имеет смысл, тогда вот так:

Если реквизит отсутствует, тогда будет возвращено значение неопределено, как будет в случае с реквизитом «БабаЯга» в регистре цен.

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

В случае удачного нахождения реквизита с указанным именем возвращается искомый объект метаданных, иначе, как уже упоминалось — НЕОПРЕДЕЛЕНО,

Добавить комментарий Отменить ответ

В помощь программисту

Спасибо за интерес к моим статьям!

Если Вам понравилась статья, а особенно если я сэкономил вам кучу времени, сил и нервов(!), и Вы хотите поблагодарить автора за труды, можете пожертвовать рублик на один из кошельков автора:
R378379457675
Z428430781167
U266558095968

Ну, или нажмите кнопочку репоста в соцсетях. Или напишите отзыв.

Рубрики

Свежие записи

Благодарность мне

Если Вам понравилась статья, а особенно если я сэкономил вам кучу времени, сил и нервов(!), и Вы хотите поблагодарить автора за труды, можете пожертвовать рублик на один из кошельков автора:
R378379457675
Z428430781167
U266558095968

Ну, или нажмите кнопочку репоста в соцсетях. Или напишите отзыв.

Источник

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

О чем собственно речь

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

Для значений типа «Структура» доступен метод «Свойство()»:

Если же мы попытаемся таким же образом узнать о существовании какого-либо элемента формы или параметра на области макета (как пример), то это вызовет следующую ошибку:

497px error

По подробной информации об ошибке видно, что коллекция элементов управляемой формы (переменная «Элементы») не имеет метода «Свойство()». Тоже самое относится к абсолютому большинству коллекций, которые поддерживает платформа.

Для некоторых коллекций, таких как «КолонкиТабличногоПоля», «КоллекцияЭлементовМетаданных» для использования доступен метод «Найти()», в качестве первого параметра которому предеатеся имя элемента для поиска. Методы возвращают найденный элемент или «Неопределено», если значение не найдено. Таким образом, с помощью метода найти можно унать наличие того или иного свойства для тех коллекций, которые поддерживают работу с ним.

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

Сегодня в статье будет идти речь об универсальном подходе, позволяющим определить наличие свойства у значения любого типа данных 1С:Предприятие 8.x.

Как это реализовать

Предлагаю написать универсальную функцию для определения наличия свойства у любого типа значения и затем перейти к использованию ее на небольшом примере.

Работа предлагаемого подхода основывается на использовании метода «ЗаполнитьЗначенияСвойств()» и переменной с типом «Структура». На следующем листинге приведен програмный код данной функции:

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

Практический пример

В качестве примера в тестовой конфигурации добавим документ «ТестовыйДокумент» с несколькими реквизитами. На его форму добавлены соответствующие элементы формы.

tyr

В поле «Имя элемента» вводится имя элемента формы. По кнопке найти отрабатывает созданная нами ранее функция. После выполнения команды, программа уведомляет пользователя об успешности поиска. На следующем листинге приведен программный код обработчика команды и вызываемая процедура поиска свойств.

Подведем итог

Описанный в статье подход позволяет проверять наличия свойст в коллекциях любого типа. Элементы формы, коллекция метаданных, параметры макета и много другое. Отрицательного влияния на производительность не имеет. Работает на любой версии платформы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выводы

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

inegracia

Мощный инструмент для интеграции и управления интернет-магазином. Его преимуществом, является то, что для начала использования модуля необходимо минимум времени. Все сценарии для различных CMS и различных конфигураций 1С уже заложены в модуле и могут быть использованы большинством интернет-магазинов.

1. Минимум времени для настройки и старта модуля.

2. Простой и понятный интерфейс управления обменами.
Все инструменты для выгрузки, загрузки и управления товарами и заказами.

3. Удобный инструмент для работы Вашего менеджера.

4. Модуль работает как внешнее приложение для 1С, что позволяет выполнять обновления конфигураций в автоматическом режиме.

Цена: 400$ Подробная информация о модуле
Главная arrowПрограммирование arrowОсновные функции arrowПроверка существования реквизита у объекта метаданных
Проверка существования реквизита у объекта метаданных
Написал Валецкий Станислав
При написании универсальных процедур или функций (например проверка заполнения реквизитов перед проведением, или непосредственно проведение документов) возникает проблема, связанная с существованием или несуществованием некоторых реквизитов у объекта (например у документа продажи есть реквизит склад, а у документа перемещение – склад отправитель и склад получатель). Определить существование реквизита можно через метаданные, для этого понадобится вид объекта и имя реквизита.

Для справочников код будет следующий:

Для документов код будет следующий:

Для табличной части документов код будет следующий:

Источник

Проверка на наличие данные в Табличной части справочника упр приложение

&НаКлиенте
Процедура ТранспортныеСредстваПриИзменении(Элемент)
ДобавляемоеТС = Элементы.ТранспортныеСредства.ТекущиеДанные;
Для каждого строка из Объект.ТранспортныеСредства Цикл
Если НЕ строка.ТранспортноеСредство = ДобавляемоеТС.ТранспортноеСредство Тогда
Сообщить(«Такое ТС уже есть в базе»);
КонецЕсли;
КонецЦикла;

КонецПроцедуры
но такое условие выдает мне постоянно что такое ТС есть, мне же нужно, что если уже введено такое ТС, то ошибка летит, иначе нет

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить(«ТранспортноеСредство», ТекДанные.ТранспортноеСредство);
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора);
Для каждого строка из НайденныеСтроки Цикл
Если строка.ТранспортноеСредство = ТекДанные.ТранспортноеСредство Тогда
Сообщить(«такая запись уже есть»);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

При добавлении второй строки, даже до выбора ТС летит ошибка что такое ТС уже есть

ПРоцедура «ПриИзменении» на элементе ТЧ

Дальше через найтиСтроки()

(38) Sevens, вот что получилось:
&НаКлиенте
Процедура ТранспортныеСредстваПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные;
СтрокаТабличнойЧасти = Элементы.ТранспортныеСредства.ТекущаяСтрока;
ПараметрыОтбора = Новый Структура(«ТранспортноеСредство», ТекДанные.ТранспортноеСредство);
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 1 Тогда
Сообщить(«Вводимое ТС уже есть у данного контрагента»);
Объект.ТранспортныеСредства.Удалить(СтрокаТабличнойЧасти);
Возврат
КонецЕсли;
КонецПроцедуры

и летит ошибка:
<Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(275)>: Ошибка при вызове метода контекста (Удалить)
Объект.ТранспортныеСредства.Удалить(СтрокаТабличнойЧасти);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с проверить существование реквизита формы
  • 1с проверить наличие элемента формы