helpf.pro
Регистрация

Проверка уникальности задачи

Leshka
07.02.2011 11:54Прочитано: 1942
Здравствуйте.
Задача: Реализовать автоматическое создание задачи с напоминанием через определенное количество дней, при записи документа.
Не получается: Сделать проверку на уникальность задачи. Пока что сколько раз документ запишешь - столько задач и создастся. Не знаю как сделать проверку.
Подскажите плз.

Код 1C v 8.х
 
//Через сколько дней напомнить(берем из формы)
КолДней = Срок;
ОдинДень = 60*60*24;
//Создаем новую задачу, заполняем реквизиты
НовЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
НовЗадача.Оповещение = Истина;
НовЗадача.СрокОповещения = ТекущаяДата() + ОдинДень*(КолДней-1);
НовЗадача.Дата = Дата;
НовЗадача.СрокИсполнения = ТекущаяДата() + ОдинДень*КолДней;
НовЗадача.Наименование = "Проверить ремонт аппарата по приему на ремонт № " + Номер + " от " + Дата;
НовЗадача.Инициатор = ПараметрыСеанса.ТекущийПользователь;
НовЗадача.Исполнитель = ПараметрыСеанса.ТекущийПользователь;
НовЗадача.Объект = ЭтотОбъект.Ссылка;
НовЗадача.Записать();
//Диалоговое окно Да/Нет
Ответ = Вопрос("Создана новая задача, просмотреть форму созданной задачи?",РежимДиалогаВопрос.ДаНет);
//Если да - смотрим форму задачи
Если Ответ=КодВозвратаДиалога.Да Тогда
ФормаНовой = НовЗадача.ПолучитьФорму();
ФормаНовой.Открыть();
КонецЕсли;


Я пытался экспериментировать со вставкой этого цикла с разными изменениями, но ничего не получилось.
(почему код вверху и внизу отформатирован по разному я не знаю, делал одинаково)))

Код 1C v 8.х
 Выборка = Задачи.ЗадачиПользователя.Выбрать();
Пока Выборка.Следующий() Цикл
Если ЭтотОбъект.Номер = Выборка.Объект.Номер
Тогда
Сообщить("Задача уже внесена в список ваших задач");
Иначе
//Создавать задачу
КонецЕсли;
КонецЦикла;



Спасибо
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
07.02.2011 12:02Ответ № 1
(0) Leshka, проще всего сделать в задаче реквизит с типом документ который создает эту задачу и сам себя в нее записывает!
А потом просто делай отбор по документу!
Leshka
07.02.2011 12:23Ответ № 2
А зачем новый реквезит, если для этого же есть реквизит объект, я в него добавил свой документ. И пытаюсь обратиться к нему .
Код 1C v 8.х
 НовЗадача.Объект = ЭтотОбъект.Ссылка;   
- Я присваиваю этому реквизиту значение ссылки на свой документ. Потом
Код 1C v 8.х
 Выборка.Объект.Номер    

пытаюсь получить номер этого документа.
Что то я не правильно понимаю...)
В чем ошибаюсь?
E_Migachev
07.02.2011 13:20Ответ № 3
(2) Leshka, опс *09 - не заметил
зачем номер? - присваивай ссылку! потом по ссылке и проверяй!
Leshka
07.02.2011 17:42Ответ № 4
Я мучаюсь и мучаюсь дальше. Над вещами, быть может смешными для вас, но проблемными для меня. Итак:
Повторюсь:
Мне надо сделать проверку на уникальность записываемой задачи. Новая задача записывается автоматом при записи документа. Недавно проблема была как сделать проверку на уникальность. Пока дошел до вот этого, благодоря (3) E_Migachev, :
Код 1C v 8.х
 
Выборка = Задачи.ЗадачиПользователя.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Объект.Ссылка = ЭтотОбъект.Ссылка
Тогда Дальше = Ложь
Иначе
Дальше = Истина
КонецЕсли;
КонецЦикла;

Если Дальше = Истина
Тогда
....
создание задачи
...
Иначе
Сообщить("Такая задача уже есть");
КонецЕсли


Проверка у меня работает с последним элементом выборки задач, и если я пытаюсь перезаписать последний документ, то все работает как надо, а если перезапишу какой нибудь из прошлых, на который задача уже была создана - все равно задачу создаст.
В общем проблема : Параметру Дальше должно присваиваться значение Ложь, если во всей выборке задач встречается хоть одна с номером документа-родителя, который уже создан. Во всех остальных случаях Дальше = Истина. Повторюсь, у меня параметр Дальше принимает значение Ложь в том случае, если номер последней созданной задачи равняется номеру документа, из которого я ее автоматически создаю.
Я просто не знаю как реализовать этот сравнивающих просмотр по выборке.
Спасибо.
snfr1c
07.02.2011 18:11Ответ № 5
(0) на мой взгляд необходимо определить в чём выражается уникальность задачи. в вашем случае так как задачи все разные (как объект) то система и даёт перезаписывать. если уникальность задачи по типу. если уникальность в типе - "напомнить" то проверять по этому типу. и проверку лучше всего выполнять запросом.
если уникальность это создание задачи со ссылкой на какой либо документ, то запросом можно быстро получить результат или если не запросом то выборкой с отбором. и если в результате есть хотя бы один элемент - значит задача уже была создана.
snfr1c
07.02.2011 18:16Ответ № 6
ещё вариант кода без использования сравнение на булево
Код 1C v 8.х
 
Дальше = 1;//будем считать что это ложь
Выборка = Задачи.ЗадачиПользователя.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.объект.Ссылка = ЭтотОбъект.Ссылка Тогда
Дальше = 0
КонецЕсли;
КонецЦикла;

Если Дальше = 1 Тогда
....
создание задачи
...
Иначе
Сообщить("Такая задача уже есть");
КонецЕсли

snfr1c
07.02.2011 18:17Ответ № 7
в первой строке опечатался
Код 1C v 8.х
 Дальше = 1;//будем считать что это истина   
Leshka
07.02.2011 21:47Ответ № 8
(5) snfr1c, Я не написал, что в реквизите Объект у ЗадачиПользователя я удалил все данные и оставил только тот документ, для которого будет создаваться задача. По объекту я и собираюсь определять уникальность.
Собственно у меня теперь все работает, не хватало одного оператора в цикле, который бы при нахождении первого же совпадения останавливал бы его.(ПРЕРВАТЬ)
Собственно код выглядит так:
Код 1C v 8.х
 

Процедура ПриЗаписи(Отказ)
//Проверка на уникальность задачи
Выборка = Задачи.ЗадачиПользователя.Выбрать();
Пока Выборка.Следующий()
Цикл
Если Выборка.Объект.Ссылка = ЭтотОбъект.Ссылка
Тогда Дальше = 0; //Считаем что это Ложь
ПРЕРВАТЬ //При первом же совпадении прерываем цикл
Иначе Дальше = 1 //Считаем что это Истина
КонецЕсли;
КонецЦикла;
//Если задача для этого документа не найдена, создаем новую
Если Дальше = 1
Тогда
//Через сколько дней напомнить(берем из формы)
КолДней = Срок;
ОдинДень = 60*60*24;
//Создаем новую задачу, заполняем реквизиты
НовЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
НовЗадача.Оповещение = Истина;
НовЗадача.СрокОповещения = ТекущаяДата() + ОдинДень*(КолДней-1);
НовЗадача.Дата = Дата;
НовЗадача.СрокИсполнения = ТекущаяДата() + ОдинДень*КолДней;
НовЗадача.Наименование = "Проверить ремонт аппарата по приему на ремонт № " + Номер + " от " + Дата;
НовЗадача.Инициатор = ПараметрыСеанса.ТекущийПользователь;
НовЗадача.Исполнитель = ПараметрыСеанса.ТекущийПользователь;
НовЗадача.Объект = ЭтотОбъект.Ссылка;
НовЗадача.НомерОснования = ЭтотОбъект.Номер;
НовЗадача.Записать();
//Оповещаем пользователя о созданной задаче
Ответ = Вопрос("Создана новая задача. Открыть задачу?",РежимДиалогаВопрос.ДаНет);
Если Ответ=КодВозвратаДиалога.Да
Тогда
ФормаНовой = НовЗадача.ПолучитьФорму();
ФормаНовой.Открыть();
КонецЕсли;
//Если задача для этого документа найдена, оповещаем пользователя
Иначе Ответ = Вопрос("Задача по данному документу уже создана ранее.",РежимДиалогаВопрос.ОК);
КонецЕсли;
КонецПроцедуры



Спасибо большое, сайт очень нравится, я тут надолго))
Два месяца в франчайзе, начинаю с полного ноля,)
Leshka
07.02.2011 22:16Ответ № 9
Мои сори, строка
НовЗадача.НомерОснования = ЭтотОбъект.Номер; - не нужна, осталась от экспериментов.
Leshka
08.02.2011 07:24Ответ № 10
Вопрос закрыт!
Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.