Объектная модель прикладного решения 1c. Список вопросов 1c :Профессионал Платформа 8.3
Пройдите тест, чтобы проверить Ваши знания по теме “Объектная модель прикладного решения 1c”.
Список вопросов 1c :Профессионал Платформа 8.3 Глава 6
Навигация (только номера заданий)
0 из 84 заданий окончено
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
Информация
06. Объектная модель прикладного решения
Вы уже проходили тест ранее. Вы не можете запустить его снова.
Вы должны войти или зарегистрироваться для того, чтобы начать тест.
Вы должны закончить следующие тесты, чтобы начать этот:
Результаты
Правильных ответов: 0 из 84
Вы набрали 0 из 0 баллов ( 0 )
Рубрики
- Нет рубрики 0%
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- С ответом
- С отметкой о просмотре
Какие виды программных модулей существуют “1С:Предприятие 8”?
- Общие модули, модуль сеанса, модули форм
- Модуль обычного приложения, модуль управляемого приложения, общие модули, модуль сеанса, модули объектов, модули форм
- Модуль обычного приложения, модуль управляемого приложения, модуль внешнего соединения, модуль сеанса, общие модули и модули форм
- Модуль обычного приложения, модуль управляемого приложения, модуль внешнего соединения, модуль сеанса, общие модули, модули форм, модули макетов
- Модуль обычного приложения, модуль управляемого приложения, модуль внешнего соединения, модуль сеанса, модуль команды, общие модули, модули менеджера, модули форм, модули объектов и модули набора записей
- Модуль приложения, модуль внешнего соединения, модуль сеанса, общие модули, модули форм, модули макетов, модули объектов и модули набора записей
Какие разделы существуют в общем модуле?
- Раздел объявления переменных, раздел процедур и функций, раздел основной программы
- Только раздел процедур и функций
- Только раздел основной программы
- Только раздел объявления переменных и раздел описания процедур функций
Модуль приложения рекомендуется использовать…
- Для определения предопределенных процедур "ПриНачалеРаботыСистемы" и т.п.
- Как место определения процедур и функций, используемых во всей конфигурации
- Как место определения предопределенных процедур, которые инициализируются при старте и окончании работы системы в режиме внешнего единения
- верны ответы 1 и 2
В общих модулях…
- Нет ограничений на описание переменных, процедур, функций
- Нельзя описывать переменные
- Нельзя описывать переменные, процедуры и функции без ключевого слова "Экспорт"
Типизация переменных во встроенном языке “1С:Предприятие
- Не жесткая, т.к. тип переменной определяется ее значением
- Не жесткая, т.к. неявным определением переменной является ее первое упоминание в левой части оператора присваивания
- Жесткая, т.к. обязательным является объявление переменной в явном виде
- Жесткая, т.к. неявным определением переменной является ее первое упоминание в левой части оператора присваивания
- Верны утверждения 1 и 2
- верны утверждения 3 и 4
В модуле приложения…
- Нет ограничений на описание переменных, процедур, функций
- Нельзя описывать переменные
- Нельзя описывать процедуры и функции без ключевого слова "Экспорт"
Какой должен быть порядок определения процедур и функций в программном модуле?
- Описание функций должно идти выше описания процедур и раздела основной программы
- Описание вызываемых процедур и функций должно идти выше вызывающих
- Порядок следования процедур и функций не имеет значения
- Порядок следования процедур и функций зависит от типа модуля
Какое высказывание о модуле приложения верно?
- Модуль приложения используется для обработки событий, связанных с началом и завершением работы системы
- Модуль приложения используется для объявления глобальных переменных
- Модуль приложения используется для объявления глобальных процедур и функций, доступных в любых других модулях
- Верны все вышеперечисленные высказывания
- Верны ответы 1 и 2
Только определения процедур и функций может содержать только следующий вид модуля:
- Модуль приложения
- Общий модуль
- Модуль сеанса
- Модуль объекта
- Верны ответы 2,3
- Верны ответы 2,4
Модуль сеанса (выберите наиболее полный правильный ответ):
- Предназначен для инициализации параметров сеанса и отработки действий, связанных с сеансом работы
- Не содержит экспортируемых процедур и функций
- В кластере серверов 1С:Предприятия 8 исполняется в привилегированном режиме
- Исполнение происходит после начала исполнения модуля приложения (модуля внешнего соединения)
- Верны ответы 1,3
- Верны ответы 1,2,3,4
Имя общего модуля может совпадать с именем свойства глобального контекста (например “Отчеты”):
- Может в любом случае
- Может, но только если модуль глобальный
- Может, но только если модуль не глобальный
Какие функции отсутствуют во встроенном языке “1С:Предприятие 8”:
- Функции работы со значениями типа Дата
- Функции работы со значениями типа Время
- Функции работы со значениями типа Строка
- Функции работы со значениями типа Число
- Все вышеперечисленные функции имеются во встроенном языке
Ключ может быть произвольного типа…
- У структуры
- У соответствия
- У массива
- Ни у одного из вышеперечисленных
Что произойдет, если удалить запись регистра сведений и создать новую такими же полями (измерениями, ресурсами, реквизитами)?
- Ничего, на логику программы это никак не повлияет
- У этой записи будет другой внутренний идентификатор (ссылка) и это может повлиять на логику программы
- Возникнет исключительная ситуация
Как повлияет удаление элемента справочника, который уже используется других объектах, а потом создать новый с такими же реквизитами, на поведение программы?
- Ничего, на логику программы это никак не повлияет
- У элемента будет другой внутренний идентификатор (ссылка) и это может повлиять на логику программы
- Возникнет исключительная ситуация
С помощью объекта какого типа можно перебирать элементы справочника?
- СправочникиМенеджер
- СправочникМенеджер
- СправочникВыборка
- СправочникОбъект
- СправочникСписок
В каком свойстве хранится дата документа?
- Дата
- ДатаДок
- ДатаДокумента
- Нет правильного ответа
Где располагаются процедуры-обработчики событий прикладных объектов, например, ПриЗаписи, ПередУдалением?
- В модуле формы
- В модуле объекта
- В модуле приложения
- Таких событий у прикладных объектов нет
Что такое “системные перечисления”?
- Перечень значений, заданный на этапе разработки конфигурации (ветвь Перечисления в дереве конфигурации)
- Перечень значений, заданный в платформе "1С:Предприятие 8"
- Конструкция встроенного языка, используемая разработчиком для объявления перечислимых типов данных
- Системные перечисления отсутствуют в системе "1С:Предприятие 8"
Какая коллекция из нижеперечисленных не относится к универсальным?
- Массив
- СписокЗначений
- ДеревоЗначений
- Коллекция строк табличной части документа
- Верны ответы 3 и 4
Что необходимо для того, чтобы написанная программистом процедура дополнила контекст документа (объекта типа ДокументОбъект)?
- Она должна быть определена в модуле документа
- Она должна быть определена в общем модуле
- Она должна быть определена с ключевым словом Экспорт
- Одновременно должны выполняться условия 1 и 3
- Одновременно должны выполняться условия 2 и 3
В каком свойстве хранится время документа?
- Время
- ВремяДок
- Дата
- Нет правильного ответа
Для чего предназначен объект ДокументСписок?
- Для перебора (выборки) документов средствами встроенного языка
- Для управления списком документов, выводимых в табличное поле, т.е. для решения интерфейсных задач
- Для операций над документами как объектами базы данных, создания к удаления документов
- Верны ответы 1 и 2
С какого значения начинается индексирование элементов коллекций?
- 0 (с нуля)
- 1 (с единицы)
- С начального индекса, заданного программистом при создании коллекции
- Элементы коллекций не индексируются
Объект какого типа позволяет изменить элемент справочника в базе данных?
- СправочникМенеджер
- СправочникОбъект
- СправочникСсылка
- Все перечисленные объекты
- Верны ответы 1 и 2
Какие утверждения относительно NULL справедливы?
- NULL — это литерал
- NULL — относится к примитивным типам данных
- NULL — обозначает отсутствующее значение
- Верны все перечисленные ответы
- Верны ответы 2 и 3
Какого типа является свойство глобального контекста “Справочники”?
- СправочникиМенеджер
- СправочникМенеджер
- СправочникОбъект
- СправочникВыборка
- СправочникСсылка
Какой литерал представляет значение типа “дата” по умолчанию (пустая дата)?
- 01010001
- 01010001000000
- 00010101
- 00010101000000
- Верны ответы 1 и 2
- Верны ответы 3 и 4
Как можно обратиться к менеджеру справочника “Номенклатура”?
- Спр = СоздатьОбъект("Справочник.Номенклатура")
- Спр = Справочники.Номенклатура
- Спр = Новый Справочник.Номенклатура
- Верны ответы 2 и 3
Где может размещаться процедура-обработчик события “Нажатие” кнопки диалога?
- В модуле формы
- В модуле объекта
- В общем модуле
- В модуле приложения
- Возможно либо в модуле формы, либо в модуле объекта. Определяется разработчиком
Что необходимо выполнить в процедуре “ОбработкаПроведения” в модуле документа для отмены проведения?
- СтатусВозврата(0)
- Отказ = Истина
- Отказ = Ложь
- Режим = Ложь
- РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения
Пусть Переменная1 имеет тип Дата (состав даты – “Дата”) и значение, равное 1 марта 2005 года. Чему будет равно значение выражения “Переменная1+20”?
- 21 марта 2005 г 00 ч 00 мин 00 сек
- 1 марта 2005 г 00 ч 00 мин 20 сек
- 1 марта 2005 г 20 ч 00 мин 00 сек
- 21 марта 2005 г 00 ч 00 мин 20 сек
- Возникнет ошибка преобразования типов
В каком обработчике события модуля объекта можно отказаться от записи объекта, например, элемента справочника?
- ПередЗаписью
- ПриЗаписи
- ПослеЗаписи
- В любом из перечисленных
- Справедливо 1 и 2
Какое значение будет стоять в полях записей результата запроса, для которых не найдено соответствия в другой таблице-источнике при внешнем соединении?
- Не определено
- NULL
- 0
- Пустая ссылка
При определении обработчика события на СОМ объект количество параметров в процедуре-обработчике:
- Равно количеству параметров соответствующего события объекта
- На один параметр больше, чем у соответствующего события объекта (первый параметр содержит сам СОМ объект)
- На один параметр больше, чем у соответствующего события объекта (последний параметр содержит сам СОМ объект)
- У такой процедуры не будет параметров
- Всегда один параметр (сам СОМ объект)
При определении подписки на событие количество параметров в процедуре-обработчике:
- Равно количеству параметров соответствующего обработчика события, располагаемого в модуле объекта
- На один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (первый параметр содержит сам объект)
- На один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (последний параметр содержит сам объект)
- У такой процедуры не будет параметров
- всегда один параметр (сам объект, для которого определялась подписка)
При определении обработчика события на экземпляр объекта 1С:Предприятие количество параметров в процедуре-обработчике:
- Равно количеству параметров соответствующего обработчика события. располагаемого в модуле объекта
- На один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (первый параметр содержит сам объект)
- На один параметр больше, чем у соответствующего обработчика события. располагаемого в модуле объекта (последний параметр содержит сам объект)
- У такой процедуры не будет параметров
- Всегда один параметр (сам объект, для которого определялась подписка)
При определении подписки на событие процедура – обработчик должна располагаться:
- В глобальном общем модуле
- В не глобальном общем модуле
- В модуле приложения
- В модуле объекта
При назначении обработчика события на объект (экземпляр объекта 1С:Предприятие, СОМ объект) процедура, отвечающая за отработку данного события должна быть расположена:
- Обязательно в глобальном общем модуле
- Обязательно в не глобальном общем модуле
- Обязательно в модуле приложения
- Выбор модуля не важен, в "пределах видимости"
С помощью команды “ДобавитьОбработчик” можно назначить обработчик события на:
- СОМ объект
- Экземпляр объекта 1С:Предприятие (назначать на события модуля объекта)
- Экземпляр объекта "Форма"
- Верны 1,2 ответы
- Верны 1,2,3 ответы
Какая процедура выполняет обработку события ввода документа “на основании”?
- "ОбработкаЗаполнения" с формальным параметром "Основание" произвольного типа
- "ВводНаОсновании" с формальным параметром "Основание" типа "Документ"
- "ОбработкаЗаполнения" с формальным параметром "Основание" типа "Документ"
- Ввод документа "на основании" не требует дополнительных методов обработки, т.к. это процесс полностью автоматический
Какой метод документа обеспечивает вызов события проведения документа?
- Записать(РежимЗаписиДокумента.Проведение), где Записать — метод объекта документа
- Провести(), где Провести — метод объекта документа
- Записать(РежимЗаписиДокумента.Проведение), где Записать — метод формы документа
- Провести(), где Провести — метод формы документа
Какой метод документа обеспечивает вызов события отмены проведения документа?
- Записать(РежимЗаписиДокумента.ОтменаПроведения), где Записать — метод объекта документа
- ОтменитьПроведение(), где ОтменитьПроведение — метод объекта документа
- ОтменитьПроведение(), где ОтменитьПроведение — метод формы документа
- Записать(РежимЗаписиДокумента.ОтменаПроведения), где Записать — метод формы документа
При определении подписки на событие количество таких подписок:
- Только одна
- Любое количество, процедуры обработчики должны обязательно располагаться в разных общих неглобальных модулях
- Любое количество, процедуры обработчики могут располагаться как в одном, так и в разных общих неглобальных модулях
При определении на одно событие объекта 1С:Предприятие нескольких подписок на событие, порядок вызова обработчиков следующий:
- Вызывается процедура подписки на событие, определенная последней. остальные не вызываются
- Вызывается процедура подписки на событие, определенная первой, остальные не вызываются
- Процедуры вызываются в соответствии с порядком создания подписок на событие
- Процедуры вызываются в произвольном порядке
При определении подписки на событие, в случае если в модуле объекта определен соответствующий обработчик этого же события:
- Процедура подписки на событие вызываться не будет (событие отрабатывается в модуле объекта)
- Процедура модуля объекта вызываться не будет (событие отрабатывается по подписке)
- В начале отработает процедура, расположенная в модуле объекта, затем процедура, определенная по подписке
- В начале отработает процедура, определенная по подписке, затем процедура, расположенная в модуле объекта
Подписка на событие может быть определена:
- Только для одного объекта
- Для разных объектов, но только одного вида (например, для нескольких справочников или для нескольких документов)
- Для разных объектов
При определении подписки на событие для разных объектов перечень показываемых событий формируется по принципу:
- Должно совпадать количество параметров события
- Должно совпадать имя события
- Должны выполняться оба вышеприведенных требования
Процедура, используемая подпиской на событие, должна располагаться в модуле с установленными (взведенными) флажками:
- Клиент
- Сервер
- Внешнее соединение
- Обязательно Клиент и Сервер
- Обязательно Клиент, Сервер и Внешнее соединение
- Определяется разработчиком исходя из практической задачи
Пессимистическая блокировка объекта (метод Заблокировать()):
- Не позволяет программно менять данные объекта
- Позволяет программно менять данные объекта, но только если он заблокирован через ту же переменную, через которую и будет производиться изменение данных объекта
- Блокировка объекта не мешает программно менять данные объекта
Пессимистическая блокировка объекта (метод Заблокировать()):
- Не позволяет интерактивно (в основной форме объекта) менять данные объекта
- Позволяет интерактивно (в основной форме объекта) менять данные объекта, но только если он заблокирован через какую-либо другую форму
- Блокировка объекта не мешает интерактивно (в основной форме объекта) менять данные объекта
Тип анализа “Кластерный анализ” подразумевает:
- Поиск часто встречаемых вместе групп объектов или значений характеристик
- Поиск цепочек событий
- Построение иерархической структуры классифицирующих правил
- Разделение исходного набора на группы объектов
- Получение общестатистических показателей в виде дерева
Тип анализа “Дерево решений” подразумевает:
- Поиск часто встречаемых вместе групп объектов или значений характеристик
- Поиск цепочек событий
- Построение иерархической структуры классифицирующих правил
- Разделение исходного набора на группы объектов
- Получение общестатистических показателей в виде дерева
Тип анализа “Поиск ассоциаций” подразумевает:
- Поиск часто встречаемых вместе групп объектов или значений характеристик
- Поиск цепочек событий
- Построение иерархической структуры классифицирующих правил
- Разделение исходного набора на группы объектов
- Получение общестатистических показателей в виде дерева
Тип анализа “Поиск последовательностей” подразумевает:
- Поиск часто встречаемых вместе групп объектов или значений характеристик
- Поиск цепочек событий
- Построение иерархической структуры классифицирующих правил
- Разделение исходного набора на группы объектов
- Выявления последовательно расположенных объектов
Объект МодельПрогноза создается:
- С использованием конструктора "Новый"
- При обращении к одноименному свойству глобального контекста
- Из результата анализа данных
Алгоритмы в модуле управляемой формы могут исполняться?
- Только на клиентском компьютере
- Только на сервере
- Место исполнения определяется настройками модуля
- Место определяется для каждой процедуры и функции модуля
- Возможность зависит от объектов встроенного языка
Алгоритмы в модуле обычной формы могут исполняться?
- Только на клиентском компьютере
- Только на сервере
- Возможность определяется настройками модуля
- Возможность определяется для каждой процедуры и функции модуля
- Обычный параметр существует только при открытии формы, ключевой — только при закрытии формы
Существует ли в 1С:Предприятии 8 возможность настроить конкретное прикладное решение на использование региональных настроек чисел, дат и времени?
- Да, в региональных установках информационной базы можно настроить эти параметры
- В региональных установках информационной базы можно настроить только формат даты и времени
- В региональных установках информационной базы можно настроить только формат даты и чисел
- В 1С предприятие 8 такой возможности не существует
К чему приведет изменение кода языка в свойстве “Код языка”, если уже введены тексты в свойствах “Синоним” или “Заголовок” на этом языке?
- К "потере" введенных текстов без возможности "восстановления"
- К "потере" введенных текстов с возможностью "восстановления" при указании прежнего значения кода языка
- К потере данных это действие не приведет, введенные тексты будут соответствовать языку с новым кодом
Какой режим используется для выполнения задач локализации (создания интерфейса на другом языке)?
- "Редактирование текстов интерфейса"
- Никакой специальный режим не требуется
- "Редактирование интерфейса"
- Нет правильного ответа
При необходимости использования англоязычной транскрипции встроенного языка 1С:Предприятие 8 в уже существующей конфигурации можно:
- Использовать англоязычные варианты только для конструкций встроенного языка
- Использовать англоязычные варианты встроенных процедур/функций. операторных скобок и языковых конструкций
- Использовать англоязычные варианты встроенных функций, операторных скобок и языковых конструкций, а также переводные имена вызываемых процедур и функций существующей конфигурации
- Использовать англоязычные варианты встроенных процедур и функций, операторных скобок, языковых конструкций и англоязычных синонимов идентификаторов объектов и их реквизитов
Если в региональных установках информационной базы ни одно из свойств установлено не будет, тогда…
- Язык и форматы отображения чисел, даты и времени будут определяться настройками операционной системы
- Язык и форматы отображения чисел, даты и времени будут определяться настройками технологической платформы 1С
- Нет правильного ответа
Что такое локализация?
- Адаптация программы под конкретные национальные требования
- Перевод программы на другой язык
- Ограничение на доступ к базам для различных категорий пользователей
Для чего применяется код локализации?
- Для указания региональных установок информационной базы
- В форматных строках во встроенном языке для упрощения адаптации решений к конкретным региональным установка
- Для идентификации программного продукта
- Верны ответы 1 и 2
- Верны ответы 1 и 3
На что влияют региональные установки информационной базы?
- На формат отображения чисел и дат
- На интерфейс 1С:Предприятие
- На порядок сортировки строк в базе данных
- Верно все вышеперечисленное
- Верны варианты 1 и 3
Создание многоязыковых прикладных решений…
- Возможно только в специальной версии программы 1С:Предприятие 8
- В 1С:Предприятие 8 невозможно, так как программный продукт уже локализован
- Возможно благодаря тому, что существует возможность создания нескольких языков в конфигурации и локализованных интерфейсов платформы
В каком формате хранятся тексты конфигурации и базы данных в системе 1С:Предприятие?
- Тексты конфигурации и базы данных хранятся в формате UNICODE
- В зависимости от настроек, заданных при создании информационной базы
- Нет правильного ответа
С какой целью тексты конфигурации и базы данных хранятся в формате UNICODE?
- Формат UNICODE обеспечивает неизменность (независимость от программной платформы операционной системы) представления информации
- Формат UNICODE позволяет поддерживать различные языки в системе 1С:Предприятие
- Нет правильного ответа
Механизмы интернационализации, заложены в…
- Технологическую платформу 1С:Предприятия
- Прикладные решения
- Верны ответы 1 и 2
- Нет правильного ответа
Что такое код локализации?
- Строка, состоящая из кода языка и кода страны и идентифицирующая некоторый регион мира
- Код программного продукта (указывается на регистрационной анкете, документации из комплекта поставки)
- Параметр форматирования строки для преобразования
- Нет правильного ответа
Верно ли что в 1С:Предприятие 8 любая текстовая информация может включать одновременно символы различных языков?
- Да, так как все тексты конфигурации и базы данных хранятся в формате UNICODE
- В зависимости от настроек, заданных при создании информационной базы
- Только если это предусмотрено конфигурацией
- Нет
Для чего предназначен объект конфигурации “Язык”?
- Для создания интерфейса программы на разных языках
- Для создания текстовых документов на разных языках
- Такого объекта в 1С Предприятие 8 не существует
Каким образом можно сменить язык просмотра (редактирования) конфигурации?
- С помощью кнопки выбора языка, расположенной в строке состояния справа от кнопки "NUM"
- Через пункт меню "Конфигурация — Язык редактирования конфигурации"
- В 1С:Предприятие такой возможности не существует
- Верны ответы 1 и 2
Какое написание имеют операторы встроенного языка?
- Только русское написание
- Только английское написание
- Русское и английское написание
- В зависимости от настроек конфигуратора
Возможно ли использование в одном исходном тексте операторов встроенного языка в русском и английском написании?
- Только при специальных настройках конфигуратора
- Да, для этого не требуется изменения каких-либо настроек конфигуратора
- Нет, так как вариант встроенного языка задается в свойствах конфигурации
С какой целью используется встроенный язык?
- Для определения интерфейса программы по умолчанию
- Для описания (на стадии разработки конфигурации) алгоритмов функционирования прикладной задачи
- Нет правильного ответа
Какое написание имеют функции встроенного языка?
- Только русское написание
- Только английское написание
- Русское и английское написание
- В зависимости от настроек конфигуратора
Что обозначает параметр Л(L) в форматной строке функции форматирования ЧислоПрописью()?
- Признак "дробную часть выводить числом/прописью"
- Количество знаков после запятой
- Код локализации
У регистра сведений установлен режим записи “Независимый”. Редактирование осуществляется в диалоге, ни одна из форм регистра не определена. При попытке интерактивного добавления в него “Записи” со значениями измерений, комбинация которых уже прописана в регистре:
- На экран выводится предупреждение, но запись все равно записывается в базу данных
- Возникает ошибочная ситуация
- Происходит замещение записи
- Интерактивная запись в такой регистр невозможна
При проведении документа по какому-либо регистру в случае, если у документа установлен автоматический режим управления транзакционными блокировками, а у регистра управляемый (в свойствах конфигурации используется вариант “Автоматический и управляемый”), то такое проведение приведет:
- К возникновению ошибочной ситуации
- Вся транзакция будет выполнена в автоматическом режиме
- Вся транзакция будет выполнена в управляемом режиме
При проведении документа по какому-либо регистру в случае, если у документа установлен управляемый режим управления транзакционными блокировками, а у регистра автоматический (в свойствах конфигурации используется вариант “Автоматический и управляемый”), то такое проведение приведет:
- К возникновению ошибочной ситуации
- Вся транзакция будет выполнена в автоматическом режиме
- Вся транзакция будет выполнена в управляемом режиме
При проведении документа по какому-либо регистру в случае, если у документа установлен автоматический режим управления транзакционными блокировками, а у регистра управляемый (в свойствах конфигурации используется вариант “Управляемый”), то такое проведение приведет:
Какие утверждения относительно null справедливы
Кроме стандартных значений типа чисел, строк, язык C# имеет специальное значение — null , которое фактически указывает на отсутствие значения как такового, отсутствие данных. До сих пор значение null выступает как значение по умолчанию для ссылочных типов.
До версии C# 8.0 всем ссылочным типам спокойно можно было присваивать значение null :
Но начиная с версии C# 8.0 в язык была введена концепция ссылочных nullable-типов (nullable reference types) и nullable aware context — nullable-контекст, в котором можно использовать ссылочные nullable-типы.
Чтобы определить переменную/параметр ссылочного типа, как переменную/параметр, которым можно присваивать значение null , после названия типа указывается знак вопроса ?
К примеру встроенный метод Console.ReadLine() . который считывает с консоли строку, возвращает именно значение string? , а не просто string :
Зачем нужно это значение null? В различных ситуациях бывает удобно, чтобы объекты могли принимать значение null, то есть были бы не определены. Стандартный пример — работа с базой данных, которая может содержать значения null. И мы можем заранее не знать, что мы получим из базы данных — какое-то определенное значение или же null.
При этом подобные ссылочные типы, которые допускают присвоение значения null , доступно только в nullable-контексте. Для nullable-контекста характерны следующие особенности:
Переменную ссылочного типа следует инициализировать конкретным значением, ей не следует присваивать значение null
Переменной ссылочного nullable-типа можно присвоить значение null , но перед использование необходимо проверять ее на значение null .
Начиная с .NET 6 и C# 10 nullable-контекст по умолчанию распространяется на все файлы кода в проекта. Например, если мы наберем в Visual Studio 2022 для проекта .NET 6 предыдущий пример, то мы столкнемся с предупреждением:

Хотя nullable-контекст — это опция, которой мы можем управлять. Так, откроем файл проекта. Для этого либо двойным кликом левой кнопкой мыши нажмем на проект, либо нажмем на проект правой кнопкой мыши и в появившемся меню выберем пункт Edit Project File

После этого Visual Studio откроет нам файл проекта, который будет выглядеть примерно следующим образом:
точнее элемент <Nullable> со значением enable указывает, что эта nullable-контекст будет распространяться на весь проект.
Чем так плох null ? Дело в том, что это значение означает, отсутствие данных. Но, допустим, у нас есть ситуация, когда мы получаем извне некоторую строку и пытаемся обратиться к ее функциональности. Например, в примере ниже у строки вызывается метод ToUpper() , который переводит все символы строки в верхний регистр:
Здесь при выполнении вызова PrintUpper(name) мы столкнемся с исключением NullReferenceException , и программа аварийно завершит свою работу. Кто-то может сказать, что ситуация искуственная — мы же явно знаем, что в функцию передается null. Однако в реальности данные могут приходить извне, например, из базы данных, откуда-то из сети и т.д. И мы можем явно не знать, есть ли в реальности данные или нет. И использование ссылочных nullable-типов позволяет частично решить эту ситуацию. Частично — поскольку предупреждения все равно не мешают нам скомпилировать и запустить программу выше. Однако nullable-контекст позволяет воспользоваться возможностями статического анализа, благодаря которому можно увидеть потентиально опасные куски кода, где мы можем столкнуться с NullReferenceException.
Кроме того, есть вероятность, что Microsoft изменит отношение в отношении null и NullReferenceException, и подобные предупреждения превратятся в будущих версиях в ошибки, поэтому лучше уже сейчас быть к этому готовым
Например, изменим предыдущий пример следующим образом:
Здесь статический анализ подскажет, что в методе PrintUpper потенциально опасная ситуация, поскольку параметр text может быть равен null .

Отключение nullable-контекста
Для отключения nullable-контекста в файле конфигурации проекта достаточно изменить значение опции Nullable , например, на «disable»:
Отключив nullable-контекст, мы больше не сможем использовать в файлах кода в проекте ссылочные nullable-типы и соответственно воспользоваться встроенным статическим анализом потенциально опасных ситуаций, где можно столкнуться с NullReferenceException.
nullable-контекст на уровне участка кода
Мы также можем включить nullable-контекст на урове отдельных участков кода с помощью директивы #nullable enable . Допустим, глобально у нас отключен nullable-контекст:
Определим в файле Program.cs следующий код:
Первая строка позволяет включить на уровне всего файла nullable-контекст.

Оператор ! (null-forgiving operator)
Оператор ! (null-forgiving operator) позволяет указать, что переменная ссылочного типа не равна null :
Здесь если бы мы не использовали оператор !, а написали бы PrintUpper(name) , то компилятор высветил бы нам предупреждение. Но в самом методе мы итак проверяем на null, поэтому даже если в метод передается null, то мы не столкнемся ни с какими проблемами. И чтобы убрать ненужное предупреждение, применяется данный оператор. То есть данный оператор не оказывает никакого влияния во время выполнения кода и предназначен только для статического анализа компилятора. Во время выполнения выражение name! будет аналогично значению name
Исключение кода из nullable-контекста
С помощью специальной директивы #nullable disable можно исключить какой-то определенный кусок кода из nullable-контекста. Например:
Любой код между директивами #nullable disable и #nullable restore будет исключен из nullable-контекста и тем самым не будет подлежать статическому анализу.
Нужно ли всегда проверять аргументы на null
Здравствуйте! Есть такой вот вопрос — нужно ли всегда поверять аргументы на null? наподобие:
Просто исключение выкинет и так.
Для каждой переменной вы должны знать, она имеет право быть null в вашей программе или нет. Это центральное соображение.
Теперь, для переменных, которые находятся внутри вашего модуля и не доступны снаружи, и которые, по вашему замыслу, не могут иметь значение null , вы должны обеспечить выполнение этого при каждом присваивании. То есть, если вы присваиваете значение из другой переменной, которая потенциально может быть null , вы должны проверять.
Да, и если значение приходит извне вашего модуля — например, это входной параметр, который не должен быть равен null — вы всё равно должны проверить «на входе», один раз, и в случае чего бросить исключение, потому что вызывающий код может и ошибиться.
Если к вам приходит не параметр, а вы вызываете чужой метод и берёте его возвращаемое значение, и в документации указывается, что этот метод не возвращает null , обычно дополнительные проверки не устраивают, т. к. возвращённый null — баг на стороне чужого модуля. Впрочем, если вы не доверяете коду чужого модуля, то можно добавить проверки тоже.
До остальных переменных, наоборот, вы должны проверять только при доступе «внутрь», на чтение, при попытке получить значение роля или вызвать метод.
Что считать здесь «модулем», зависит от вас. Часто это один или несколько тесно связанных классов. Но вы можете сделать модуль и крупнее (вам придётся больше держать в голове, но меньше писать обвязочного кода), или мельче, как вам удобно.
Учимся избегать null-значений в современном Java. Часть 1

В своем выступлении “Null References: The billion dollar mistake” (“Нулевые ссылки: ошибка на миллиард долларов”), Тони Хоар описывает реализацию нулевых ссылок в языках программирования ALGOL, что также по его словам стало ошибкой стоимостью в миллиард долларов. Такие авторитетные книги, как Clean Code: A Handbook of Agile Software Craftsmanship (“Чистый код: настольное руководство по гибкой разработке ПО”) рекомендуют использовать нуль как можно реже. В то же время в книге Bug Patterns in Java (“Шаблоны ошибок в Java”) проблемам, связанным с нулевыми значениями, посвящается аж целых три главы. Тема “What is a null pointer exception and how do I fix it” (“Что такое исключение нулевого значения и как его исправить”), обсуждаемая на Stack Overflow, набрала уже более 3 млн просмотров. Работа с нулевыми значениями и впрямь может вызвать немало сложностей.
Я не отношусь к тем, кто можем говорить лауреатам премии Тьюринга вроде Хоар, как проектировать языки программирования, но при этом все же не считаю null заведомо плохим. В этой и последующих статьях мы рассмотрим, что это вообще такое, когда стоит или не стоит эти значения использовать, а также, как их изящно обрабатывать.
В конкретно данной статье я поделюсь своими размышлениями об их использовании, а в следующей мы перейдем к рассмотрению практического применения некоторых методов работы с null, включая последние возможности Java 8.
Несмотря на то, что в центре нашего внимания будет именно Java, основные принципы и обсуждение должны охватывать объектно-ориентированные языки в целом. Текущая статья в первую очередь предназначена для менее опытных программистов и всех тех, кто испытывает сложности, сталкиваясь с null. Но, думаю, что даже бывалые разработчики смогут найти здесь для себя полезные приемы.
Чем опасен null?

