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

    ЗапросПоРасписанию.УстановитьПараметр("Организация", Организация);
    ЗапросПоРасписанию.УстановитьПараметр("Подразделение", Подразделение);
    ЗапросПоРасписанию.УстановитьПараметр("Должность", Должность);
    ЗапросПоЗанятымПозициям.УстановитьПараметр("Организация", Организация);
    ЗапросПоЗанятымПозициям.УстановитьПараметр("Подразделение", Подразделение);
    ЗапросПоЗанятымПозициям.УстановитьПараметр("Должность", Должность);
    ВыборкаДетальныеЗаписиРасписание = ЗапросПоРасписанию.Выполнить().Выбрать();
    ВыборкаДетальныеЗаписиПозиции = ЗапросПоЗанятымПозициям.Выполнить().Выбрать();

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

    Если СтавкиРасписание >= СтавкиПозиции Тогда
    Движения.ЗанятиеШтатныеПозиции.Записывать = Истина;
    Движение = Движения.ЗанятиеШтатныеПозиции.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Организация = Организация;
    Движение.Подразделение = Подразделение;
    Движение.Должность = Должность;
    Движение.КоличествоСтавок = КоличествоСтавок;
    Иначе
    Отказ = Истина;
    Движения.ЗанятиеШтатныеПозиции.Записывать = Ложь;
    Сообщить ("Недостаточно ставок по выбранной должности! Штат переполнен.");
    КонецЕсли;
```

Проблема в следующем: при отладке кода возникает ошибка чтения запроса (рис. ниже).

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

У вас в разных запросах поля по разному называютсяч, а ищите вы по одному полю...
                      | ШтатноеРасписание.КоличествоСтавок КАК КоличествоСтавок
[IS-QUOTE] | ЗанятиеШтатныеПозицииОстатки.КоличествоСтавокОстаток КАК КоличествоСтавокОстаток[/QUOTE]
---
Изменял код подобным образом, компилятор ругается, что переменная КоличествоСтавокОстаток в НайтиСледующий(КоличествоСтавокОстаток) не определена.
---
КоличествоСтавок - у вас тип Структура?
---
Тип число.
---
По идее на набор параметров будет всегда одна запись. зачем использовать НайтиСледующий, когда можно просто Следующий() и вы спозиционируетесь на запись. Проверьте перед позиционированием запрос на пустоту.
---
Действительно, проблема была в "НайтиСледующий()". Большое спасибо, это решило проблему!