1с проверить наличие поля в структуре

💖 Нравится? Поделись с друзьями ссылкой

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

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

ТестСтруктура = Новый Структура; ТестСтруктура. Вставить(" ТестКлюч " , " ТестЗначение " ) ; ЕстьЗначениеТестКлюч = ТестСтруктура(" ТестКлюч " ) ; // В итоге переменная "ЕстьЗначениеТестКлюч" будет содержать значение ИСТИНА

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

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

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

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

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

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

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

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

// Переменные: // // 2. ИмяСвойства - переменная типа "Строка", содержащая искомое свойство // Функция ПеременнаяСодержитСвойство(Переменная, ИмяСвойства) Если СтруктураПроверка[ ИмяСвойства] = NULL Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли ; КонецФункции

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

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

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

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

& НаКлиенте Процедура НайтиКоманда(Команда) Если ПеременнаяСодержитСвойство(Элементы, ИмяЭлемента) Тогда Предупреждение(" Элемент " " " + ИмяЭлемента + " " " найден! " ) ; Иначе Предупреждение(" Элемент " " " + ИмяЭлемента + " " " НЕ найден! " ) ; КонецЕсли ; КонецПроцедуры // Универсальная функция для проверки наличия свойств у значения любого типа данных // Переменные: // 1. Переменная - переменная любого типа, для которой необходимо проверить наличие свойства // 2. ИмяСвойства - переменная типа "Строка", содержащая искомого свойства // & НаКлиенте Функция ПеременнаяСодержитСвойство(Переменная, ИмяСвойства) // Инициализируем структуру для теста с ключом (значение переменной "ИмяСвойства") и значением NULL СтруктураПроверка = Новый Структура; СтруктураПроверка. Вставить(ИмяСвойства, NULL ) ; // Заполняем созданную структуру из переданного значения переменной ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная) ; // Если значение для свойства структуры осталось NULL, то искомое свойство не найдено, и наоборот. Если СтруктураПроверка[ ИмяСвойства] = NULL Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли ; КонецФункции

Тестовую конфигурация Вы можете скачать по ссылке .

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

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

P.S. По замечанию alcom привожу программный код с использованием GUID"а.

// Универсальная функция для проверки наличия свойств у значения любого типа данных // Переменные: // 1. Переменная - переменная любого типа, для которой необходимо проверить наличие свойства // 2. ИмяСвойства - переменная типа "Строка", содержащая искомое свойства // &НаКлиенте Функция ПеременнаяСодержитСвойство(Переменная, ИмяСвойства) // Инициализируем структуру для теста с ключом (значение переменной "ИмяСвойства") и значением произвольного GUID"а GUIDПроверка = Новый УникальныйИдентификатор; СтруктураПроверка = Новый Структура; СтруктураПроверка.Вставить(ИмяСвойства, GUIDПроверка); // Заполняем созданную структуру из переданного значения переменной ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная); // Если значение для свойства структуры осталось NULL, то искомое свойство не найдено, и наоборот. Если СтруктураПроверка[ИмяСвойства] = GUIDПроверка Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции

Структура и соответствие являются своего рода таблицей, имеющей две колонки: ключ и значение. В колонке "Ключ" хранится индексируемый элемент, по которому производится поиск. Сам элемент поиска находится в поле "Значение". Какой механизм лучше использовать с точки зрения быстродействия поиска? Проведем серию экспериментов.

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

Ниже приведен листинг процедуры для поиска значения по ключу для соответствия и структуры.

Процедура ПоискЗначенияПоКлючу(ДляСоответствия, Ключ) Если ДляСоответствия Тогда Возврат ИскомоеСоответствие[ Ключ] ; Иначе ЗначениеПоиска = Неопределено ; ИскомаяСтруктура. Свойство(Ключ, ЗначениеПоиска) ; Возврат ЗначениеПоиска; КонецПроцедуры

Для первого опыта получены следующие результаты:

Как мы видим, с достаточно большим отрывом выигрывает соответствие. Время поиска для структуры показано примерно в 1/4 раза медленнее.

После второго эксперимента ситуация кардинально изменилась:

Время поиска для соответствия с параметром типа "Строка" в ключе проигрывает структуре практически в два раза.

В ходе третьего эксперимента лидерство вновь захватило соответствие.

Более чем в шесть раз соответствие справилось с этим заданием быстрее.

Таким образом можно делать выводы, что для поиска значений по строковому представлению как нельзя лучше подходит структура, так как этот тип данных специализирован как раз для строковых ключей. Однако при возможности использования других типов для ключа, таких как "Число" или "Ссылка", лучшие результаты показывает соответствие. Ответить с уверенностью почему именно так не представляется возможным, так как система для более глубоких опытов остается закрытой.

Структура в языке программирования 1С 8.3 и 8.2 — набор пар «Ключ» и «Значение». Поле «Ключ» имеет строковый тип, «Значение» же может принимать любой тип данных. Обычно используется для хранения и передачи между процедурами набора каких-либо параметров.

Структуру в языке программирования 1С можно создать двумя способами с помощью конструкции «Новый».

Первый способ:

Структура = Новый Структура;
Структура.Вставить(«КлючПараметра1», «Значения параметра №1»);
Структура.Вставить(«КлючПараметра2», «Значения параметра №2»);

Второй способ:

Структура = Новый Структура(«КлючПараметра1, КлючПараметра2», «Значения параметра №1», «Значения параметра №2»);

Оба способа создадут структуру, которую видно на скриншоте из отладки:

Получите 267 видеоуроков по 1С бесплатно:

Изменение

Добавить или изменить структуру можно, используя метод «Вставить()».

Структура.Вставить(«ИмяКлюча», ЗначениеКлюча);

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

Чтобы удалить элемент коллекции, нужно воспользоваться методом «Удалить», куда передать имя ключа:

Структура.Удалить(«ИмяКлюча»);

Возможна также очистка всех объектов коллекции:

Структура.Очистить();

Обход структуры

Чтобы перебрать коллекцию структуры, нужно использовать конструкцию «Для Каждого КлючИЗначение Из Структура Цикл».

Например:

Для Каждого КлючИЗначение Из Структура Цикл
…… //обрабатываем, например, изменяем значения
КонецЦикла;

В каждом цикле будет видно, что нам доступны следующие поля:



Рассказать друзьям