Обработка проведения документа "ПриёмНаРаботу"

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


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

Ума не приложу, в чём проблема, ведь в других частях конфигурации запрос из регистра сведений работает верно.
Прикрепленные файлы:
Найденные решения
11. lefthander 06.08.19 15:31 Сейчас в теме
(9)По идее на набор параметров будет всегда одна запись. зачем использовать НайтиСледующий, когда можно просто Следующий() и вы спозиционируетесь на запись. Проверьте перед позиционированием запрос на пустоту.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tjurikov_ivan 216 06.08.19 15:14 Сейчас в теме
(1)
У вас не хватает фраз
ВыборкаДетальныеЗаписиРасписание.Следующий();
ВыборкаДетальныеЗаписиПозиции.Следующий();
3. BuryMeInVegas 06.08.19 15:16 Сейчас в теме
(2) Почему тогда для Ставок по позиции запрос читается, а для Ставок по расписанию - нет? Основная проблема: ошибка чтения значения из запроса из регистра сведений.
4. lefthander 06.08.19 15:20 Сейчас в теме
(1)может потому что у вас количествоСтавок и количествоставокОстаток а вы ищите следующий по количествуставок?
5. BuryMeInVegas 06.08.19 15:21 Сейчас в теме
(4) Как раз в данной строке присвоение проходит, ошибка в условии выше.)
6. BuryMeInVegas 06.08.19 15:22 Сейчас в теме
(4) Для наглядности: ошибка чтения значения случается вот здесь:
Если ВыборкаДетальныеЗаписиРасписание.НайтиСледующий(КоличествоСтавок) Тогда
СтавкиРасписание = ВыборкаДетальныеЗаписиРасписание.КоличествоСтавок;
КонецЕсли;
7. tjurikov_ivan 216 06.08.19 15:24 Сейчас в теме
(6) не обратил внимания что вы не перебираете выборку, а ищете по ней.
Может он не может найти строки по отбору который вы передаете через переменную КоличествоСтавок
8. lefthander 06.08.19 15:24 Сейчас в теме
(1)
Если ВыборкаДетальныеЗаписиРасписание.НайтиСледующий(КоличествоСтавок) Тогда
СтавкиРасписание = ВыборкаДетальныеЗаписиРасписание.КоличествоСтавок;
КонецЕсли;
Если ВыборкаДетальныеЗаписиПозиции.НайтиСледующий(КоличествоСтавок) Тогда
СтавкиПозиции = ВыборкаДетальныеЗаписиПозиции.КоличествоСтавокОстаток;
КонецЕсли;


У вас в разных запросах поля по разному называютсяч, а ищите вы по одному полю...
| ШтатноеРасписание.КоличествоСтавок КАК КоличествоСтавок

[IS-QUOTE] | ЗанятиеШтатныеПозицииОстатки.КоличествоСтавокОстаток КАК КоличествоСтавокОстаток[/QUOTE]
9. BuryMeInVegas 06.08.19 15:26 Сейчас в теме
(8) Изменял код подобным образом, компилятор ругается, что переменная КоличествоСтавокОстаток в НайтиСледующий(КоличествоСтавокОстаток) не определена.
Прикрепленные файлы:
10. lefthander 06.08.19 15:28 Сейчас в теме
(9)КоличествоСтавок - у вас тип Структура?
12. BuryMeInVegas 06.08.19 15:35 Сейчас в теме
11. lefthander 06.08.19 15:31 Сейчас в теме
(9)По идее на набор параметров будет всегда одна запись. зачем использовать НайтиСледующий, когда можно просто Следующий() и вы спозиционируетесь на запись. Проверьте перед позиционированием запрос на пустоту.
13. BuryMeInVegas 06.08.19 15:37 Сейчас в теме
(11)Действительно, проблема была в "НайтиСледующий()". Большое спасибо, это решило проблему!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот