1с проверить наличие свойства

Обновлено: 04.07.2024

Особенности использования проверки конфигурации

Механизм проверки конфигурации позволяет выявить ошибки, которые не являются критичными для функционирования прикладного решения в принципе, но наличие которых может существенно снизить скорость работы прикладного решения или даже привести к возникновению ошибок при работе в некоторых специальных режимах.
Выполнение данных проверок не является обязательным (как, например, в случае синтаксического контроля), но является желательным, например, для проверки конфигурации перед поставкой заказчику, перед выпуском тиражного решения, для проверки после массированного удаления объектов или после объединения конфигураций.
Механизм проверки конфигурации включает в себя несколько тестов. Часть этих тестов доступна и в других режимах конфигуратора, а остальные специально разработаны для этого механизма.
Рассмотрим особенности этих тестов:

Проверка логической целостности конфигурации

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

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

Поиск некорректных ссылок

Конфигурация на платформе 1С:Предприятие 8.1 представляет собой набор взаимосвязанных объектов. Каждый объект определяется его свойствами. Эти свойства могут содержать ссылки на другие объекты метаданных.

Ссылки бывают прямые (например, свойство справочника ОсновнаяФорма ссылается на объект метаданных Форма ) или косвенные. К косвенным относятся, например, ссылки на типы, относящиеся к объекту метаданных, например СправочникСсылка.Номенклатура или ссылки на предопределенные значения объекта.

Свойства объектов метаданных можно разделить на простые и сложные. К простым, например, относятся Имя , Синоним , Тип , ОсновнаяФорма и другие. Сложными свойствами являются Форма , Макет , Интерфейс , Права , СправочнаяИнформация .

Логика работы платформы 1С:Предприятие 8.1 построена таким образом, что наличие некорректных (неразрешимых) ссылок в простых свойствах в режиме 1С:Предприятие не допускается. При стандартных операциях редактирования, конфигуратор не позволит возникнуть таким ссылкам.

Например, нельзя удалить форму, если ссылка на нее содержится в свойстве справочника.

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

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

Например, в форме окажется поле ввода не связанное с данными или в справочной информации будет "переход в никуда".

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

Ниже приведены некоторые рекомендации, которые могут помочь в данном процессе.

Неразрешимые ссылки в справочной информации

Если неразрешимые ссылки обнаружены в модуле справки, то для их локализации и исправления следует проверить работоспособность всех ссылок, находящихся в указанном модуле.

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

Некорректные ссылки в формах объектов

Если неразрешимые ссылки обнаружены в форме объекта, то для их локализации прежде всего следует проверить на непустое значение свойства формы и свойства элементов формы (например такие свойства, как Цвет , Шрифт , Рамка и т.д.). Для табличного поля следует также проверить свойства колонок и элементов управления, расположенных в колонках.

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

Для исправления такой ссылки следует либо задать для свойства необходимое значение, либо очистить значение (что приведет к установке значения Авто ).

Также довольно распространенным случаем некорректных ссылок может быть неправильный перечень реквизитов объекта в свойстве формы Сохраняемые значения . Для исправления таких ссылок необходимо открыть окно настройки этого свойства, и ничего не меняя нажать ОK .

Также следует проверять связи с данными. Например, для свойств Связь по владельцу и Связь по типу нужно убедиться, что в окне формы настройки связи будет выбрано конкретное значение. Если нет - нужно заново выбрать нужное значение.

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

Для автоматизации поиска неразрешимых ссылок можно использовать Проверку конфигурации (команда Конфигурация - Проверка конфигурации в Конфигураторе).

Общие рекомендации

Самый лучший способ борьбы с неразрешимыми ссылками - по возможности не допускать их появления.

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

Синтаксический контроль модулей

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

Конфигурация может исполняться в двух сеансах - клиентского приложения и внешнего соединения. Кроме этого, конфигурация может быть развернута в файловом варианте и клиент-серверном варианте. Различия режимов определяются составом объектов и их свойств. Не все объекты доступны при исполнении на сервере 1С:Предприятия и в режиме внешнего соединения.

