Здравствуйте
На форме БП есть кнопка создать на основании, то есть на оснвоании этого бп создается документ.
Как проверить при создании на основании есть ли уже такой документ, и если есть октрыть его, и просто поменять дату на сегодняшнюю?
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда
Док = Документы.ОценкаЗначимостиРиска.НайтиПоНомеру(ЭтотОбъект.Номер);
Если Док.Номер = ЭтотОбъект.Номер Тогда
Док.Дата = ТекущаяДата();
КонецЕсли;
Подразделение = ДанныеЗаполнения.Подразделение;
БизнесПроцесс = ДанныеЗаполнения.Ссылка;
Для Каждого ТекСтрокаПричины Из ДанныеЗаполнения.Причины Цикл
НоваяСтрока = Оценка.Добавить();
НоваяСтрока.Ответственный = ТекСтрокаПричины.Ответственный;
НоваяСтрока.Риск = ТекСтрокаПричины.Риск;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
(8) Реквизит с ссылкой на бизнес-процесс - это и есть связь, о которой я спрашивал. :-)
Рассмотрите для решения задачи событие документа "ОбработкаПолученияФормы", находится оно в модуле менеджера. Здесь можно переопределить открываемую форму или же исправить параметры открытия. Например так:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы <> "ФормаОбъекта" Тогда
Возврат;
КонецЕсли;
// Обрабатываем стандартный параметр документа
Основание = Параметры.Основание;
Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда
// Если Основание - наш бизнес-процесс,
// пытаемся найти уже имеющиеся подчиненные документы
ПодчиненныйДокумент = НайтиПодчиненныйДокумент(Основание);
// Если подчиненный документ есть, задаем стандартный параметр Ключ,
// благодаря которому должна открыться форма документа по ссылке (ключу).
Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
Параметры.Вставить("Ключ", ПодчиненныйДокумент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиПодчиненныйДокумент(Основание)
ПодчиненныйДокумент = Документы.ОценкаЗначимостиРиска.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Основание", Основание);
Запрос.Текст =
"ВЫБРАТЬ
| ДД.Ссылка
|ИЗ
| Документ.ОценкаЗначимостиРиска КАК ДД
|ГДЕ
| ДД.Основание = &Основание
| И ДД.Проведен";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
(1) Не уверен на счет даты, но могу подсказать, как открыть уже существующий документ. Уточните только, какая у Вас связь между бизнес-процессом и подчиненным документом? По коду не удалось понять.
(6)Связи наверное нет, просто ввод на основании.Можео проверить есть ли такой документ и открыть его с помощью реквизита БизнесПроцесс(Основание).
На форме документа есть реквизит БизнесПроцесс(Основание), при воздании на основании, в этот реквизит передается ссылка Этого БП, на основании которого создан этот документ.
То есть надо проверить При создании На основании есть ли документ у которого этот реквизит = ссылку на этот бп.
и если равен открыть этот документ.
(8) Реквизит с ссылкой на бизнес-процесс - это и есть связь, о которой я спрашивал. :-)
Рассмотрите для решения задачи событие документа "ОбработкаПолученияФормы", находится оно в модуле менеджера. Здесь можно переопределить открываемую форму или же исправить параметры открытия. Например так:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы <> "ФормаОбъекта" Тогда
Возврат;
КонецЕсли;
// Обрабатываем стандартный параметр документа
Основание = Параметры.Основание;
Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда
// Если Основание - наш бизнес-процесс,
// пытаемся найти уже имеющиеся подчиненные документы
ПодчиненныйДокумент = НайтиПодчиненныйДокумент(Основание);
// Если подчиненный документ есть, задаем стандартный параметр Ключ,
// благодаря которому должна открыться форма документа по ссылке (ключу).
Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
Параметры.Вставить("Ключ", ПодчиненныйДокумент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиПодчиненныйДокумент(Основание)
ПодчиненныйДокумент = Документы.ОценкаЗначимостиРиска.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Основание", Основание);
Запрос.Текст =
"ВЫБРАТЬ
| ДД.Ссылка
|ИЗ
| Документ.ОценкаЗначимостиРиска КАК ДД
|ГДЕ
| ДД.Основание = &Основание
| И ДД.Проведен";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
(9)Я сделал по другому. В процедуре ПриСозданииНаСервере.
Теперь если такой документ уже создан то выводится сообщение что он создан, и документ не создается.
Теперь я не знаю как открыть этот документ?
Чтобы вместо сообщения просто открывался Этот документ(ну или формаДокумента)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустая() Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОценкаЗначимостиРиска.Ссылка
|ИЗ
| Документ.ОценкаЗначимостиРиска КАК ОценкаЗначимостиРиска
|ГДЕ
| ОценкаЗначимостиРиска.БизнесПроцесс = &БизнесПроцесс";
Запрос.УстановитьПараметр("БизнесПроцесс", Объект.БизнесПроцесс);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Сообщить("Документ на основании этого БП уже создан!!!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(14) Извините, но я не знаю, чем. Я Вам предложил решение, но Вы сделали по-другому. Ваш способ не заработал, и Вы вновь спрашиваете, как решить задачу.
При использованном Вами подходе в (13) я не знаю, как корректно решить Вашу задачу. Попробуйте подход из (11), только там небольшая опечатка: необходимо добавить "Не" перед проверкой "ЗначениеЗаполнено(Объект.Ссылка)".
(18)Да, теперь работает, спасибо.
Можно ли как-то исправить то что каждый раз документ открывается на новой вкладке?
То есть я нажимаю на форме БП "Создать на основании", открывается документ который был создан.
Я перехожу обратно на форму БП, еще раз нажимаю "Создать на основании", и этот документ открывается еще раз в новой вкладке, хотя он уже открыт?
Не знаю, как для бизнес процесса. Но для документа, чтобы анализировать есть ли документ, введенный на основании, нужно анализировать КритерийОтбора "СвязанныеДокументы".
Лучше не пытаться из процесса создания нового документа вырулить на редактирование старого, а реализовать альтернативный механизм (кнопку, гиперссылку, поле - что вам там удобнее по контексту), в котором будет открываться существующий документ если он есть и инициироваться ввод на основании, если его еще нет.
В модуле команды вызвать серверную процедуру, которая возвращает ссылку если док существует.
И затем создавать новый или открывать существующий.
Ссылка = СуществующийДок(Основание);
Если Ссылка <> Неопределено Тогда
ПараметрыФормы = Новый Структура("Ключ", Ссылка);
Иначе
ПараметрыФормы = Новый Структура("Основание", Основание);
КонецЕсли;
Я бы сделал бы сделал в форме самого документа в обработчике ПриОткрытии().
Как-то так:
&НаСервере
Функция НайтиДокументПоБП(СсылкаНаБП)
Возврат Документы.ОценкаЗначимостиРиска.НайтиПоРеквизиту("Ссылка", СсылкаНаБП);
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Код выше
Если ЗначениеЗаполнено(Объект.Ссылка) И Объект.Основание Тогда
СсылкаНаСуществущийДок = НайтиДокументПоБП(Объект.Основание);
Если ЗначениеЗаполнено(СсылкаНаСуществущийДок) Тогда
Отказ = Истина;
Ответ = Вопрос("До данному БП уже существует документ. Открыть его?", РежимДиалогаВопрос.ДаНет, , , "Документ уже существует!");
Если Ответ = КодВозвратаДиалога.Да Тогда
ОткрытьЗначение(СсылкаНаСуществущийДок);
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Код ниже
КонецПроцедуры
Показать
Хотя этот код будет отрабатывать и при интерактивном создании копированием, но, думаю, в данном случае это даже к лучшему.