Имя: Пароль:
1C
1С v8
Календарь
0 TwoWorld
 
01.09.11
17:52
Создал справочник "Календарь",2 реквизита ДатаНач и ДатаКон, написал функцию по поиску рабочего дня, но она не работает, в чем проблема? (он почему то по реквизиту всегда выдает пустую ссылку)
Функция ПроверкаДатыВыходныхИПраздников(ДатаПроверки)
   ПромежДата =ДатаПроверки;
   ФлПервый = 0;
   Пока ЗначениеЗаполнено(ПромежДата) Цикл
       СтрокаНаинования =Справочники.Календарь;
       Строка =  СтрокаНаинования.НайтиПоРеквизиту("ДатаНач",ПромежДата);
       Если Строка <> СтрокаНаинования.ПустаяСсылка() Тогда
           если ФлПервый = 0 Тогда
               ПромежДата = Дата(Строка.ДатаКон) + 24*60*60;
               ФлПервый = 1;
           Иначе
               Прервать;
           КонецЕсли;
       Иначе
           ПромежДата = Дата(ПромежДата) + 24*60*60;
       КонецЕсли;
   КонецЦикла;            
   Возврат ПромежДата;
КонецФункции
1 TwoWorld
 
01.09.11
18:01
Вроде все правильно написано: только вот
Если Строка <> СтрокаНаинования.ПустаяСсылка() Тогда заменить на Если Строка = СтрокаНаинования.ПустаяСсылка() Тогда , но вс равно всегда пустаЯ ссылка выходит
2 Mort
 
01.09.11
18:10
Используй запрос.
3 Aleksei_Pro
 
01.09.11
21:48
Не думаю что этот код сработает, хотя самому интересно ход решения твой...довести над до ума только
4 Aleksei_Pro
 
01.09.11
21:56
(2) какой запрос, зачем? только вот сам не пойму, почему (0) у автора не работает....
5 Axel2009
 
02.09.11
09:08
псц код, но думаю что в датанач не дата находится.
6 Ненавижу 1С
 
гуру
02.09.11
09:10
а регистр сведений не лучше ли было юзать?
7 catena
 
02.09.11
09:12
А точно есть элемент с ДатаНач=ПромежДата?
И время совпадает?
8 Wobland
 
02.09.11
09:12
Пока ЗначениеЗаполнено(ПромежДата) Цикл
в данном случае практически Пока Истина Цикл
9 TwoWorld
 
02.09.11
13:32
А можно как то врея убрать из даты, но чтобы тип "Дата" остался?
10 acsent
 
02.09.11
13:34
СтрокаНаинования.
Это на каком языке?
11 Wobland
 
02.09.11
13:38
(9) Формат() спасёт?
12 TwoWorld
 
02.09.11
13:38
Все спасибо, взлетела программа!
13 TwoWorld
 
02.09.11
14:08
Вот код: он немного не так работает:
   ПромежДата =НачалоДня(ДатаПроверки);
   ФлПервый = 0;
   Пока ЗначениеЗаполнено(ПромежДата) Цикл
       Если ФлПервый
       СтрокаНаинования =Справочники.Календарь;
       Строка =  СтрокаНаинования.НайтиПоРеквизиту("ДатаНач",ПромежДата);
       Если Строка = СтрокаНаинования.ПустаяСсылка() Тогда
           ПромежДата = НачалоДня(Дата(ПромежДата)) + 24*60*60;
       Иначе
           ПромежДата = НачалоДня(Дата(Строка.ДатаКон)) + 24*60*60;
       КонецЕсли;
   КонецЦикла;            
   Возврат ПромежДата;


Пример: ДатаНач    Датакон
       01,01,2011 02,01,2011
       02,01,2011 03,01,2011
       
ДатаПроверки - 31,12,2011 и к этой дате нужно прибавить 1 рабочий день! Нужно чтобы получилось - 05,01,2011
Как исправить?
14 catena
 
02.09.11
14:12
(13)Это по какой логике должно получиться 05/01? О_О
15 TwoWorld
 
02.09.11
14:15
04,01,11 ..
16 catena
 
02.09.11
14:16
(15)Ну, 04/01 по идее должно получиться...
17 catena
 
02.09.11
14:16
Только вот из цикла не выйдет...
   Пока ЗначениеЗаполнено(ПромежДата) Цикл
18 TwoWorld
 
02.09.11
14:17
(17) вот и именно, как мне выйти из цикла правильно и когда?
19 catena
 
02.09.11
14:21
От задачи зависит... Задача не ясна...
20 TwoWorld
 
02.09.11
14:22
прибавить к дате 1 рабочий день!
21 catena
 
02.09.11
14:22
Чисто в продолжение бреда:

   ПромежДата =НачалоДня(ДатаПроверки);
   ФлПервый = 0;
   Пока ЗначениеЗаполнено(ПромежДата) Цикл
       СтрокаНаинования =Справочники.Календарь;
       Строка =  СтрокаНаинования.НайтиПоРеквизиту("ДатаНач",ПромежДата);
       Если Строка = СтрокаНаинования.ПустаяСсылка() Тогда
           Если флПервый=1 Тогда
               Прервать;
           КонецЕсли;    
           ПромежДата = НачалоДня(Дата(ПромежДата)) + 24*60*60;
           ФлПервый=ФлПервый+1;
       Иначе
           ПромежДата = НачалоДня(Дата(Строка.ДатаКон)) + 24*60*60;
           ФлПервый=0;
       КонецЕсли;
       
   КонецЦикла;            
   Возврат ПромежДата;
22 TwoWorld
 
02.09.11
14:50
В УТ 10,3 есть производственный календарь. Как можно на основании него проверить является ли некая дата "Выходным или праздником"?
23 and2
 
02.09.11
14:53
(22) ну там реквизит есть соответствующий.
полко надо еще "перенесенные праздничные и выходные" почитать
24 and2
 
02.09.11
14:54
ВидДня
25 TwoWorld
 
02.09.11
14:57
ВидДня - это что?
26 Axel2009
 
02.09.11
15:05
ВидДня - там указывается что это за дата.
27 TwoWorld
 
02.09.11
15:21
(26) а как обратиться или функция какая то есть?
28 catena
 
02.09.11
15:27
(27)Учи запросы, полезная вещь.
29 and2
 
02.09.11
15:33
Запрос=новый запрос;
     запрос.Текст="ВЫБРАТЬ
                  |    РегламентированныйПроизводственныйКалендарь.ВидДня,
                  |    ВЫБОР
                  |        КОГДА РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = ПеренесенныеРабочиеДни.РабочийДень
                  |            ТОГДА истина
                  |            ИНАЧЕ ложь
                  |    КОНЕЦ КАК Перенос
                  |ИЗ
                  |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПеренесенныеРабочиеДни КАК ПеренесенныеРабочиеДни
                  |        ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = ПеренесенныеРабочиеДни.РабочийДень
                  |                
                  |ГДЕ
                  |    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = &ДатаКалендаря
                                    |";
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший