В процессе разработки на платформе 1С программисты часто сталкиваются с ситуациями, когда код, успешно работающий в «Консоли запросов», выдает пустой результат при выполнении непосредственно в конфигураторе или модуле формы. Рассмотрим подробно, почему это происходит и как правильно организовать обмен сообщениями между пользователями.
Основная причина, по которой результат запроса кажется пустым или вызывает ошибку типа «Значение не является значением объектного типа», кроется в конфликте имен. Если в модуле формы или документа объявлен реквизит с именем Результат, то при выполнении запроса происходит перезапись этой переменной, что приводит к непредсказуемому поведению платформы.
Разберем по шагам, как избежать этой ошибки:
РезультатЗапроса или ВыборкаДанных.Пустой() перед тем, как обращаться к данным.Рассмотрим пример правильного кода:
ЗапросЗадачи = Новый Запрос;
ЗапросЗадачи.Текст =
"ВЫБРАТЬ
| СотрудникиПользователя.Пользователь.Ссылка КАК Пользователь
|ИЗ
| РегистрСведений.СотрудникиПользователя КАК СотрудникиПользователя
|ГДЕ
| СотрудникиПользователя.Сотрудник = &Сотрудник";
ЗапросЗадачи.УстановитьПараметр("Сотрудник", Ответственный);
РезультатЗапроса = ЗапросЗадачи.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Значение = "";
Иначе
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Значение = Выборка.Пользователь;
КонецЕсли;
Система взаимодействия позволяет организовать чаты и оповещения внутри 1С. Основная сложность при работе с ней заключается в правильной инициализации обсуждений и передаче идентификаторов.
Чтобы отправить уведомление и обеспечить возможность перехода к задаче по ссылке, проанализируем следующий алгоритм:
ПолучитьНавигационнуюСсылку().Пример реализации процедуры оповещения:
&НаСервере
Процедура ОповеститьПользователя(ИмяПользователяИБ) Экспорт
_пользователь = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(Пользователи.НайтиПоИмени(ИмяПользователяИБ).ИдентификаторПользователяИБ);
Отбор = Новый ОтборОбсужденийСистемыВзаимодействия;
Отбор.Ключ = СокрЛП(Объект.Ссылка);
МОбсуждение = СистемаВзаимодействия.ПолучитьОбсуждения(Отбор);
Если МОбсуждение.Количество() = 0 Тогда
Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение();
Обсуждение.Ключ = СокрЛП(Объект.Ссылка);
Обсуждение.Заголовок = Объект.Описание;
Обсуждение.Участники.Добавить(_пользователь);
Обсуждение.Записать();
Иначе
Обсуждение = МОбсуждение[0];
КонецЕсли;
СообщениеСВ = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
СообщениеСВ.Автор = СистемаВзаимодействия.ИдентификаторТекущегоПользователя();
СообщениеСВ.Текст = "Новая задача: " + ПолучитьНавигационнуюСсылку(Объект.Ссылка);
СообщениеСВ.Записать();
КонецПроцедуры
Важные рекомендации:
УстановитьПривилегированныйРежим(Истина), убедитесь, что это необходимо для записи данных в регистры взаимодействия, чтобы не нарушать права доступа.СистемаВзаимодействия работает асинхронно.Идентификатор, всегда проверяйте, что Обсуждение успешно создано и является объектом, а не пустой ссылкой или массивом.