Всем привет!
Решил разработать для себя с нуля форму оповещения для работы с заметками с проблемным договорами контрагентов.
Пишу тут, что уточнить у вас об одной детали: проблема в том, что у меня выводить список как завершенных, так и не завершенных задач.
Буду рад советам.
Заранее спасибо.
Итак:
имеется регистр сведений "Заметки"(Непериодический/Независимый)

Измерения:
-Пользователь;(ТекущийПользователь)
-Договор(ДокументСсылка)
-Статус(Перечисления)
-Комментарий(Строка)
-Завершено(Булево)

Ресурсы:
-ДатаОповещения
-ДеньНедели
-НапомнитьЧерез

В модуле ОбщегоНазначения:

```1c
    Функция ПолучитьДанныеЗаметокНаСервере()Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Заметки.Пользователь КАК Пользователь,
    | Заметки.Статус КАК Статус,
    | Заметки.Документ КАК Документ,
    | Заметки.ДатаОповещения КАК ДатаОповещения,
    | Заметки.Завершено КАК Завершено
    |ИЗ
    | РегистрСведений.Заметки КАК Заметки
    |ГДЕ
    | Заметки.Пользователь = &Пользователь
    | И Заметки.Завершено = &Завершено";

    //Запрос.УстановитьПараметр("ДатаОповещения", ДатаОповещения);
    Запрос.УстановитьПараметр("Пользователь", ОбщегоНазначения.ТекущийПользователь());
    Запрос.УстановитьПараметр("Завершено", Ложь);

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий()Цикл
    КонецЦикла;
    КонецФункции
```

В модуле управляемого приложения:

```1c
    Процедура ОболочкаОбработчика ()Экспорт
    ОбработатьОжидание();
    КонецПроцедуры
    Процедура ОбработатьОжидание()Экспорт
    ДатаСегодня = Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
    ДатаОповестить = Формат(ОбщегоНазначения.ПолучитьДанныеЗаметокНаСервере(),"ДФ=dd.MM.yyyy");
    АктивностьЗаметки = ОбщегоНазначения.ПолучитьДанныеЗаметокНаСервере();
    Если ДатаСегодня > ДатаОповестить ИЛИ ДатаСегодня = ДатаОповестить Тогда
    ОткрытьФорму("ОбщаяФорма.ФормаЗаметок");
    КонецЕсли;

    КонецПроцедуры
    ПодключитьОбработчикОжидания("ОболочкаОбработчика",3,Ложь);
```
---
как вариант, если запрос пустой, тогда возвращать дату 31.12.3999.
Но сама бизнес-логика мне не совсем понятна. Зачем каждые 3 секунды запускать обработчик ожидания с запросом? Это, мягко говоря, непроизводительно.
---
Функция ПолучитьДанныеЗаметокНаСервере() ничего не возвращает, значит ДатаОповестить всегда будет пустая строка. И строка ДатаСегодня всегда будет больше ДатаОповестить. Следовательно всегда будет выполняться условие ДатаСегодня > ДатаОповестить и открываться общая форма ФормаЗаметок.
---
Хорошо, тогда сейчас попробую прописать
```1c
    Возврат ВыборкаДетальныеЗаписи.ДатаОповещения
```
---
не всегда сработает. Если результат запроса будет пустой, то так же вернется Неопределено и пойдет по сценарию выше.
---
Вы правы, форма открывается даже когда запрос пустой.
Я вот думаю, может быть через таблицу значений писать?
---
как вариант, если запрос пустой, тогда возвращать дату 31.12.3999.
Но сама бизнес-логика мне не совсем понятна. Зачем каждые 3 секунды запускать обработчик ожидания с запросом? Это, мягко говоря, непроизводительно.
---
Поясню, это для теста я поставил 3 секунды.
А так есть заказчик, который хочет, чтобы оповещение происходило каждые 15 минут.
---
```1c
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий()Цикл
    Если НЕ РезультатЗапроса.Пустой() Тогда
    Возврат ВыборкаДетальныеЗаписи.ДатаОповещения;
    Иначе
    Возврат Дата('39991231');
    КонецЕсли;
    КонецЦикла;
```

Так же открывается форма заметок, даже если их нет в регистре.
---
Сорри, сглупил..
Вот так сработало
Если Не РезультатЗапроса.Пустой() Тогда
  Пока ВыборкаДетальныеЗаписи.Следующий()Цикл
   Возврат ВыборкаДетальныеЗаписи.ДатаОповещения;
  КонецЦикла;
 Иначе
  Возврат Дата('39991231');
 КонецЕсли;
---
это уже лучше. Только зачем в запросе получать кучу полей, которые никак не обрабатываются. Из них нужно только одно поле ДатаОповещение, которое будет меньше или равно текущей дате. Да и оно не обязательно.

```1c
    Функция ПолучитьДанныеЗаметокНаСервере()Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | 1
    |ИЗ
    | РегистрСведений.Заметки КАК Заметки
    |ГДЕ
    | НЕ Заметки.Завершено
    | И Заметки.ДатаОповещения <= &ДатаОповещения";

    Запрос.УстановитьПараметр("ДатаОповещения", КонецДня(ТекущаяДата()));

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

    Процедура ОбработатьОжидание()Экспорт
    Если ПолучитьДанныеЗаметокНаСервере() Тогда
    ОткрытьФорму("ОбщаяФорма.ФормаЗаметок");
    КонецЕсли;
    КонецПроцедуры
```
---
Спасибо. Я просто забыл о них =)
А так обязательно уберу. Благодарю за советы!)
---
Я бы еще спустил измерение "комментарий" в ресурсы, это же комментарий к статусу (индексы по полям текстовым вам зачем), со временем этот регистр физически много весить будет и как следствие тупить... а вообще посмотрите как в БСП сделано "Заметки", плюс вместо обработчика ожидания надо использовать фоновые задания