helpf.pro
Регистрация

v8: Вывести свободную дату

Ermak
26.01.2016 16:08Прочитано: 2922

Добрый день! Встала такая задача разработать планирование. Был создан регистр ПланировщикРемонтныхЗаявок, где заносится информация Участок, ВремяЗаявки, ВидЗаявки, Количество. Когда создаем документ  Заявки, они записывают в регистр сведений ИсторияЗаявкиЕдиноеОкно, с чем я и сравниваю сколько еще я могу добавить заявок. У меня сделано, если заявку добавить можно выдается Предупреждение("Дата и время свободно!"); ,а если уже нельзя тогда выдается Предупреждение("На этот день и время количество заявок закончились!"+Символы.ПС+"Выберите другую дату или время.");. 

Можете показать на примере как можно сделать когда уже добавлять нельзя документ выводилась ближайшая свободная дата с фильтром.

Код 1C v 8.х
 Фильтр = Новый Структура();     
Фильтр.Вставить("Участок",ЛицевойСчет.Участок);
Фильтр.Вставить("ВремяЗаявки",ВремяЗаявки);
Фильтр.Вставить("ВидЗаявки",ВидЗаявки);
КоличествоРЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(ДатаЗаявки),Фильтр).Количество;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
              | ИсторияЗаявкиЕдиноеОкно.Период КАК Период,
              | ИсторияЗаявкиЕдиноеОкно.Участок КАК Участок,
              | КОЛИЧЕСТВО(ИсторияЗаявкиЕдиноеОкно.Статус) КАК Количество,
              | ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки КАК ВремяЗаявки,
              | ИсторияЗаявкиЕдиноеОкно.ВидЗаявки КАК ВидЗаявки
              |ИЗ
              | РегистрСведений.ИсторияЗаявкиЕдиноеОкно КАК ИсторияЗаявкиЕдиноеОкно
              |ГДЕ
              | ИсторияЗаявкиЕдиноеОкно.Период МЕЖДУДатаНач ИДатаКон
              | И ИсторияЗаявкиЕдиноеОкно.Участок =Участок
              | И ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки =ВремяЗаявки
              | И ИсторияЗаявкиЕдиноеОкно.ВидЗаявки =ВидЗаявки
              |
              |СГРУППИРОВАТЬ ПО
              | ИсторияЗаявкиЕдиноеОкно.Период,
              | ИсторияЗаявкиЕдиноеОкно.Участок,
              | ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки,
              | ИсторияЗаявкиЕдиноеОкно.ВидЗаявки";

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


Пока Результат.Следующий() Цикл              
КоличествоЗаявок=Результат.Количество;
КонецЦикла;

Если ЗначениеЗаполнено(КоличествоРЗ) Тогда


Если КоличествоЗаявок=Неопределено или КоличествоЗаявок < КоличествоРЗ или КоличествоРЗ=Неопределено Тогда
        Предупреждение("Дата и время свободно!");
Иначе
Предупреждение("На этот день и время количество заявок закончились!"+Символы.ПС+"Выберите другую дату или время.");


КонецЕсли;
КонецЕсли;
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
27.01.2016 01:56Ответ № 1

Нужно запросом сделать выбору на ближайшие дни и если там есть еще свободное, то вывести пользователю

Ermak
27.01.2016 08:57Ответ № 2

Я понимаю что можно запросом вот как сделать выбор на ближайшую свободную дату мне не понятно, можете на примере показать

IBReiter
27.01.2016 13:31Ответ № 3

Вы пример таблицы приведите, какие там вообще данные - тогда и пример запроса можно подумать.

А вообще, у вас же запрос это как раз и делает - просто перебирайте дни вперед и время, ну или как вам удобнее

Ermak
27.01.2016 16:16Ответ № 4

Вот пример РегистрыСведений.ПланировщикРемонтныхЗаявок

Дата Участок ВремяЗаявки ВидЗаявки Количество
26.01.2016 Иванова 08:00-12:00 ИГБУ 2
26.01.2016 Петрова 08:00-12:00 ИГБУ 2
26.01.2016 Иванова 12:00-17:00 ИГБУ 3
26.01.2016 Петрова 12:00-17:00 ИГБУ 6
27.01.2016 Иванова 08:00-12:00 ИГБУ 2
27.01.2016 Петрова 08:00-12:00 ИГБУ 2
28.01.2016 Иванова 08:00-12:00 ИГБУ 2
28.01.2016 Петрова 08:00-12:00 ИГБУ 2

Начинаем добавляться заявки . Выбираем дату 26.01.2016, участок Иванова, при выборе время 08:00-12:00 начинаем искать дату, если выбранная дата свободна (отбор идет по дате, участку, видзаявки, времязаявки) тогда добавляем, если не свободна тогда должен предложить согласно таблице дату 27.01.2016, если и здесь даты уже заняты тогда 28.01.2016, если и эта дата занята и таблица дальше не заполнена тогда 29.01.2016

IBReiter
28.01.2016 15:57Ответ № 5

ДлительностьДня = 9

Вашу таблицу группируете по Дата, Участок, ВидЗаявки, Сумма(ВремяКонЗаявки-ВремяНачЗаявки) - получаете сколько часов у каждого участка в дне занято

Далее отбираете те, у которых Сумма() < ДлительностьДня

Потом делаете внутреннее соединение с исходной таблицей по Дата, Участок, ВидЗаявки, Сумма() < ДлительностьДня - получаете дни, где есть свободное время

Если не соединилось, тогда Дата будет Максимум(Дата) по Дата, Участок, ВидЗаявки

Ermak
28.01.2016 16:21Ответ № 6

Разобрался

Код 1C v 8.х
 Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПланировщикРемонтныхЗаявок.Период КАК Период,
| ПланировщикРемонтныхЗаявок.Участок КАК Участок,
| ПланировщикРемонтныхЗаявок.ВремяЗаявки КАК ВремяЗаявки,
| ПланировщикРемонтныхЗаявок.ВидЗаявки КАК ВидЗаявки,
| ПланировщикРемонтныхЗаявок.Мастер
|ИЗ
| РегистрСведений.ПланировщикРемонтныхЗаявок КАК ПланировщикРемонтныхЗаявок
|ГДЕ
| ПланировщикРемонтныхЗаявок.Участок =Участок
| И ПланировщикРемонтныхЗаявок.ВремяЗаявки =ВремяЗаявки
| И ПланировщикРемонтныхЗаявок.ВидЗаявки =ВидЗаявки
|
|УПОРЯДОЧИТЬ ПО
| Период УБЫВ";

Запрос.УстановитьПараметр("Участок",ЛицевойСчет.Участок);
Запрос.УстановитьПараметр("ВидЗаявки",ВидЗаявки);
Запрос.УстановитьПараметр("ВремяЗаявки",ВремяЗаявки);
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл              
ТекДат=Результат.Период;

Фильтр = Новый Структура();     
Фильтр.Вставить("Участок",ЛицевойСчет.Участок);
Фильтр.Вставить("ВремяЗаявки",ВремяЗаявки);
Фильтр.Вставить("ВидЗаявки",ВидЗаявки);
КоличествоРЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(ТекДат),Фильтр).Количество;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ИсторияЗаявкиЕдиноеОкно.Период КАК Период,
| ИсторияЗаявкиЕдиноеОкно.Участок КАК Участок,
| КОЛИЧЕСТВО(ИсторияЗаявкиЕдиноеОкно.Статус) КАК Количество,
| ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки КАК ВремяЗаявки,
| ИсторияЗаявкиЕдиноеОкно.ВидЗаявки КАК ВидЗаявки
|ИЗ
| РегистрСведений.ИсторияЗаявкиЕдиноеОкно КАК ИсторияЗаявкиЕдиноеОкно
|ГДЕ
| ИсторияЗаявкиЕдиноеОкно.Период МЕЖДУДатаНач ИДатаКон
| И ИсторияЗаявкиЕдиноеОкно.Участок =Участок
| И ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки =ВремяЗаявки
| И ИсторияЗаявкиЕдиноеОкно.ВидЗаявки =ВидЗаявки
|
|СГРУППИРОВАТЬ ПО
| ИсторияЗаявкиЕдиноеОкно.Период,
| ИсторияЗаявкиЕдиноеОкно.Участок,
| ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки,
| ИсторияЗаявкиЕдиноеОкно.ВидЗаявки";

Запрос.УстановитьПараметр("Участок",ЛицевойСчет.Участок);
Запрос.УстановитьПараметр("ВидЗаявки",ВидЗаявки);
Запрос.УстановитьПараметр("ВремяЗаявки",ВремяЗаявки);
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ТекДат));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ТекДат));
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл              
КоличествоЗаявок=Результат.Количество;
КонецЦикла;

Если ЗначениеЗаполнено(КоличествоРЗ) Тогда

Если КоличествоЗаявок=Неопределено или КоличествоЗаявок < КоличествоРЗ или КоличествоРЗ=Неопределено Тогда
ДатаЗаявки=ТекДат;
Предупреждение("Ближайшая свободная дата "+Формат(ТекДат,"ДФ='дд.ММ.гггг'"));
Иначе
//ДатаЗаявки = ДатаЗаявки+86400;
//ВремяЗаявки="";
//Предупреждение("На этот день и время количество заявок закончились!"+Символы.ПС+"Выберите дату "+Формат(ТекДат,"ДФ='дд.ММ.гггг'"));
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;


Ermak
28.01.2016 16:21Ответ № 7
Вопрос закрыт!
Ermak
28.01.2016 17:38Ответ № 8

При тестировании появились ошибки:

1) когда все планированные даты использованы, заявки все равно создаются не уже не обращая внимания на документ планирования.

2) Если выбранная дата занята тогда выдает самую последнюю дату, хотя свободные есть еще ранее даты.

IBReiter
29.01.2016 11:50Ответ № 9

Так вы прочитайте мой вариант запроса к таблице, может все таки эта идея лучше существующей?

Ermak
29.01.2016 15:21Ответ № 10

