Добрый день. Я начинающий программист, работаю с 1С от силы полторы недели, поэтому прошу как можно более детального ответа. Задача такова: добавить контроль на проведение документы, что можно уволить только работающего сотрудника. Имеется документ "Увольнение", имеется регистр сведений "Сведения о сотрудниках". Необходима проверка наличия сотрудника в регистре (чтобы пользователь не мог уволить несуществующего сотрудника), а так же проверка на уже уволенных сотрудников (т.е. нельзя уволить уже уволенного сотрудника). Делаю я это следующим образом:

```1c
    Запрос = Новый Запрос ("ВЫБРАТЬ
    | СведенияОСотрудниках.Сотрудник КАК Сотрудник
    |ИЗ
    | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
    |ГДЕ
    | СведенияОСотрудниках.Сотрудник = &Сотрудник");
    Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
    РезультатЗапроса = Запрос.Выполнить();
    Если Документы.Увольнение.НайтиПоРеквизиту("Сотрудник", Сотрудник) <> РезультатЗапроса Тогда
    Отказ = Истина;
    Движения.СведенияОСотрудниках.Записывать = Ложь;
    Сообщить("Выбрано лицо, не являющееся сотрудником. Выберите сотрудника.");
    Иначе
    Движения.СведенияОСотрудниках.Записывать = Истина;
    Движение = Движения.СведенияОСотрудниках.Добавить();
    Движение.Период = Дата;
    Движение.Организация = Организация;
    Движение.Сотрудник = Сотрудник;
    Движение.ПризнакУвольнения = Истина;
    КонецЕсли;
```

При этом в ходе обработки условия, какими бы не были действия в режиме отладки, обработка сразу же идёт в ветку "Отказ = Истина" и документ не проводится. В чём может быть проблема?
---
Так в регистре сведений СведенияОСотрудниках вся информация есть. Зачем проверять документы?

```1c
    Запрос = Новый Запрос ("ВЫБРАТЬ
    | СведенияОСотрудниках.Сотрудник КАК Сотрудник
    |ИЗ
    | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
    |ГДЕ
    | СведенияОСотрудниках.Сотрудник = &Сотрудник И НЕ СведенияОСотрудниках.ПризнакУвольнения");
    Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
    Отказ = Истина;
    Движения.СведенияОСотрудниках.Записывать = Ложь;
    Сообщить("Выбрано лицо, не являющееся сотрудником. Выберите сотрудника.");
    Иначе
    Движения.СведенияОСотрудниках.Записывать = Истина;
    Движение = Движения.СведенияОСотрудниках.Добавить();
    Движение.Период = Дата;
    Движение.Организация = Организация;
    Движение.Сотрудник = Сотрудник;
    Движение.ПризнакУвольнения = Истина;
    КонецЕсли;
```
---
тогда так:

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

Далее по тексту.
---
Так в регистре сведений СведенияОСотрудниках вся информация есть. Зачем проверять документы?

```1c
    Запрос = Новый Запрос ("ВЫБРАТЬ
    | СведенияОСотрудниках.Сотрудник КАК Сотрудник
    |ИЗ
    | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
    |ГДЕ
    | СведенияОСотрудниках.Сотрудник = &Сотрудник И НЕ СведенияОСотрудниках.ПризнакУвольнения");
    Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
    Отказ = Истина;
    Движения.СведенияОСотрудниках.Записывать = Ложь;
    Сообщить("Выбрано лицо, не являющееся сотрудником. Выберите сотрудника.");
    Иначе
    Движения.СведенияОСотрудниках.Записывать = Истина;
    Движение = Движения.СведенияОСотрудниках.Добавить();
    Движение.Период = Дата;
    Движение.Организация = Организация;
    Движение.Сотрудник = Сотрудник;
    Движение.ПризнакУвольнения = Истина;
    КонецЕсли;
```
---
Вот оно, да, именно так! Большое спасибо!
---
Только нужно учесть, что перепровести этот же документ не даст. Если нужно оставить перепроведение, то в запросе указать отбор что регистратор Не Ссылка.
Еще возможна ситуация, что сотрудник был уволен и снова принят. Тогда нужно использовать виртуальную таблицу СрезПоследних.
---
Напротив, система не препятствует перепроведению этого документа. А вообще, по заданию, да, повторное проведение документа должно быть запрещено.

UPD. Извиняюсь, не заметил строку кода. Действительно, повторное проведение запрещено.
---
тогда так:

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

Далее по тексту.
---
Вот теперь абсолютно всё работает так, как предполагалось! Спасибо!
---
РезультатЗапроса = Запрос.Выполнить().Выбрать(); - потом через
ПОКА Выборка.Следующий() Цикл

      Если Документы.Увольнение.НайтиПоРеквизиту("Сотрудник", Сотрудник) <> Выборка.Сотрудник Тогда
---
но я бы переписал запрос, и в запросе бы узнавал есть увольнение по сотруднику или нет
---
Попробую начать. :)

Метод НайтиПоРеквизиту осуществляет поиск документа в информационной базе по указанному значению реквизита. Возвращает ссылку на найденный документ в случае успеха, либо пустую ссылку, если документ не найден.

Метод Выполнить осуществляет запрос к базе данных. Возвращает некий объект, ассоциированный с таблицей результата запроса. Тип его так и звучит: РезультатЗапроса.

Т.о. Вы сравниваете 2 объекта - ссылку на найденный документ и результат запроса - совершенно разные как по типу, так и по своей сути. Поэтому сравнение их на неравенство всегда будет давать положительный результат, а отсюда и отказ в проведении.
---
В таком случае как можно решить возникшую проблему? А точнее, как преобразовать тип результата запроса к типу значения реквизита документа? Не совсем понимаю, как это можно реализовать.
---
я же вам код даже написал в (2)
---
Только Вы немного поторопились, и у Вас получилось сравнение документа с сотрудником. Видимо поэтому у автор и не получилось воспользоваться Вашим советом.
---
есть такое :)
---
В таком случае, я не совсем понимаю, с чем мне сравнивать результат запроса. Попробую объяснить подробнее, что необходимо. В документе увольнение есть реквизит "Сотрудник". При вводе пользователем ФИО физ. лица должна запускаться проверка - если это физ. лицо ещё не уволено - одобрение проведения документа, если же лицо уже уволено, либо его вообще нет среди сотрудников, то документ проводиться не должен, выскакивает ошибка. Собственно, в связи с этим и вопрос: как мне сравнить значение, введённое в выделенное поле, с результатом запроса? Я в тупике.

UPD. Все данные о сотрудниках хранятся в регистре сведений "СведенияОСотрудниках".
---
а зачем вообще запрос к регистру сведений? Может просто запрос к документу увольнение, где этот сотрдник есть и документ проведен?
---
А это и невозможно. Как я уже сказал, это совершенно разные по своей сути объекты. Нет никакого смысла их пытаться привести к единому типу.

Вам необходимо лишь:
- проверить, удалось ли найти документ, при этом сам документ, т.е. ссылка на него Вам не нужна; Вам необходимо узнать, не пустая ли она;
- проверить не пустой ли результат запроса к регистру сведений с отбором по сотруднику.

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