Как проверить есть ли уже такой документ? и если есть открыть его и изменить дату.

1. arsen_botashev 20.02.19 12:06 Сейчас в теме
Здравствуйте
На форме БП есть кнопка создать на основании, то есть на оснвоании этого бп создается документ.
Как проверить при создании на основании есть ли уже такой документ, и если есть октрыть его, и просто поменять дату на сегодняшнюю?
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)  

	Если ТипЗнч(ДанныеЗаполнения) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда
		Док = Документы.ОценкаЗначимостиРиска.НайтиПоНомеру(ЭтотОбъект.Номер);
		Если Док.Номер = ЭтотОбъект.Номер Тогда
			Док.Дата = ТекущаяДата();
		КонецЕсли;
		Подразделение = ДанныеЗаполнения.Подразделение;
		БизнесПроцесс = ДанныеЗаполнения.Ссылка;
		Для Каждого ТекСтрокаПричины Из ДанныеЗаполнения.Причины Цикл
			НоваяСтрока = Оценка.Добавить();
			НоваяСтрока.Ответственный = ТекСтрокаПричины.Ответственный;
			НоваяСтрока.Риск = ТекСтрокаПричины.Риск;
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры
Показать


Не работает, подскажите что не так?
По теме из базы знаний
Найденные решения
9. dhurricane 20.02.19 12:57 Сейчас в теме
(8) Реквизит с ссылкой на бизнес-процесс - это и есть связь, о которой я спрашивал. :-)

Рассмотрите для решения задачи событие документа "ОбработкаПолученияФормы", находится оно в модуле менеджера. Здесь можно переопределить открываемую форму или же исправить параметры открытия. Например так:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	Если ВидФормы <> "ФормаОбъекта" Тогда
		Возврат;
	КонецЕсли;
	
	// Обрабатываем стандартный параметр документа
	Основание = Параметры.Основание;
	
	Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда
	
		// Если Основание - наш бизнес-процесс,
		// пытаемся найти уже имеющиеся подчиненные документы
		ПодчиненныйДокумент = НайтиПодчиненныйДокумент(Основание);
		
		// Если подчиненный документ есть, задаем стандартный параметр Ключ,
		// благодаря которому должна открыться форма документа по ссылке (ключу).
		Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
			Параметры.Вставить("Ключ", ПодчиненныйДокумент);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Функция НайтиПодчиненныйДокумент(Основание) 

	ПодчиненныйДокумент = Документы.ОценкаЗначимостиРиска.ПустаяСсылка();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Основание", Основание);
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДД.Ссылка
		|ИЗ
		|	Документ.ОценкаЗначимостиРиска КАК ДД
		|ГДЕ
		|	ДД.Основание = &Основание
		|	И ДД.Проведен";
		
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Выборка = Результат.Выбрать();
	Выборка.Следующий();
	
	Возврат Выборка.Ссылка;
	
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AndKovalchuk 192 20.02.19 12:13 Сейчас в теме
(1) А бизнес-процесса разве есть номер?

Хотя ошибся. Но во время ввода на основании у документа тоже номера пока нет.
6. dhurricane 20.02.19 12:32 Сейчас в теме
(1) Не уверен на счет даты, но могу подсказать, как открыть уже существующий документ. Уточните только, какая у Вас связь между бизнес-процессом и подчиненным документом? По коду не удалось понять.
8. arsen_botashev 20.02.19 12:46 Сейчас в теме
(6)Связи наверное нет, просто ввод на основании.Можео проверить есть ли такой документ и открыть его с помощью реквизита БизнесПроцесс(Основание).
На форме документа есть реквизит БизнесПроцесс(Основание), при воздании на основании, в этот реквизит передается ссылка Этого БП, на основании которого создан этот документ.
То есть надо проверить При создании На основании есть ли документ у которого этот реквизит = ссылку на этот бп.
и если равен открыть этот документ.

Как это реализовать?
9. dhurricane 20.02.19 12:57 Сейчас в теме
(8) Реквизит с ссылкой на бизнес-процесс - это и есть связь, о которой я спрашивал. :-)

Рассмотрите для решения задачи событие документа "ОбработкаПолученияФормы", находится оно в модуле менеджера. Здесь можно переопределить открываемую форму или же исправить параметры открытия. Например так:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	Если ВидФормы <> "ФормаОбъекта" Тогда
		Возврат;
	КонецЕсли;
	
	// Обрабатываем стандартный параметр документа
	Основание = Параметры.Основание;
	
	Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда
	
		// Если Основание - наш бизнес-процесс,
		// пытаемся найти уже имеющиеся подчиненные документы
		ПодчиненныйДокумент = НайтиПодчиненныйДокумент(Основание);
		
		// Если подчиненный документ есть, задаем стандартный параметр Ключ,
		// благодаря которому должна открыться форма документа по ссылке (ключу).
		Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
			Параметры.Вставить("Ключ", ПодчиненныйДокумент);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Функция НайтиПодчиненныйДокумент(Основание) 

	ПодчиненныйДокумент = Документы.ОценкаЗначимостиРиска.ПустаяСсылка();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Основание", Основание);
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДД.Ссылка
		|ИЗ
		|	Документ.ОценкаЗначимостиРиска КАК ДД
		|ГДЕ
		|	ДД.Основание = &Основание
		|	И ДД.Проведен";
		
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Выборка = Результат.Выбрать();
	Выборка.Следующий();
	
	Возврат Выборка.Ссылка;
	
КонецФункции
Показать
13. arsen_botashev 21.02.19 11:26 Сейчас в теме
(9)Я сделал по другому. В процедуре ПриСозданииНаСервере.
Теперь если такой документ уже создан то выводится сообщение что он создан, и документ не создается.