Null — это особое значение, поскольку оно не ассоциируется ни с каким типом (можете смело проверить это инструкцией instanceof в отношении любого другого класса в JRE) и с радостью занимает место любого другого объекта в присвоениях переменных и вызовах методов. Именно в этом и кроются две основных его опасности:
- Каждое возвращаемое значение сложного типа может быть null.
- Каждое значение параметра со сложным типом может также быть null.
В результате любое возвращаемое значение или объект параметра — это потенциальное исключение нулевого указателя (NPE), возникающее в случае неправильной обработки.
Будет ли в таком случае решением проверять каждое возвращаемое значение и параметр на null? Очевидно, что идея не очень. Во-первых, код будет загроможден проверками на null. Во-вторых, разработчики будут вынуждены тратить драгоценное время на поиск правильного способа обработки нулевых значений, которые никогда не возникнут, а проверки на null будут сбивать с толку других разработчиков.
Может тогда вообще никогда не присваивать значениям null? Тоже неудачное предположение. Если учесть тот факт, что в каждом языке программирования есть пустое значение ( nil, undefined, None, void и т.д.), то наличие общего значения, обозначающего отсутствие чего-либо, чрезвычайно полезно.
Ошибка в условии цикла while может породить бесконечный цикл в любой программе, но это не делает такие циклы плохими по природе. Аналогично будет неверным считать, что null всегда неуместен только из-за того, что его неправильное использование может привести к ошибкам. Null — это наиболее естественное значение для выражения конкретных вещей, но при этом очень неподходящее для выражения других. Компетентные разработчики должны уметь различать эти случаи. В следующем разделе я как раз перейду к объяснению этого.
Когда Null уместен, а когда нет
В этой части я рассмотрю сценарии, в которых null возвращается из методов и передается им, поясню несколько традиционных альтернатив (т.е. предшествующих Java 8) и приведу доводы в пользу уместности встроенного типа вроде null в некоторых случаях.
Возвращение null
Одной из основных идей ООП является моделирование принципов области бизнеса, в которой работает наше ПО. Для этого мы определяем классы, соответствующие данным принципам и их атрибутам. Если речь заходит об использовании нулевых значений, я считаю важным рассмотреть эти типы классов отдельно от остальных.
Сейчас я работаю над проектом электронной записи пациентов Columna, в котором у нас есть классы, представляющие элементы рабочего процесса больницы вроде пациентов, медикаментов, врачей, больничных отделений, госпитализаций и пр. При моделировании любой области возникают случаи, когда нам нужно допустить для определенного элемента отсутствие значения. Предположим, что у нас есть класс, представляющий госпитализацию с атрибутами, которые ее описывают: больничное отделение, куда помещается пациент, причина госпитализации, ее время и т.д. Аналогичным образом у нас может быть класс, который представляет пациента с набором атрибутов вроде имени и номера социального страхования. В любой момент времени пациент может быть госпитализирован или нет. Говоря более формально, у нас есть связь типа “имеет” с мощностью 0..1.
Представим метод, извлекающий из базы данных информацию о госпитализации данного пациента:
Что должен возвращать этот метод для не госпитализированного пациента, если не null? Есть ли для выражения этого более точное значение? Спорю, что нет.
Существует и много других сценариев, в которых объект области напрямую ассоциирован с необязательными значениями в качестве атрибутов. Объект, представляющий медикаменты, содержит такие значения, как название препарата, его форму, активность, действующее вещество и т.д. Однако разнообразие медикаментов чрезвычайно обширно, начиная от антибактериальных кремов и заканчивая чаями из каннабиса (оставим или на ромашку заменим?:)), следовательно не все атрибуты будут актуальны для каждого. И снова возвращение null для отсутствующего атрибута выглядит очевидным способом сообщить, что допускается отсутствие значения. Есть ли для этого лучшая альтернатива?
Некоторые выступают за использование так называемого шаблона проектирования Null Object вместо null. Главная его идея в реализации пустого класса с минимумом или вообще без функциональности, т.е. нулевого объекта, который можно использовать вместо класса, содержащего действительную функциональность. Лучше всего данный шаблон показывает себя в сценариях, где нужно рекурсивно обойти структуру бинарного дерева в поиске суммы значений всех узлов. Для этого вы выполняете поиск в глубину и рекурсивно суммируете в каждом узле значения его левого и правого поддерева.
Дерево поиска обычно реализуется так, что каждый узел в нем имеет левого и правого потомка, которые являются либо также узлами, либо концевыми вершинами. Если такое представление дерева использует для концевых узлов null, то вам придется явно выполнять проверки на нулевых потомков, чтобы останавливать рекурсию в концевом узле, предотвращая попытку получения его значения. Вместо этого вам следует определить интерфейс Node с простым методом getValue() и реализовать его в представляющем узел классе, который вычисляет значение, складывая значения getValues() потомков, как показано на рисунке ниже. Реализуйте такой же интерфейс в классе, представляющем узел, и пусть класс концевого узла возвращает при вызове 0. Теперь нам больше не нужно различать код между концевым узлом и обычным. Необходимость явно проверять наличие null отпала вместе с риском получения исключения (NPE).
Применение шаблона нулевого объекта к структуре дерева
Для применения этого шаблона к примеру с госпитализацией нам потребуется создать интерфейс Admission . Затем мы определим класс AdmissionImpl для случаев, когда мы можем вернуть данные фактической госпитализации и класс AdmissionNullObjectImpl для случаев, когда не можем. Это позволит методу getAdmission() возвращать либо реальный AdmissionImpl , либо AdmissionNullObjectImpl . Так как вызывающий код использует общий тип Admission, мы можем рассматривать оба объекта одинаково, не рискуя получить исключение и не загромождая код проверками обработки null.
Тем не менее лично мне сложно найти применение данному шаблону в типичных базах кода производственной среды, где логика зачастую превосходит сложностью простое накопление чисел. Шаблоны существуют для упрощения решений, но при несоответствующем использовании добавляют сложность, одновременно лишаясь всех преимуществ.
Что будет возвращать класс AdmissionNullObject , когда в нем нет данных? Что он должен возвращать вместо объекта локации, когда вызывается getLocation() ? Какой будет подходящая начальная дата для возврата?
Во многих случаях вам придется писать код, который в определенный момент должен будет проверять что-то для обработки ложных значений. Так почему бы просто не использовать проверки на null изначально, избегая определения дополнительных усложняющих код классов? Бывают случаи, когда рассмотренный шаблон работает прекрасно, но на мой взгляд таких случаев в реальных условиях мало, поскольку его можно использовать только для объектов с методами, содержащими пустые значения, или когда вы можете вернуть что-то гармонично вписывающееся в поток окружающего кода.
Еще одна альтернатива — это использовать вместо null пустую string , если атрибутом является простая строка. Это избавляет нас от риска получить NPE, но при этом для правильной обработки пустого значения, скорее всего, потребуется столько же проверок, как и в случае с null. Кроме того, семантика будет отличаться: пустая строка представляет строку с пустым значением, а null не представляет ничего. Это становится актуальным, когда приложению нужно различать, ввел пользователь информацию в виде значения пустой строки или нет. Вы избавляетесь от риска получить NPE ценой применения несколько сбивающего с толку значения.
Теперь давайте рассмотрим применение null в коде, не моделирующем реальные концепции. Большинство классов в базе объектно-ориентированного кода не имеют соответствий в реальной жизни и существуют только в виде абстракции инфраструктуры, обработки и преобразования, а также для группировки связанной функциональности. При этом не до конца понятно, должно ли допускаться их представление нулевым значением. Если мы вызываем геттер для значения с очень абстрактным типом вроде TwoFactorComplexStrategyHandlerDelegateBean , стоит ли нам ожидать, что оно будет null?
Думаю, что нет. В случае класса, представляющего явления из реальной жизни, мы можем сделать обоснованное предположение. Но вышеприведенные типы классов не дают нам для этого никакой возможности, и разобраться в таких случаях можно только, читая код. По этой причине лучше избегать возвращения null вместо других типов, так как у разработчиков редко возникают причины ожидать возвращения null. Если вы этого не ждете, то зачем затрачивать усилия на защиту кода от этих значений?
Такие объекты де факто не должны быть представлены нулевым значением. Не только в нашей базе кода, но также и в JRE, библиотеках и фреймворках. Это можно назвать проблематичным, но вопрос насколько? Важно понимать, что несмотря на необходимость минимизировать использование null, мы не должны добиваться этого ценой переполнения баз кода сложными обходными маневрами с целью избежать появления таких значений. Как я уже отмечал, альтернативы в данном случае не всегда хороши. Однако есть случаи возвращения null, которых избежать легко, хотя встречаются они частенько. Возвращение null для классов в таких ситуациях вызывает подозрение. Например, иногда null возвращается из методов геттеров, где объект не может быть создан по определенным причинам вроде ошибки сервера при его вызове методом. Этот метод обрабатывает ошибку, регистрируя ее в инструкцию catch , и вместо создания экземпляра объекта возвращает null. Это легко исправить. Исключение должно использоваться для указания на неполадку и привлекать для ее обработки вызывающий код. Возвращение null в подобных сценариях будет сбивать с толку, не обеспечит обработку ошибки и может перенести проблему в другую часть кода, где было бы лучше использовать систему fail-fast, немедленно останавливающую работу приложения в случае потенциального сбоя.
Еще одно ошибочное использование null — это представление связи “имеет” с мощностью 0..* (в начале статьи я говорил о связях 0..1). Если вернуться к примеру с объектом пациента, то в нем пациент может иметь одного/нескольких зарегистрированных родственников или не иметь их совсем. Тем не менее я часто вижу, что люди возвращают null, когда для заполнения списка или других типов коллекций нет данных. Аналогичным образом null в качестве аргумента используется в методах для замещения отсутствующих коллекций. Но его применение в данном случае нежелательно по ряду причин. Он сбивает с толку, поскольку коллекцией мощность связи представляется идеально, а присвоив null типу коллекции, вы только добавляете ненужные риски в код. Цикл for , основанный на коллекции, ничего не делает, если эта коллекция пуста. В противном же случае он перебирает каждый элемент, выполняя определенные действия. Если вы позволите коллекции быть null, то выразите, по сути, пустой список, означающий, что в нем обрабатывать нечего. Однако при этом вам придется обеспечить выполнение проверки на null для каждого последующего метода, использующего эту коллекцию, иначе может возникнуть NPE. В случаях, когда нет данных для представления — вызывайте методы с пустыми коллекциями. Это также легко, как вызвать Collections.emptyList() , emptyMap() , emptySet() и т.д. Ненамного больше работы, чем объявить null, зато намного лучше.
Передача нулевых параметров
Из предыдущего раздела следует, что допустимо использовать нулевые аргументы при вызове методов с моделирующими область типами параметров, имеющими необязательные значения. При этом методы должны обеспечивать безопасное их использование. На практике же нулевые параметры применяются для гораздо большего спектра задач. Когда нам нужно предоставить такой параметр методу, мы должны обеспечить, чтобы все последующие обработки этого параметра были защищены от null, а это может оказаться нелегко. И даже несмотря на это, ваша программа может находиться в состоянии, скрывающем небезопасное поведение, что приведет к раскрытию проблемы только при других условиях. Предоставление нулевых параметров также добавляет риск вызвать ошибки при изменении кода в его следующих за их добавлением частях.

Как же полностью избежать нулевых параметров?
Нередко нам нужно использовать какую-либо функциональность в существующем методе, но текущий контекст вызова несколько иной, и мы либо не можем обеспечить все вызываемые методом значения, либо требуется больше информации, чем допускает его структура. Само собой мы не хотим повторять практически идентичный метод. Переиспользование является одним из столпов легко обслуживаемого кода, и одинаковая функциональность не должна реализовываться в нескольких местах, поскольку это не только усложнит поддержание синхронности кода, но и внесет риск появления ошибок. Поэтому мы изменяем существующий код под наши задачи и используем null для параметров, которые предоставляются не всегда. Некоторые методы по своей структуре могут принимать по меньшей мере несколько нулевых параметров, другие же не могут совсем. Тем не менее может оказаться затруднительным определить, какие параметры могут иметь значение null, и подходит ли оно для представления отсутствующего значения.
В таких языках, как Python, сигнатуры методов могут содержать предустановленные значения параметров, используемые при отсутствии значения аргумента в вызове метода. Тем не менее в Java такое невозможно. Ближайшим аналогом этого будет использовать перегрузку метода, когда в классе одна и та же сигнатура метода определяется несколько раз с разными параметрами. Один метод будет содержать всю функциональность и принимать весь набор параметров, а другие будут просто “декораторами” для вызова этого метода, каждый из которых будет получать свой поднабор параметров. Методы-декораторы определяют, какие значения должны использовать вместо отсутствующих параметров, чтобы вызывающему компоненту не пришлось их предоставлять. Жестко прописывая, какие значения должны предоставляться, когда у вызывающего их не хватает, мы уменьшаем риск появления ошибок и делаем принимаемые значения параметров явными.
Аналогичным образом можно разбирать конструкторы, но также можно использовать шаблон строитель. Он помогает минимизировать число параметров конструктора и удаляет необходимость передавать в него нулевые значения, предоставляя для создания класса объект Builder . Смысл данного шаблона в косвенном инстанцировании объекта через промежуточный класс builder . Для предоставления аргументов, которые вы могли бы передать в конструктор напрямую, вы вызываете соответствующий каждому сеттер. Если значение еще не было установлено, builder предоставит его. Затем вы вызываете для builder метод Create() , и он инстанцирует объект за вас. Как и в большинстве шаблонов, в строителе вводятся дополнительные классы и сложность, поэтому прежде, чем его использовать, убедитесь, что в этом есть смысл. Использование его только ради избежания вызова конструктора с парой нулевых значения, скорее всего, будет излишним.
В рассмотренном выше решении нулевые значения по-прежнему передаются в методы внутри объекта, но вызывающий и вызываемые методы спроектированы с учетом этого. Любой метод, вызываемый с одним из этих значений, по умолчанию должен корректно обрабатывать null. При этом нужно запретить сторонним вызывающим объектам передавать нулевые значения для параметров, которые не учтены в структуре, поскольку эти значения могут не поддерживаться, и правильная их обработка не гарантируется.
Воспринимайте null правильно
Все больше языков программирования начинают реализовывать определенные возможности с учетом безопасности. Например, в таких языках, как Clojure, F# и Rust переменные по умолчанию неизменяемы. Компилятор допускает изменение значений только для тех из них, которые объявлены со специальным модификатором. Такой способ использования опасных функций вынуждает программистов переопределять поведение по умолчанию, указывая тем самым, что они осознают степень риска и делают это не без весомых оснований. И к null нам стоит относиться аналогичным образом. Нужно придерживать это значение для особых случаев, где оно будет вполне уместно, ограничив при этом его использование в целом, опять же не ценой усложнения кода креативными обходными решениями. При каждом намерении использовать null вместо перемещающегося между методами значения следует учесть оправданность этого. В таком случае вы должны гарантировать, что в итоге оно не окажется в том месте, где может вызвать проблемы, и другие разработчики будут знать, что значение может быть null. Если же этого обеспечить нельзя, то лучше рассмотреть другие варианты.