В начало

Проверка при возврате выданных книг

 

            Есть конфигурация учета книг в библиотеке, в которой имеются справочники «Читатели», «Книги», документы-регистраторы «Выдача книг» и «Возврат книг», отчет «Книги у читателей», а также регистр накопления «Книги у читателей».

            Нужно проконтролировать книги, возвращаемые читателями.

            Некий читатель взял книги, количество которых можно посмотреть в отчете «Книги у читателей», построенном на основании данных регистра накопления.

 

Рис. Наличие взятых книг конкретным читателем

Рис. Наличие взятых книг конкретным читателем

 

            Далее показан листинг процедуры, расположенной в модуле объекта документа «Возврат книг». Байда с выбором а-ля КОГДА-ТОГДА-ИНАЧЕ нужна для получения количества без знака минуса, т.к. регистр накопления минусует выданные книги даже при нажатой галочке «Неотрицательное» у ресурса «Количество».

 

Листинг. Процедура «ПередЗаписью» в модуле объекта

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Для Каждого Стр Из Книги Цикл    

      

       Запрос = Новый Запрос;

       Запрос.Текст =

       "ВЫБРАТЬ

       |      ВЫБОР

       |            КОГДА КнигиУЧитателейОстатки.КоличествоОстаток < 0

       |                   ТОГДА -КнигиУЧитателейОстатки.КоличествоОстаток

       |            ИНАЧЕ КнигиУЧитателейОстатки.КоличествоОстаток

       |      КОНЕЦ КАК Количество

       |ИЗ

       |      РегистрНакопления.КнигиУЧитателей.Остатки(&Дата, ) КАК КнигиУЧитателейОстатки

       |ГДЕ

       |      КнигиУЧитателейОстатки.Читатель = &Читатель

       |      И КнигиУЧитателейОстатки.Книга = &Книга";

      

       Запрос.УстановитьПараметр("Дата", ТекущаяДата());

       Запрос.УстановитьПараметр("Книга", Стр.Книга);

       Запрос.УстановитьПараметр("Читатель", Читатель);

      

       РезультатЗапроса = Запрос.Выполнить();

      

       Выборка = РезультатЗапроса.Выбрать();

      

       Если Выборка.Следующий() Тогда

       Если  Стр.Количество >  Выборка.Количество Тогда

       Сообщить("Книга была взята в меньшем количестве, а именно - " +    

                Выборка.Количество + " шт.");

       Отказ = Истина;

       КонецЕсли;  

       Иначе

       Сообщить("Такую книгу как " + Стр.Книга +

                " вернуть нельзя, т.к. Вы ее не брали!");

       Отказ = Истина;

       КонецЕсли;  

 

КонецЦикла;

КонецПроцедуры

 

Ну или можно вместо оператора выбора поиграться со знаками в условии типа:

 

Если Стр.Количество >  - Выборка.Количество Тогда

 

            Хотя все равно процедура получилась не очень, т.к. запрос находится в цикле, а это как-то не очень.

Листинг. Другой вариант процедуры «Перед записью»

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Для Каждого Стр Из Книги Цикл    

      

       Запрос = Новый Запрос;

       Запрос.Текст =

       "ВЫБРАТЬ

       |      КнигиУЧитателейОстатки.КоличествоОстаток КАК Количество

       |ИЗ

       |      РегистрНакопления.КнигиУЧитателей.Остатки(&Дата, ) КАК КнигиУЧитателейОстатки

       |ГДЕ

       |      КнигиУЧитателейОстатки.Читатель = &Читатель

       |      И КнигиУЧитателейОстатки.Книга = &Книга";

      

       Запрос.УстановитьПараметр("Дата", ТекущаяДата());

       Запрос.УстановитьПараметр("Книга", Стр.Книга);

       Запрос.УстановитьПараметр("Читатель", Читатель);

      

       РезультатЗапроса = Запрос.Выполнить();

      

       Выборка = РезультатЗапроса.Выбрать();

      

       Если Выборка.Следующий() Тогда

       Если  Стр.Количество >  - Выборка.Количество Тогда

       Сообщить("Книга была взята в меньшем количестве, а именно: " +

                 Выборка.Количество + " шт.");

       Отказ = Истина;

       КонецЕсли;  

       Иначе

       Сообщить("Такую книгу как " + Стр.Книга +

                " вернуть нельзя, т.к. Вы ее не брали!");

       Отказ = Истина;

       КонецЕсли;  

 

КонецЦикла;

КонецПроцедуры

 

            В том случае, если введенное количество книг будет более того, что бралось или же, если читатель захочет вернуть книгу, которую он не брал – будет выдана ошибка и документ не будет проведен. Иначе – нет проблем и все нормально проводится.

            Ниже показан документ «Возврат книг» с ошибочным вводом данных.

 

Рис. Документ «Возврат книг» с неправильными данными

Рис. Документ «Возврат книг» с неправильными данными

 

ПРИМЕЧАНИЕ: данная процедура проверки была проверена на версии 8.3, точнее 8.3.6.2014.