Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
11 Дек 2017, 03:13
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Запрет проведения Документа по регистрам исходя из заданного условия  (Прочитано 3077 раз)

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

Оффлайн Zuull

  • *
  • Сообщений: 11
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-08-08
  • Сайт: 
  • Профессия: Ученик 1С
Добрый День! Требуется помощь  :(

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

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

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

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

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

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

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

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


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

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

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

Иначе

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

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

КонецЕсли;

КонецЦикла;

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

   


Оффлайн Besart

  • *****
  • Сообщений: 678
  • РЕПУТАЦИЯ: 142
  • КПД: 21%
  • Регистрация: 2012-12-10
    • Skype: artfa.a
  • Компания: Фрилансер
  • Профессия: Программист 8.1
вам в запосе нужно обращаться к регистру БронированиеНомера и проверять на наличие брони сравнивая даты с текущим документом, а вы в своем запросе обращаетесь к текущему документу и сравниваете даты текущего документа полученные запросом с датами текущего документа, т.е. сравниваете тек. док. с самим собой

Оффлайн Zuull

  • *
  • Сообщений: 11
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-08-08
  • Сайт: 
  • Профессия: Ученик 1С
|ИЗ
        |    РегистрСведений.БронированиеНомера КАК БронированиеНомера
Уважаемый Besart, так как я новичок хотелось бы поконкретнее строчкой кода увидеть объяснение, если Вам не трудно. И Запрос у меня из Регистра сведений (строчка кода выше)????

Оффлайн GRADUS

  • *****
  • Сообщений: 699
  • РЕПУТАЦИЯ: 51
  • КПД: 7%
  • Регистрация: 2013-06-08
  • Сайт: 
  • Профессия: Программист 1С
Программисты без ТЗ в вашем коде логику фигус два найдут. А ответ на ваш вопрос очень прост, ваше условие всегда обращается в истину, поэтому записей в регистре нет.

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

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

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

Оффлайн Zuull

  • *
  • Сообщений: 11
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-08-08
  • Сайт: 
  • Профессия: Ученик 1С
Спасибо огромное за помощь, GRADUS! Я нашел, осознал свои ошибки. Вообщем исправлю все и выложу код:)

Оффлайн Zuull

  • *
  • Сообщений: 11
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-08-08
  • Сайт: 
  • Профессия: Ученик 1С
Как и обещал выкладываю работающий код :D
Процедура ОбработкаПроведения(Отказ, Режим) 	

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

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

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

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

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

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

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

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

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

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

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

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

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

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



Теги:
 

Не открывает форму сохраненного документа, открывает форму нового.

Автор EHOTРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 4467
Последний ответ 13 Апр 2012, 23:26
от Vit1501
Автоматическое заполнение табличной части документа из табличной части другого

Автор WillРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 6
Просмотров: 15898
Последний ответ 16 Авг 2012, 12:07
от Will
Заполнение поля табличной части документа из табличной части справочника.

Автор Kurt_WagnerРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 4193
Последний ответ 06 Апр 2015, 20:08
от Kurt_Wagner
Заполнение табличной части документа реквизитами табличной части справочника

Автор kaf_infoРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 614
Последний ответ 10 Май 2017, 20:44
от ilnur75
Добавление сведений в графу "основание" документа "ТОРГ-12"

Автор Ярослав1984Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 4
Просмотров: 7729
Последний ответ 20 Авг 2013, 18:45
от Ярослав1984

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
160 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
55 Сообщений
alex0402
46 Сообщений
andron81_81
44 Сообщений
AIFrame
35 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
BuhRust
27 Сообщений
Golickoff Golickoff
27 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 161
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal