В начало
Проверка при возврате выданных книг
Есть конфигурация учета книг в
библиотеке, в которой имеются справочники «Читатели», «Книги»,
документы-регистраторы «Выдача книг» и «Возврат книг», отчет «Книги у
читателей», а также регистр накопления «Книги у читателей».
Нужно
проконтролировать книги, возвращаемые читателями.
Некий
читатель взял книги, количество которых можно посмотреть в отчете «Книги у
читателей», построенном на основании данных регистра накопления.
Рис. Наличие взятых
книг конкретным читателем
Далее показан листинг процедуры,
расположенной в модуле объекта
документа «Возврат книг». Байда с выбором а-ля КОГДА-ТОГДА-ИНАЧЕ нужна для
получения количества без знака минуса, т.к. регистр накопления минусует
выданные книги даже при нажатой галочке «Неотрицательное» у ресурса
«Количество».
Листинг. Процедура «ПередЗаписью»
в модуле объекта
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Для Каждого Стр Из Книги Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА
КнигиУЧитателейОстатки.КоличествоОстаток < 0
| ТОГДА
-КнигиУЧитателейОстатки.КоличествоОстаток
| ИНАЧЕ
КнигиУЧитателейОстатки.КоличествоОстаток
| КОНЕЦ КАК Количество
|ИЗ
| РегистрНакопления.КнигиУЧитателей.Остатки(&Дата,
) КАК КнигиУЧитателейОстатки
|ГДЕ
| КнигиУЧитателейОстатки.Читатель
= &Читатель
| И
КнигиУЧитателейОстатки.Книга = &Книга";
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Запрос.УстановитьПараметр("Книга", Стр.Книга);
Запрос.УстановитьПараметр("Читатель", Читатель);
РезультатЗапроса =
Запрос.Выполнить();
Выборка =
РезультатЗапроса.Выбрать();
Если
Выборка.Следующий() Тогда
Если Стр.Количество > Выборка.Количество Тогда
Сообщить("Книга была взята в меньшем
количестве, а именно - " +
Выборка.Количество
+ " шт.");
Отказ = Истина;
КонецЕсли;
Иначе
Сообщить("Такую книгу как " +
Стр.Книга +
" вернуть нельзя, т.к.
Вы ее не брали!");
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
|
Ну или можно вместо оператора выбора поиграться со знаками
в условии типа:
Если Стр.Количество
> - Выборка.Количество Тогда
|
Хотя все равно процедура получилась
не очень, т.к. запрос находится в цикле, а это как-то не очень.
Листинг. Другой
вариант процедуры «Перед записью»
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Для Каждого Стр Из Книги Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КнигиУЧитателейОстатки.КоличествоОстаток
КАК Количество
|ИЗ
| РегистрНакопления.КнигиУЧитателей.Остатки(&Дата,
) КАК КнигиУЧитателейОстатки
|ГДЕ
| КнигиУЧитателейОстатки.Читатель
= &Читатель
| И
КнигиУЧитателейОстатки.Книга = &Книга";
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Запрос.УстановитьПараметр("Книга", Стр.Книга);
Запрос.УстановитьПараметр("Читатель", Читатель);
РезультатЗапроса =
Запрос.Выполнить();
Выборка =
РезультатЗапроса.Выбрать();
Если
Выборка.Следующий() Тогда
Если Стр.Количество > - Выборка.Количество Тогда
Сообщить("Книга была взята в меньшем
количестве, а именно: " +
Выборка.Количество
+ " шт.");
Отказ = Истина;
КонецЕсли;
Иначе
Сообщить("Такую книгу как
" + Стр.Книга +
" вернуть нельзя, т.к.
Вы ее не брали!");
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
|
В том случае, если введенное
количество книг будет более того, что бралось или же, если читатель захочет
вернуть книгу, которую он не брал – будет выдана ошибка и документ не будет
проведен. Иначе – нет проблем и все нормально проводится.
Ниже показан документ «Возврат книг»
с ошибочным вводом данных.
Рис. Документ
«Возврат книг» с неправильными данными
ПРИМЕЧАНИЕ:
данная процедура проверки была проверена на версии 8.3, точнее 8.3.6.2014.