IBReiter можете на примере показать. Как мне сделать эту сумму Сумма(ВремяКонЗаявки-ВремяНачЗаявки)

Я сейчас сделал так

Код 1C v 8.х
     ОчиститьСообщения();
    Участок=Справочники.Участки.НайтиПоНаименованию("Перевалка");
    ВидЗаявки=Перечисления.ВидЗаявки.АбонентИГБУ;
    ВремяЗаявки=Перечисления.ВремяЗаявки.ВремяДоОбеда;
   
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |   ПланировщикРемонтныхЗаявок.Период КАК Период,
    |   ПланировщикРемонтныхЗаявок.Участок КАК Участок,
    |   ПланировщикРемонтныхЗаявок.ВремяЗаявки КАК ВремяЗаявки,
    |   ПланировщикРемонтныхЗаявок.ВидЗаявки КАК ВидЗаявки,
    |   ПланировщикРемонтныхЗаявок.Мастер
    |ИЗ
    |   РегистрСведений.ПланировщикРемонтныхЗаявок КАК ПланировщикРемонтныхЗаявок
    |ГДЕ
    |   ПланировщикРемонтныхЗаявок.Участок =Участок
    |   И ПланировщикРемонтныхЗаявок.ВидЗаявки =ВидЗаявки
    |
    |УПОРЯДОЧИТЬ ПО
    |   Период";
   
    Запрос.УстановитьПараметр("Участок",Участок);
    Запрос.УстановитьПараметр("ВидЗаявки",ВидЗаявки);
    Запрос.УстановитьПараметр("ВремяЗаявки",ВремяЗаявки);
    Результат = Запрос.Выполнить().Выбрать();
   
    Пока Результат.Следующий() Цикл              
               
        Фильтр = Новый Структура();    
        Фильтр.Вставить("Участок",Участок);
        Фильтр.Вставить("ВремяЗаявки",ВремяЗаявки);
        Фильтр.Вставить("ВидЗаявки",ВидЗаявки);
        КоличествоРЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(ТекДат),Фильтр).Количество;    
       
       
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        |   ИсторияЗаявкиЕдиноеОкно.Период КАК Период,
        |   ИсторияЗаявкиЕдиноеОкно.Участок КАК Участок,
        |   КОЛИЧЕСТВО(ИсторияЗаявкиЕдиноеОкно.Статус) КАК Количество,
        |   ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки КАК ВремяЗаявки,
        |   ИсторияЗаявкиЕдиноеОкно.ВидЗаявки КАК ВидЗаявки
        |ИЗ
        |   РегистрСведений.ИсторияЗаявкиЕдиноеОкно КАК ИсторияЗаявкиЕдиноеОкно
        |ГДЕ
        |   ИсторияЗаявкиЕдиноеОкно.Период МЕЖДУДатаНач ИДатаКон
        |   И ИсторияЗаявкиЕдиноеОкно.Участок =Участок
        |   И ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки =ВремяЗаявки
        |   И ИсторияЗаявкиЕдиноеОкно.ВидЗаявки =ВидЗаявки
        |
        |СГРУППИРОВАТЬ ПО
        |   ИсторияЗаявкиЕдиноеОкно.Период,
        |   ИсторияЗаявкиЕдиноеОкно.Участок,
        |   ИсторияЗаявкиЕдиноеОкно.ВремяЗаявки,
        |   ИсторияЗаявкиЕдиноеОкно.ВидЗаявки";
       
        Запрос.УстановитьПараметр("Участок",Участок);
        Запрос.УстановитьПараметр("ВидЗаявки",ВидЗаявки);
        Запрос.УстановитьПараметр("ВремяЗаявки",ВремяЗаявки);
        Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ТекДат));
        Запрос.УстановитьПараметр("ДатаКон",КонецДня(ТекДат));
        Результат = Запрос.Выполнить().Выбрать();
       
        Пока Результат.Следующий() Цикл              
            КоличествоЗаявок=Результат.Количество;     
        КонецЦикла;
       
        Если КоличествоЗаявок=Неопределено или КоличествоЗаявок < КоличествоРЗ или КоличествоРЗ=Неопределено Тогда         
        Иначе
            ТекДат=ТекДат+86400;
        КонецЕсли;
         Прервать;
 
    КонецЦикла;

Перебирает каждую дата, делает остановку на дате когда она рабочая. Как исправить чтобы не показывал все подряд а сразу выводит рабочую

IBReiter
29.01.2016 17:09Ответ № 11

У вас время как задается?

Сделайте два реквизита ВремяНачЗаявки, ВремяКонЗаявки

Сделайте его Тип данных - Дата, Состав даты - время, тогда сможете их в запросе вычитать, только разность будет в секундах - ее в часы сможете перевести /3600, либо в секундах и оперируйте

Ermak
29.01.2016 22:26Ответ № 12

IBReiter мне время не надо, мне надо найти свободную дату.

Ermak
01.02.2016 10:11Ответ № 13

IBReiter что то не понятно по вашему примеру, можете по моему подсказать почему не правильно работает

Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.