Смекни!
smekni.com

Вычисление логических выражений в операторах встроенного языка (стр. 1 из 6)

Вычисление логических выражений в операторах встроенного языка

В условных операторах и операторах цикла встроенного языка системы 1С:Предприятие для определения последовательности выполняемых действий используются логические выражения. Логическим выражением может быть элементарное логическое выражение (сравнение двух значений) или более сложные конструкции полученные из элементарных логических выражений при помощи логических операций И/ИЛИ/НЕ.

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

Предположим, имеется процедура, предназначенная для обработки некоторого реквизита справочника или документа. Тип данного реквизита не определен, а процедура может вызываться для любого значения реквизита вне зависимости от его типа. Процедура может иметь вид:

Процедура Обработать(Об)

Если (ТипЗначенияСтр(Об) = "Справочник") И (Об.Вид() = "Товары") Тогда

// Некоторые действия

КонецЕсли;

...

КонецПроцедуры

Если в качестве значения параметра, передаваемого в данную процедуру, будет фигурировать элемент справочника любого вида, то процедура будет работать нормально, но если в качестве параметра будет передано значение типа "Число" или "Дата", то выполнение процедуры будет аварийно завершено. В логическом выражении, используемом в операторе 'Если' только составляющая ТипЗначенияСтр(Об) = "Справочник" будет корректно функционировать независимо от типа передаваемого параметра, а составляющая Об.Вид() = "Товары" сможет нормально работать только в том случае, если в качестве параметра в процедуру передано значение агрегатного типа и для данного агрегатного типа определен метод Вид(). Дело в том, что при вычислении логических выражений встроенный язык системы 1С:Предприятие 7.х сначала вычисляет элементарные логические выражения (операции сравнения), а затем производит вычисление логического выражения в целом (операции И/ИЛИ/НЕ).

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

Процедура Обработать(Об)

Если ТипЗначенияСтр(Об) = "Справочник" Тогда

Если Об.Вид() = "Товары" Тогда

// Некоторые действия

КонецЕсли

КонецЕсли

...

КонецПроцедуры

В данном случае порядок вычисления логических выражений в операторах Если выражен в явном виде и выражение Об.Вид() = "Товары" будет вычисляться только в том случае если условие ТипЗначенияСтр(Об) = "Справочник" окажется истинным и ошибки при выполнении процедуры не произойдет при любом значении параметра.

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

Особенности применения предопределенных процедур встроенного языка

Во встроенном языке системы 1С:Предприятие 7.x предусмотрен ряд системных предопределенных процедур При..., таких как "ПриЗаписи", "ПриУдаленииДокумента", "ПриУдаленииЭлемента", "ПриЗаписиКонстанты", "ПриОтменеПроведенияДокумента" и т. п., определяемых в различных модулях конфигурации и вызываемых системой при выполнении соответствующих действий. Назначение указанных процедур состоит в том, чтобы специалист по конфигурированию мог предусмотреть необходимые проверки при интерактивном выполнении соответствующих операций, и, в случае необходимости, имел возможность запретить их выполнение.

При этом следует учитывать следующие особенности данных процедур:

1. Указанные предопределенные процедуры не связаны непосредственно с действиями, при выполнении которых они вызываются, а сам вызов производится только при интерактивном выполнении указанных действий. Например, процедура "ПриУдаленииДокумента" будет вызвана в том случае, когда удаление документа будет инициировано "нажатием кнопки" в форме журнала. В то же время вызов этой предопределенной процедуры не будет производиться, если удаление документа производится из какого-либо модуля встроенного языка (например, из некоторой обработки).

2. Вызовы указанных предопределенных процедур не объединены с выполняемым действием единой транзакцией. Это означает, что в случае интерактивного удаления документа, само удаление документа выполняется в транзакции, отдельной от действий, которые могут выполняться в процедуре "ПриУдаленииДокумента". И если в процедуре "ПриУдаленииДокумента" действия будут выполняться в раках одной, явно определенной в процедуре транзакции, то все равно приходится говорить о двух транзакциях:

- удаление документа;

- действия, выполняемые в процедуре "ПриУдаленииДокумента"

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

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

Заметим, что описанные выше особенности предопределенных процедур не распространяются на предопределенные процедуры "ОбработкаПроведения" и "ОбработкаУдаленияПроведения". Эти предопределенные процедуры вызываются непосредственно в транзакции проведения (отмены проведения) и выполняемые в них алгоритмы логически связанны с самим выполняемым действием. Кроме того, в отличие от других предопределенных процедур эти предопределенные процедуры выполняются и в случае проведения (отмены проведения) средствами встроенного языка.

Сохранение (восстановление) значений в строку

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

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

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

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

Какие значения преобразуются в строку.

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

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

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

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