Как устранить дублирование напоминаний о днях рождения в списке задач 1С:Комплексная автоматизация 1.1

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

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

Анализ архитектурной связи: Физлица и Сотрудники

Первым делом проанализируем структуру данных в КА 1.1. В этой конфигурации (как и в УПП 1.3) существует фундаментальное различие между справочниками ФизическиеЛица и СотрудникиОрганизаций. Одно физическое лицо может быть принято на работу несколько раз (например, после увольнения или как внутренний совместитель), что создает несколько записей в справочнике СотрудникиОрганизаций, привязанных к одному элементу ФизическиеЛица.

Разберем пример кода, который часто становится источником проблемы в модуле формы элемента ФизическиеЛица в процедуре ПослеЗаписи:


МенеджерЗаписи = РегистрыСведений.ДниРожденияСотрудников.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Сотрудник = Ссылка; // Здесь Ссылка — это ФизическоеЛицо
МенеджерЗаписи.ДатаРождения = ДатаРождения;
Если ЗначениеЗаполнено(ДатаРождения) Тогда            
    МенеджерЗаписи.Записать();
Иначе
    // Логика удаления или оповещения
КонецЕсли;

Проблема заключается в следующем: если ваше измерение в регистре называется Сотрудник, но вы записываете туда ссылку на ФизическоеЛицо, то при последующем соединении этого регистра со справочником сотрудников в запросе (который формирует список задач), система найдет все когда-либо созданные карточки сотрудников для этого человека. Для нового сотрудника запись в базе всего одна, поэтому дублей нет. Для «старого» сотрудника может быть несколько карточек, что и дает умножение строк.

Корректировка запроса в списке задач

Выясним причину дублирования в самом интерфейсе. Список задач на рабочем столе в КА 1.1 обычно формируется динамически через общий модуль УправлениеЗадачами. Если вы изменили запрос, чтобы данные брались из вашего нового регистра ДниРожденияСотрудников, убедитесь, что вы используете оператор РАЗЛИЧНЫЕ.

Рассмотрим, как должен выглядеть фрагмент правильного запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДниРождения.Сотрудник КАК Сотрудник,
    ДниРождения.ДатаРождения КАК ДатаРождения
ИЗ
    РегистрСведений.ДниРожденияСотрудников КАК ДниРождения
ГДЕ
    ДниРождения.ДатаРождения МЕЖДУ &НачалоПериода И &КонецПериода

Использование РАЗЛИЧНЫЕ (DISTINCT) гарантирует, что даже если в результате соединений с кадровыми таблицами возникнет избыточность, в итоговую таблицу задач попадет только одна уникальная запись для каждого человека.

Проверка существования активных задач

Посмотрим на ситуацию со стороны объектов Задача. В КА 1.1 напоминания часто реализуются через создание реальных экземпляров метаданных типа ЗадачаОбъект. Если при каждом пересохранении физлица ваш код инициирует создание новой задачи, не проверяя, существует ли уже такая, вы получите бесконечный список дублей.

Проанализируем алгоритм, который поможет избежать этого:

  1. Перед записью в РС или созданием задачи выполним поиск уже существующей активной задачи по данному сотруднику.
  2. Если задача найдена — обновим её параметры (если нужно).
  3. Если задача не найдена — создадим новую.

Пример реализации проверки перед записью:


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

Запрос.УстановитьПараметр("ФизЛицо", Ссылка);
РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда
    // Только здесь создаем новую задачу
КонецЕсли;

Механизм обновления формы списка

Проанализируем еще одну возможную причину: поведение кнопки Обновить. В обычных формах 1С 8.2/8.3 список задач часто представляет собой ТабличноеПоле, связанное с ТаблицейЗначений. Если в коде обработчика кнопки «Обновить» или в процедуре заполнения таблицы отсутствует метод Очистить(), то новые данные просто добавляются к уже существующим в памяти формы.

Убедитесь, что в процедуре обновления списка присутствует следующий шаг:


// Перед заполнением списка задач из запроса
ТаблицаЗадачНаФорме.Очистить(); 

// Далее идет заполнение таблицы из результата запроса
Для Каждого СтрокаРезультата Из РезультатЗапроса Цикл
    НоваяСтрока = ТаблицаЗадачНаФорме.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
КонецЦикла;

Итоговые рекомендации

Подводя итог, для решения проблемы дублирования напоминаний в 1С:КА 1.1, выполним следующие действия:

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

← На главную