При подготовке к сертификационному экзамену «1С:Профессионал» по платформе версии 8.3 разработчики часто сталкиваются с вопросом, который ставит в тупик даже опытных специалистов. Вопрос касается свойства «Оповещение» сообщения Системы взаимодействия (СВ) и условий его обязательного заполнения при программном создании объекта. Проанализируем эту ситуацию, разберем техническую архитектуру работы с сообщениями и выясним, почему официальный ответ в тестах может казаться нелогичным на первый взгляд.
Первым делом проанализируем синтакс-помощник и документацию на ИТС. Если мы попытаемся найти свойство Оповещение у объекта СообщениеСистемыВзаимодействия, то потерпим неудачу. Такого свойства в объектной модели платформы 1С попросту не существует. Исходя из логики работы платформы и разборов экспертов, мы можем сделать вывод, что в формулировке экзаменационного вопроса допущена техническая опечатка.
Под термином «Оповещение» в контексте данного вопроса составители тестов подразумевают идентификатор обсуждения (свойство Обсуждение). Именно это свойство является критически важным при инициализации нового сообщения. Рассмотрим подробнее, как именно создается сообщение в коде, чтобы понять логику «обязательности».
Разберем по шагам процесс генерации нового сообщения в Системе взаимодействия. Для этого используется менеджер системы взаимодействия и метод фабрики объектов. Посмотрим на типовой пример кода:
// Получаем идентификатор обсуждения (например, по уникальному ключу или контексту)
ИдентификаторОбсуждения = СистемаВзаимодействия.ПолучитьИдентификаторОбсуждения("УникальныйКлючОбсуждения");
// Создаем объект сообщения
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения);
НовоеСообщение.Текст = "Приветственное сообщение в системе";
НовоеСообщение.Записать();
Проанализируем метод СоздатьСообщение(). В отличие от многих других объектов платформы 1С, где объект можно создать пустым конструктором Новый, сообщение СВ создается исключительно через менеджер, и параметр ИдентификаторОбсуждения является для этого метода обязательным.
Выясним причину такой жесткой привязки. Сообщение в Системе взаимодействия не может существовать автономно. Оно всегда является частью конкретной цепочки (обсуждения). Система должна сразу понимать, в какой «канал» или «чат» будет направлена информация, чтобы корректно инициализировать объект в оперативной памяти и подготовить его к последующей записи в базу данных сервера СВ.
Существует заблуждение (отраженное в одном из вариантов ответа теста), что заполнение этого свойства обязательно только для контекстных сообщений (сообщений, привязанных к конкретным объектам базы данных, таким как документы или элементы справочников). Однако, если мы разберем механику работы системы глубже, то увидим следующее:
ДокументСсылка.РеализацияТоваровУслуг). Чтобы отправить сообщение в такое обсуждение, разработчик сначала вызывает метод ПолучитьИдентификаторОбсуждения(), передавая туда ссылку на объект, а затем полученный идентификатор обязательно передает в метод создания сообщения.Таким образом, свойство (идентификатор обсуждения, ошибочно названный «Оповещением») обязательно должно быть заполнено в любом случае, вне зависимости от того, является ли сообщение контекстным или нет. Это подтверждает правильность первого варианта ответа в аттестационной базе.
Чтобы окончательно закрыть вопрос с термином «Оповещение», проанализируем, как на самом деле работают уведомления. В Системе взаимодействия нет свойства сообщения, отвечающего за «включение» оповещения. Вместо этого работают следующие механизмы:
Во-первых, при вызове метода Записать() платформа автоматически анализирует состав участников обсуждения и их настройки уведомлений. Если у пользователя включен «колокольчик» для данного обсуждения, он получит оповещение в интерфейсе или push-уведомление на мобильное устройство.
Во-вторых, программно можно управлять списком получателей, если это требуется для специфических задач, но это делается через другие коллекции и методы, а не через мифическое свойство «Оповещение» при создании сообщения.
Рассмотрим ситуацию, когда идентификатор обсуждения еще не существует (например, при первом обращении к контекстному обсуждению нового документа). Разберем правильную последовательность действий:
// 1. Пытаемся получить идентификатор для конкретного документа
КлючОбсуждения = СистемаВзаимодействия.ПолучитьИдентификаторОбсуждения(СсылкаНаДокумент);
// 2. Если обсуждение еще не создано, система может вернуть Неопределено
// (в зависимости от параметров метода), тогда его нужно инициировать.
// Но в методе СоздатьСообщение параметр ДОЛЖЕН БЫТЬ заполнен.
Если КлючОбсуждения <> Неопределено Тогда
Сообщение = СистемаВзаимодействия.СоздатьСообщение(КлючОбсуждения);
Сообщение.Текст = "Проверьте правильность заполнения реквизитов!";
Сообщение.Записать();
КонецЕсли;
Если попытаться передать в СоздатьСообщение() пустую ссылку или Неопределено, платформа сгенерирует исключение (Run-time error), что еще раз доказывает техническую необходимость и обязательность заполнения данного параметра.
Подводя итог нашему анализу, зафиксируем ключевые моменты, которые помогут при сдаче экзамена и в реальной практике:
СоздатьСообщение() не имеет конструктора без параметров, что делает заполнение идентификатора обязательным на уровне синтаксиса платформы.Рассмотренная ситуация — классический пример того, как неточности в формулировках могут запутать специалиста. Однако знание базовых принципов объектной модели 1С и понимание работы менеджеров системы позволяет быстро найти верное решение, даже если терминология в вопросе кажется некорректной.