Все модули, с точки зрения режимов исполнения, можно разделить на 5 групп. Это общие модули, модуль приложения, модуль внешнего соединения, модули хранимых объектов (обобщенное название, сюда относятся модули объектов, наборов записей) и модули форм.
Общие модули могут выполняться на клиенте, на сервере и в режиме внешнего соединения. Доступность конкретного общего модуля в каждой из этих сред определятся соответствующим свойством.
Модуль приложения всегда исполняется на клиенте.
Модуль внешнего соединения всегда исполняется в режиме внешнего соединения.
Модули хранимых объектов могут исполняться везде. Это зависит того, где был создан соответствующий объект.
Модули форм всегда исполняются только на клиенте.

Важной особенностью 1С:Предприятия 8.1 являются различия между файловым вариантом работы и клиент-серверным. В файловом варинате для всех исполняемых модулей доступен контекст как сервера так и клиента или внешнего соединения, в зависимости от типа сеанса. То есть, даже если у общего модуля в свойствах указано исполнение только на сервере, в файловом варианте работы в нем можно создавать объекты, доступные только на клиенте. Однако при развертывании данной конфигурации в режиме клиент-сервер, выполнение подобного модуля приведет к ошибке.

Для выявления подобных "тонких" случаев, механизм проверки конфигурации предоставляет проверки модулей во всех пяти вариантах среды исполнения.

Работа клиентского приложения

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

Работа внешнего соединения

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

Среди наиболее часто встречающихся ошибок при тестировании работы в режиме внешнего соединения, можно выделить следующие:

Вызов метода глобального контекста, который не может быть использован в режиме внешнего соединения (например, ВвестиЗначение() ); Использование свойства глобального контекста, которое не может быть использовано в режиме внешнего соединения (например, РабочаяДата ); Создание объекта, который не может быть использован в режиме внешнего соединения (например, Цвет );

Для исправления подобных ошибок следует использовать разрешенные методы, свойства и объекты.

Вызов процедур общего модуля, для которого не установлено свойство использования во внешнем соединении. Использование переменных, определенных в модуле приложения;

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

Работа клиентского приложения в режиме клиент-сервер

Синтаксический контроль модулей в режиме эмуляции сеанса клиентского приложения в клиент-серверном варианте.

Работа внешнего соединения в режиме клиент-сервер

Синтаксический контроль модулей в режиме эмуляции сеанса внешнего соединения в клиент-серверном варианте.

Работа сервера 1С:Предприятия

Синтаксический контроль модулей в режиме эмуляции среды сервера 1С:Предприятия.

Среди наиболее часто встречающихся ошибок при тестировании работы на сервере 1С:Предприятия, можно выделить следующие:

Вызов метода глобального контекста, который не может быть использован на сервере (например, Предупреждение() ); Создание объекта, который не может быть использован на сервере (например, Цвет);

Для исправления подобных ошибок следует использовать разрешенные методы, свойства и объекты.

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

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

  • Использование переменных, определенных в модуле приложения;

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

Например: Переменная модуля приложений - глТекущийПользователь и ПараметрСеанса - ТекущийПользователь.

Важно учитывать, что время получения значения параметра сеанса значительно превышает время получения значения переменной модуля приложения. Поэтому, полный отказ от использования переменных модуля приложения в пользу параметров сеанса является неправильным. Следует применять комбинированный метод: - в модулях объектов следует применять только параметры сеанса, поскольку это решит проблему недоступности объектов на сервере - в модулях форм следует применять только переменные модуля приложения, поскольку здесь более важным является быстродействие кода, кроме того модуль формы заведомо не будет выполняться на сервере.

Общие рекомендации

Поставка модулей без исходных текстов

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

Логическая проверка модулей

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

Поиск неиспользуемых процедур и функций

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

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

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

Проверка существования назначенных обработчиков

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

Поиск пустых обработчиков

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

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

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

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

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

Изображение

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

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

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

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

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

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

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

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

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

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

Изображение

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

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

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

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

программный код со структурой 1с

Создание новой структуры

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

новая структура

Изменение

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

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

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

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

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

Перебор коллекции

Количество элементов в структуре можно подсчитать следующим образом:

Проверка наличия ключа

Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Есть одна информация, которая не дает мне покоя. В синтаксис-помощнике написано:
Структура (Structure)
()
Использование:

Значение параметра меняем как хотим 🙂

СправочникСсылка
Наименование
Только чтение

СправочникОбъект
Наименование
Чтение и запись

Проводя такой же аналог для структуры получаем что речь идет именно о значении свойства, которое указано в имени ключа. Вот в чем прикол-то))

Читайте также: