Здравствуйте, уважаемые программисты.

Вопрос такой: Как проверить создан ли документ на основании?
Есть задача: если был создан документ на основании текущего, то, запретить возможность редактирования текущего.

Пока в голову толком ничего не приходит, только перебор всех возможных документов по реквизиту документ-основание, но это как-то не корректно

1С 8.3, обычные формы
---
```1c
    Если ЭтоНовый() Тогда
    Если НЕ ПараметрОбъектКопирования = НЕОПРЕДЕЛЕНО Тогда // Проверка на копирование
    Предупреждение("Запрещено копировать Договора!");
    Закрыть();
    КонецЕсли;
    КонецЕсли;
```
   Это поставишь на документ который был создан копированием / В Процедуре ПриОткрытии()

А для документа использовать БСП:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // СтандартныеПодсистемы.ВерсионированиеОбъектов
    ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтаФорма);
    // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
    Если Объект.Номер = " Тогда
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | СвязанныеДокументы.Ссылка
    |ИЗ
    | КритерийОтбора.СвязанныеДокументы(&ТекущийДокумент) КАК СвязанныеДокументы";

    Запрос.УстановитьПараметр("ТекущийДокумент", Объект.Основание);
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Это выполнение ЗАКРЫТО " + ВыборкаДетальныеЗаписи.Ссылка;
    Сообщение.Поле = ";
    Сообщение.УстановитьДанные(ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект());
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЦикла;
    Возврат;
    КонецЕсли;
    Если Объект.Основание.ДатаВыполнения <> '00010101' Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Закрывать можно только выполненную заявку";
    Сообщение.Сообщить();
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    КонецЕсли;
    // Если документ введен на основании, то запретим редактировать основание
    Если Не Объект.Основание.Пустая() И Объект.Проведен Тогда
    Элементы.Основание.ТолькоПросмотр = Истина;
    Иначе
    Элементы.Основание.ТолькоПросмотр = Ложь;
    КонецЕсли;
    Если Объект.Ответственный = Справочники.Пользователи.ПустаяСсылка() Тогда
    Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
    КонецЕсли;
    КонецПроцедуры
```
---
Поищите в сторону критерия отбора
---
благодарю
---
вы с помощью связанных документов сможете проверить, создавали ли на основании вашего документа другие, и если да тогда заблокировать. как то так
---
Спасибо огромное =) Попробую реализовать)
---
в процедуру ПриОткрытии добавьте такую команду (пример, спои переменные нужно подставить)
ЭтаФорма.ТолькоПросмотр = Значениезаполнено(Объект.ДокументОснование);
---
Спасибо большое, но мне нужно блокировать не только созданный документ, но и тот, на основании которого был создан документ
---
Пишите запрос. Посмотрите, например, как в БП3 реализован механизм поиска Документов "счет-фактура выданный" к документу "Реализация".
---
```1c
    Если ЭтоНовый() Тогда
    Если НЕ ПараметрОбъектКопирования = НЕОПРЕДЕЛЕНО Тогда // Проверка на копирование
    Предупреждение("Запрещено копировать Договора!");
    Закрыть();
    КонецЕсли;
    КонецЕсли;
```
   Это поставишь на документ который был создан копированием / В Процедуре ПриОткрытии()

А для документа использовать БСП:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // СтандартныеПодсистемы.ВерсионированиеОбъектов
    ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтаФорма);
    // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
    Если Объект.Номер = " Тогда
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | СвязанныеДокументы.Ссылка
    |ИЗ
    | КритерийОтбора.СвязанныеДокументы(&ТекущийДокумент) КАК СвязанныеДокументы";

    Запрос.УстановитьПараметр("ТекущийДокумент", Объект.Основание);
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Это выполнение ЗАКРЫТО " + ВыборкаДетальныеЗаписи.Ссылка;
    Сообщение.Поле = ";
    Сообщение.УстановитьДанные(ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект());
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЦикла;
    Возврат;
    КонецЕсли;
    Если Объект.Основание.ДатаВыполнения <> '00010101' Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Закрывать можно только выполненную заявку";
    Сообщение.Сообщить();
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    КонецЕсли;
    // Если документ введен на основании, то запретим редактировать основание
    Если Не Объект.Основание.Пустая() И Объект.Проведен Тогда
    Элементы.Основание.ТолькоПросмотр = Истина;
    Иначе
    Элементы.Основание.ТолькоПросмотр = Ложь;
    КонецЕсли;
    Если Объект.Ответственный = Справочники.Пользователи.ПустаяСсылка() Тогда
    Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
    КонецЕсли;
    КонецПроцедуры
```
---
Спасибо
---
Добавил ваш код в модуль формы. Создавать "на основании" повторно не дает, но и из формы списка по кнопке "Создать" второй раз тоже не дает. Какое условие нужно, чтобы при создании документа без основания все работало?
---
Разобрался. Нужно добавить вот так и все работает.

Если Объект.ДокументОснование.Пустая() Тогда
  Возврат;
 ИначеЕсли Объект.Номер = "" Тогда....
---
.