Теперь я не знаю как открыть этот документ?
Чтобы вместо сообщения просто открывался Этот документ(ну или формаДокумента)

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Ключ.Пустая() Тогда	
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ОценкаЗначимостиРиска.Ссылка
		|ИЗ
		|	Документ.ОценкаЗначимостиРиска КАК ОценкаЗначимостиРиска
		|ГДЕ
		|	ОценкаЗначимостиРиска.БизнесПроцесс = &БизнесПроцесс";
		
		Запрос.УстановитьПараметр("БизнесПроцесс", Объект.БизнесПроцесс);
		
		РезультатЗапроса = Запрос.Выполнить();
		
		Если Не РезультатЗапроса.Пустой() Тогда 
			Выборка = РезультатЗапроса.Выбрать();
			Выборка.Следующий();
			Сообщить("Документ на основании этого БП уже создан!!!");
			Отказ = Истина;
		КонецЕсли;
	КонецЕсли;	
	
КонецПроцедуры
Показать
14. arsen_botashev 21.02.19 11:49 Сейчас в теме
15. dhurricane 21.02.19 12:03 Сейчас в теме
(14) Извините, но я не знаю, чем. Я Вам предложил решение, но Вы сделали по-другому. Ваш способ не заработал, и Вы вновь спрашиваете, как решить задачу.

При использованном Вами подходе в (13) я не знаю, как корректно решить Вашу задачу. Попробуйте подход из (11), только там небольшая опечатка: необходимо добавить "Не" перед проверкой "ЗначениеЗаполнено(Объект.Ссылка)".
16. arsen_botashev 21.02.19 12:19 Сейчас в теме
(15) Я делал так, как в Вашем примере, документ все равно создается новый.
18. dhurricane 21.02.19 13:09 Сейчас в теме
(16) Проверил, действительно не работает. Необходимо внести небольшие исправления:
...
		Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
			СтандартнаяОбработка = Ложь;
			Параметры.Вставить("Ключ", ПодчиненныйДокумент);
			ВыбраннаяФорма = ПодчиненныйДокумент.Метаданные().ОсновнаяФормаОбъекта;
		КонецЕсли;
...
19. arsen_botashev 21.02.19 14:12 Сейчас в теме
(18)Да, теперь работает, спасибо.
Можно ли как-то исправить то что каждый раз документ открывается на новой вкладке?

То есть я нажимаю на форме БП "Создать на основании", открывается документ который был создан.
Я перехожу обратно на форму БП, еще раз нажимаю "Создать на основании", и этот документ открывается еще раз в новой вкладке, хотя он уже открыт?
3. AndKovalchuk 192 20.02.19 12:16 Сейчас в теме
Не знаю, как для бизнес процесса. Но для документа, чтобы анализировать есть ли документ, введенный на основании, нужно анализировать КритерийОтбора "СвязанныеДокументы".
4. arsen_botashev 20.02.19 12:30 Сейчас в теме
(3)а можно пример какой нибудь?
12. AndKovalchuk 192 20.02.19 16:21 Сейчас в теме
(4)
(3)а можно пример какой нибудь?


Ну пример работы с критерием отбора можно посмотреть тут
https://infostart.ru/public/401743/
5. herfis 499 20.02.19 12:32 Сейчас в теме
Не стоит подменять стандартные понятия. Ввод на основании - это ВСЕГДА создание нового.
7. herfis 499 20.02.19 12:36 Сейчас в теме
Лучше не пытаться из процесса создания нового документа вырулить на редактирование старого, а реализовать альтернативный механизм (кнопку, гиперссылку, поле - что вам там удобнее по контексту), в котором будет открываться существующий документ если он есть и инициироваться ввод на основании, если его еще нет.
10. meriferi 20.02.19 13:16 Сейчас в теме
В модуле команды вызвать серверную процедуру, которая возвращает ссылку если док существует.
И затем создавать новый или открывать существующий.

Ссылка = СуществующийДок(Основание);

Если Ссылка <> Неопределено Тогда
ПараметрыФормы = Новый Структура("Ключ", Ссылка);
Иначе
ПараметрыФормы = Новый Структура("Основание", Основание);
КонецЕсли;

ОткрытьФорму("Документ.ХХ.ФормаОбъекта", ПараметрыФормы);
11. Release 20.02.19 13:50 Сейчас в теме
Я бы сделал бы сделал в форме самого документа в обработчике ПриОткрытии().
Как-то так:
&НаСервере
Функция НайтиДокументПоБП(СсылкаНаБП)
	Возврат Документы.ОценкаЗначимостиРиска.НайтиПоРеквизиту("Ссылка", СсылкаНаБП);
КонецФункции

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	// Код выше

	Если ЗначениеЗаполнено(Объект.Ссылка) И Объект.Основание Тогда
		СсылкаНаСуществущийДок = НайтиДокументПоБП(Объект.Основание);
		
		Если ЗначениеЗаполнено(СсылкаНаСуществущийДок) Тогда
			Отказ = Истина;
			
			Ответ = Вопрос("До данному БП уже существует документ. Открыть его?", РежимДиалогаВопрос.ДаНет, , , "Документ уже существует!");
			
			Если Ответ = КодВозвратаДиалога.Да Тогда
				ОткрытьЗначение(СсылкаНаСуществущийДок);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	// Код ниже
КонецПроцедуры
Показать

Хотя этот код будет отрабатывать и при интерактивном создании копированием, но, думаю, в данном случае это даже к лучшему.
17. arsen_botashev 21.02.19 12:37 Сейчас в теме
(11)Работает, спасибо большое.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот