Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 ноя 2024, 08:16

Запрет проведения Документа по регистрам исходя из заданного условия

Автор Zuull, 13 авг 2013, 17:14

0 Пользователей и 1 гость просматривают эту тему.

Zuull

Добрый День! Требуется помощь  :(

Решаемая мной задача: При проведении Документа (ниже рисунок) необходимо проверить не занят ли номер на определенный интервал дат заносимых в этот Документ.

Алгоритм решения: 1. Формирую Запрос данных из Регистра сведений;  2. Задаю два условия проверки на совпадение дат заносимых в Документ и существующих в Регистре, соответствующих Номеру в гостинице. 3. Если условия выполняются, то отказ в проведении; если нет, то проведение в Регистр.

Сложности: Не проводятся данные в Регистр, заносимые в Документ. Где присутствует ошибка в коде?


Процедура ОбработкаПроведения(Отказ, Режим)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БронированиеНомера.НомерВГостинице.Ссылка,
| БронированиеНомера.ДатаПоселения,
| БронированиеНомера.ДатаВыезда
|ИЗ
| РегистрСведений.БронированиеНомера КАК БронированиеНомера
|ГДЕ
| БронированиеНомера.НомерВГостинице.Ссылка = &Ссылка";

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

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

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


Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Если ЭтотОбъект.ДатаПоселения <= ВыборкаДетальныеЗаписи.ДатаВыезда или
ЭтотОбъект.ДатаВыезда >= ВыборкаДетальныеЗаписи.ДатаПоселения

Тогда Отказ = Истина;

Иначе

// регистр БронированиеНомера
Движения.БронированиеНомера.Записывать = Истина;
Движение = Движения.БронированиеНомера.Добавить();
Движение.Постоялец = Постоялец;
Движение.ДатаПоселения = ДатаПоселения;
Движение.ДатаВыезда = ДатаВыезда;
Движение.Статус = Статус;
Движение.НомерВГостинице = НомерВГостинице;

// регистр ДляДиаграммыГанта
Движения.ДляДиаграммыГанта.Записывать = Истина;
Движение = Движения.ДляДиаграммыГанта.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ВидРасчета;
Движение.ПериодДействияНачало = ДатаПоселения;
Движение.ПериодДействияКонец = КонецДня(ДатаВыезда);
Движение.ПериодРегистрации = Дата;
Движение.НомерВГостинице = НомерВГостинице;
Движение.Постоялец = Постоялец;
Движение.Статус = Статус;

КонецЕсли;

КонецЦикла;

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

   

Besart

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

Zuull


|ИЗ
        |    РегистрСведений.БронированиеНомера КАК БронированиеНомера

Уважаемый Besart, так как я новичок хотелось бы поконкретнее строчкой кода увидеть объяснение, если Вам не трудно. И Запрос у меня из Регистра сведений (строчка кода выше)????

GRADUS

Программисты без ТЗ в вашем коде логику фигус два найдут. А ответ на ваш вопрос очень прост, ваше условие всегда обращается в истину, поэтому записей в регистре нет.

+1 к телу который написал выше, если ты хочешь найти все доки за конкретный период, то так и делай, зачем искать по ссылке текущего документа?

В общем продумай логику и переделай!

П.С. Если бы я делал, я бы вообще не связывал запись в регистр сведений и проверку. Ибо если у тебя проверку не прошел документ, тогда он и не проведется, а если прошел, то при проведении занесутся и записи в регистр сведений. Но не суть.

Zuull

Спасибо огромное за помощь, GRADUS! Я нашел, осознал свои ошибки. Вообщем исправлю все и выложу код:)

Zuull

Как и обещал выкладываю работающий код :D

Процедура ОбработкаПроведения(Отказ, Режим)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БронированиеНомераРег.ДатаПоселения,
| БронированиеНомераРег.ДатаВыезда,
| БронированиеНомераРег.Регистратор,
| БронированиеНомераРег.НомерВГостинице
|ИЗ
| РегистрСведений.БронированиеНомераРег КАК БронированиеНомераРег
|ГДЕ
| БронированиеНомераРег.НомерВГостинице = &НомерВГостинице";

Запрос.УстановитьПараметр("НомерВГостинице", НомерВГостинице);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

//Устранение эффекта совпадения ключевых полей при повторной записи документа в регистр сведений,
//для корректировки в документе ранее записанных дат.

Если ВыборкаДетальныеЗаписи.Регистратор = Ссылка

Тогда
//регистр БронированиеНомер
Движения.БронированиеНомераРег.Очистить();
Движения.БронированиеНомераРег.Записывать = Истина;
Движение = Движения.БронированиеНомераРег.Добавить();
Движение.Постоялец = Постоялец;
Движение.ДатаПоселения = ДатаПоселения;
Движение.ДатаВыезда = ДатаВыезда;
Движение.Статус = Статус;
Движение.НомерВГостинице = НомерВГостинице;

//регистр ДляДиаграммыГанта
Движения.ДляДиаграммыГанта.Очистить();
Движения.ДляДиаграммыГанта.Записывать = Истина;
Движение = Движения.ДляДиаграммыГанта.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ВидРасчета;
Движение.ПериодДействияНачало = ДатаПоселения;
Движение.ПериодДействияКонец = КонецДня(ДатаВыезда);
Движение.ПериодРегистрации = Дата;
Движение.НомерВГостинице = НомерВГостинице;
Движение.Постоялец = Постоялец;
Движение.Статус = Статус;

ИначеЕсли
ВыборкаДетальныеЗаписи.ДатаПоселения <= ДатаПоселения
и
ВыборкаДетальныеЗаписи.ДатаВыезда >= ДатаПоселения
или
ВыборкаДетальныеЗаписи.ДатаПоселения <= ДатаВыезда
и
ВыборкаДетальныеЗаписи.ДатаВыезда >= ДатаВыезда
или
ДатаПоселения < ВыборкаДетальныеЗаписи.ДатаПоселения
и
ДатаВыезда > ВыборкаДетальныеЗаписи.ДатаВыезда

Тогда
Отказ = Истина;
Сообщить ("Неправильно введена дата!");

Иначе
//регистр БронированиеНомера
Движения.БронированиеНомераРег.Записывать = Истина;
Движение = Движения.БронированиеНомераРег.Добавить();
Движение.Постоялец = Постоялец;
Движение.ДатаПоселения = ДатаПоселения;
Движение.ДатаВыезда = ДатаВыезда;
Движение.Статус = Статус;
Движение.НомерВГостинице = НомерВГостинице;

   //регистр ДляДиаграммыГанта
Движения.ДляДиаграммыГанта.Записывать = Истина;
Движение = Движения.ДляДиаграммыГанта.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ВидРасчета;
Движение.ПериодДействияНачало = ДатаПоселения;
Движение.ПериодДействияКонец = КонецДня(ДатаВыезда);
Движение.ПериодРегистрации = Дата;
Движение.НомерВГостинице = НомерВГостинице;
Движение.Постоялец = Постоялец;
Движение.Статус = Статус;

КонецЕсли;
КонецЦикла;
 
КонецПроцедуры


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск