Здравствуйте
На форме БП есть кнопка создать на основании, то есть на оснвоании этого бп создается документ.
Как проверить при создании на основании есть ли уже такой документ, и если есть октрыть его, и просто поменять дату на сегодняшнюю?

```1c
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

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

    КонецПроцедуры
```

Не работает, подскажите что не так?
---
Реквизит с ссылкой на бизнес-процесс - это и есть связь, о которой я спрашивал. :-)

Рассмотрите для решения задачи событие документа "ОбработкаПолученияФормы", находится оно в модуле менеджера. Здесь можно переопределить открываемую форму или же исправить параметры открытия. Например так:

```1c
    Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

    Если ВидФормы <> "ФормаОбъекта" Тогда
    Возврат;
    КонецЕсли;

    // Обрабатываем стандартный параметр документа
    Основание = Параметры.Основание;

    Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда

    // Если Основание - наш бизнес-процесс,
    // пытаемся найти уже имеющиеся подчиненные документы
    ПодчиненныйДокумент = НайтиПодчиненныйДокумент(Основание);

    // Если подчиненный документ есть, задаем стандартный параметр Ключ,
    // благодаря которому должна открыться форма документа по ссылке (ключу).
    Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
    Параметры.Вставить("Ключ", ПодчиненныйДокумент);
    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры

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

    ПодчиненныйДокумент = Документы.ОценкаЗначимостиРиска.ПустаяСсылка();

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

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

    Выборка = Результат.Выбрать();
    Выборка.Следующий();

    Возврат Выборка.Ссылка;

    КонецФункции
```
---
А бизнес-процесса разве есть номер?

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

Как это реализовать?
---
Реквизит с ссылкой на бизнес-процесс - это и есть связь, о которой я спрашивал. :-)

Рассмотрите для решения задачи событие документа "ОбработкаПолученияФормы", находится оно в модуле менеджера. Здесь можно переопределить открываемую форму или же исправить параметры открытия. Например так:

```1c
    Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

    Если ВидФормы <> "ФормаОбъекта" Тогда
    Возврат;
    КонецЕсли;

    // Обрабатываем стандартный параметр документа
    Основание = Параметры.Основание;

    Если ЗначениеЗаполнено(Основание) И ТипЗнч(Основание) = Тип("БизнесПроцессСсылка.СнижениеРисков") Тогда

    // Если Основание - наш бизнес-процесс,
    // пытаемся найти уже имеющиеся подчиненные документы
    ПодчиненныйДокумент = НайтиПодчиненныйДокумент(Основание);

    // Если подчиненный документ есть, задаем стандартный параметр Ключ,
    // благодаря которому должна открыться форма документа по ссылке (ключу).
    Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
    Параметры.Вставить("Ключ", ПодчиненныйДокумент);
    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры

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

    ПодчиненныйДокумент = Документы.ОценкаЗначимостиРиска.ПустаяСсылка();

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

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

    Выборка = Результат.Выбрать();
    Выборка.Следующий();

    Возврат Выборка.Ссылка;

    КонецФункции
```
---
Я сделал по другому. В процедуре ПриСозданииНаСервере.
Теперь если такой документ уже создан то выводится сообщение что он создан, и документ не создается.

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

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

    Запрос.УстановитьПараметр("БизнесПроцесс", Объект.БизнесПроцесс);

    РезультатЗапроса = Запрос.Выполнить();

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

    КонецПроцедуры
```
---
Можете помочь?
---
Извините, но я не знаю, чем. Я Вам предложил решение, но Вы сделали по-другому. Ваш способ не заработал, и Вы вновь спрашиваете, как решить задачу.

При использованном Вами подходе в (13) я не знаю, как корректно решить Вашу задачу. Попробуйте подход из (11), только там небольшая опечатка: необходимо добавить "Не" перед проверкой "ЗначениеЗаполнено(Объект.Ссылка)".
---
Я делал так, как в Вашем примере, документ все равно создается новый.
---
Проверил, действительно не работает. Необходимо внести небольшие исправления:

```1c
    ...
    Если ЗначениеЗаполнено(ПодчиненныйДокумент) Тогда
    СтандартнаяОбработка = Ложь;
    Параметры.Вставить("Ключ", ПодчиненныйДокумент);
    ВыбраннаяФорма = ПодчиненныйДокумент.Метаданные().ОсновнаяФормаОбъекта;
    КонецЕсли;
    ...
```
---
Да, теперь работает, спасибо.
Можно ли как-то исправить то что каждый раз документ открывается на новой вкладке?

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

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

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

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

ОткрытьФорму("Документ.ХХ.ФормаОбъекта", ПараметрыФормы);
---
Я бы сделал бы сделал в форме самого документа в обработчике ПриОткрытии().
Как-то так:

```1c
    &НаСервере
    Функция НайтиДокументПоБП(СсылкаНаБП)
    Возврат Документы.ОценкаЗначимостиРиска.НайтиПоРеквизиту("Ссылка", СсылкаНаБП);
    КонецФункции

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

    Если ЗначениеЗаполнено(Объект.Ссылка) И Объект.Основание Тогда
    СсылкаНаСуществущийДок = НайтиДокументПоБП(Объект.Основание);

    Если ЗначениеЗаполнено(СсылкаНаСуществущийДок) Тогда
    Отказ = Истина;

    Ответ = Вопрос("До данному БП уже существует документ. Открыть его?", РежимДиалогаВопрос.ДаНет, , , "Документ уже существует!");

    Если Ответ = КодВозвратаДиалога.Да Тогда
    ОткрытьЗначение(СсылкаНаСуществущийДок);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;

    // Код ниже
    КонецПроцедуры
```

Хотя этот код будет отрабатывать и при интерактивном создании копированием, но, думаю, в данном случае это даже к лучшему.
---
Работает, спасибо большое.