Почему запрос в 1С возвращает пустое значение и как настроить оповещения в Системе взаимодействия?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Промышленность, строительство и АПК
← На главную

В процессе разработки на платформе 1С программисты часто сталкиваются с ситуациями, когда код, успешно работающий в «Консоли запросов», выдает пустой результат при выполнении непосредственно в конфигураторе или модуле формы. Рассмотрим подробно, почему это происходит и как правильно организовать обмен сообщениями между пользователями.

Решение проблемы пустого результата запроса

Основная причина, по которой результат запроса кажется пустым или вызывает ошибку типа «Значение не является значением объектного типа», кроется в конфликте имен. Если в модуле формы или документа объявлен реквизит с именем Результат, то при выполнении запроса происходит перезапись этой переменной, что приводит к непредсказуемому поведению платформы.

Разберем по шагам, как избежать этой ошибки:

  1. Используйте уникальные имена для переменных, которые хранят результат выполнения запроса, например, РезультатЗапроса или ВыборкаДанных.
  2. Всегда проверяйте результат на наличие данных с помощью метода Пустой() перед тем, как обращаться к данным.
  3. Для получения данных используйте обход выборки, это надежнее и производительнее.

Рассмотрим пример правильного кода:


ЗапросЗадачи = Новый Запрос;
ЗапросЗадачи.Текст = 
    "ВЫБРАТЬ
    |    СотрудникиПользователя.Пользователь.Ссылка КАК Пользователь
    |ИЗ
    |    РегистрСведений.СотрудникиПользователя КАК СотрудникиПользователя
    |ГДЕ
    |    СотрудникиПользователя.Сотрудник = &Сотрудник";

ЗапросЗадачи.УстановитьПараметр("Сотрудник", Ответственный);

РезультатЗапроса = ЗапросЗадачи.Выполнить();

Если РезультатЗапроса.Пустой() Тогда
    Значение = "";
Иначе
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Значение = Выборка.Пользователь;
КонецЕсли;

Работа с Системой взаимодействия и оповещение пользователей

Система взаимодействия позволяет организовать чаты и оповещения внутри 1С. Основная сложность при работе с ней заключается в правильной инициализации обсуждений и передаче идентификаторов.

Чтобы отправить уведомление и обеспечить возможность перехода к задаче по ссылке, проанализируем следующий алгоритм:

  1. Поиск или создание обсуждения: Сначала проверяем, создано ли уже обсуждение для данного объекта (используя ключ, равный ссылке на документ).
  2. Установка идентификатора: Получаем идентификатор обсуждения для отправки сообщения.
  3. Передача навигационной ссылки: Чтобы пользователь мог открыть документ из сообщения, необходимо использовать метод ПолучитьНавигационнуюСсылку().

Пример реализации процедуры оповещения:


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

Важные рекомендации:

← На главную