При обращение к значению параметра сеанса необходимо учитывать, что, не смотря на то, что при это не выполняется обращение к БД, время обращения к значению параметра все-таки значительно отличается от аналогичного времени обращения к переменной. Поэтому не рекомендуется выполнять многократное получение значения параметра сеанса – следует использовать "промежуточную" переменную.
Неправильно:
Выборка = Запрос.Выполнить().Выбрать(); Набор = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей(); .... Пока Выборка.Следующий() Цикл Запись = Набор.Добавить(); ... Запись.Пользователь = ПараметрыСеанса.ТекущийПользователь; ... КонецЦикла; Набор.Записать(); |
Правильно:
Выборка = Запрос.Выполнить().Выбрать(); Пользователь = ПараметрыСеанса.ТекущийПользователь; Набор = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей(); .... Пока Выборка.Следующий() Цикл Запись = Набор.Добавить(); ... Запись.Пользователь = Пользователь; ... КонецЦикла; Набор.Записать(); |
Проверка заполнения значения переменной (реквизита и т.п.)
В тех случаях, когда необходимо проверить факт установки «пустого» значения в переменной, реквизите объекта или формы и любых других подобных значениях рекомендуется применять следующую функцию:
Функция ЗначениеНеЗаполнено(Значение) Экспорт Результат = Ложь; ТипЗначения = ТипЗнч(Значение); // Сначала примитивные типы Если Значение = Неопределено Тогда Результат = Истина; ИначеЕсли Значение = NULL Тогда Результат = Истина; ИначеЕсли ТипЗначения = Тип("Строка") Тогда Если ПустаяСтрока(Значение) Тогда Результат = Истина; КонецЕсли; ИначеЕсли ТипЗначения = Тип("Число") Тогда Если Значение = 0 Тогда Результат = Истина; КонецЕсли; ИначеЕсли ТипЗначения = Тип("Дата") Тогда Если Значение = Дата('00010101') Тогда Результат = Истина; КонецЕсли; ИначеЕсли ТипЗначения = Тип("Булево") Тогда Результат = Ложь; // Булево будем считать не пустым //////////////////////////////////////////////////////////// ИначеЕсли ТипЗначения = Тип…. //Другие проверки, для значений, не имеющих конструктора /////////////////////////////////////////////////////////// // Для остальных будем считать значение пустым, если оно равно // значению своего типа, получаемому конструктором Иначе Если Значение = Новый(ТипЗначения) Тогда Результат = Истина; КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции // ЗначениеНеЗаполнено() |
Для возможности применения данного метода в любом модуле конфигурации данная функция должна располагаться в одном из общих модулей, с установленными признаками компиляции "Клиент", "Сервер" и "Внешнее соединение".
При использовании этого метода следует учитывать, что прямая проверка искомого значения на «пустое» выполняется все-таки быстрее.
Например,
Ссылка.Пустая()
выполняется на порядок быстрее чем
ЗначениеНеЗаполнено(Ссылка).
Соответственно, при обработке большого объема информации в алгоритмах критических к времени выполнения, когда тип проверяемого значения заведомо определен, применять данный метод не рекомендуется.
Требования к реализации обработчиков события ПередЗаписью() объектов конфигурации
В случаях, когда в обработчике события ПередЗаписью() объекта конфигурации выполняется какая-либо проверка или иные действия, в результате которых может быть принято решение об отказе от записи объекта (т.е. установка значения флага Отказ в ИСТИНА), то такая проверка не должна выполняться при записи данных, получаемых через механизмы обмена данных.
То есть, данная проверка должна быть ограничена условием:
"Если НЕ ОбменДанными.Загрузка Тогда"
Эти требования относятся и к принудительной установке уникального идентификатора объекта, выполняемого с помощью метода УстановитьСсылкуНового(), поскольку эти действия, выполненные для принятого через механизм обмена данным объекта, приведут к потере соответствия между объектами в различных узлах распределенной информационной базы.
Неправильно:
Если ЭтоНовый() Тогда Если ЗначениеНеЗаполнено(ЕдиницаХраненияОстатков) Тогда Отказ = Истина; КонецЕсли; мСсылкаНового = Справочники.Номенклатура.ПолучитьСсылку(); Если НЕ Отказ Тогда УстановитьСсылкуНового(мСсылкаНового); КонецЕсли; КонецЕсли; |
Правильно:
Если НЕ ОбменДанными.Загрузка Тогда Если ЭтоНовый() Тогда Если ЗначениеНеЗаполнено(ЕдиницаХраненияОстатков) Тогда Отказ = Истина; КонецЕсли; мСсылкаНового = Справочники.Номенклатура.ПолучитьСсылку(); Если НЕ Отказ Тогда УстановитьСсылкуНового(мСсылкаНового); КонецЕсли; КонецЕсли; КонецЕсли; |
Дата: 2018-11-18, просмотров: 274.