7.7 Дата + Время в реквизите типа "Дата"

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Samouchka, 10 май 2013.

  1. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Здравствуйте. На форме есть два реквизита:
    ДатаС - тип "Дата", например, 10.05.2013
    ДатаСВрем - тип "Строка", содержит время, например 15:36:29

    Требуется в реквизит формы ДатВрем типа "Дата" вывести дату сложения реквизитов ДатаС+ ДатаСВрем, т.е. 10.05.2013 15:36:29. Допускаю, что визуально в форме времени видно не будет, т.е. ДатВрем представлен как 10.05.2013, но подразумеваться должна дата с правильным временем. Мне это важно чтобы передать ДатВрем в запрос где документы выбираются с учетом времени. Может есть у кого-нибудь такая функция сложения даты и времени? В Инете ничё дельного не нашел.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    В 7ке только ПозицияДокумента объединяет дату/время
  3. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Во первых, есть метод не ПозицияДокумента, а СформироватьПозициюДокумента. Во-вторых, реквизиты о которых я говорил, не являются датой и временем данного документа, они произвольные.
  4. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    тип реквизита будет СТРОКА
    Код:
    "" + ДатаС + " " + ДатаСВрем
    или
    Код:
    Строка(ДатаС) + " " +ДатаСВрем
    на всякий добавлю, время в позиции хранится в секундах например:
    документ от 24.11.12 16:21:06 = #20121124 588660000 301989
  5. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Молодец, Глюка! Я так тоже умею! Мне нужен реквизит обязательно типа "Дата", как я и писал, со строкой мне делать нешего!!!
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    угу.. Просто образно выразился

    Ну и что... Что мешает вам сделать так:
    Код:
    ДатВрем=СформироватьПозициюДокумента(ДатаДок,ЧасПоз,МинПоз,СекПоз);
    
    Дате и время получите из строки
  7. Vlan
    Offline

    Vlan Гость Гость

    Тут есть противоречие. Насколько я понял из исходных данных, дата+время будут использованы в запросе. А запрос и есть строка по своей сути.
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    В запросе разложить позицию документа для того чтобы применить сравнение???? БРЕД.
  9. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    ну можно еще все это дело хранить в секундах :roflmao:
    Код:
    
    Функция ДатуВремяВСекунды(ДатаД, ВремяЧ, Минут="", Секунд=0) Экспорт
    Перем Рез;
    
    КолДней = ДатаД - Дата(0,1,1);//Дата("01.01.0000") Прошло дней от Рождества Хритова
    
    Если (ТипЗначенияСтр(Минут)="Число") И (ТипЗначенияСтр(ВремяЧ)="Число") Тогда //Время задано раздельно
    Рез = 86400*КолДней + 3600*ВремяЧ + 60*Минут + Секунд;
    
    ИначеЕсли (ТипЗначенияСтр(ВремяЧ)="Строка") И (СтрЧислоВхождений(ВремяЧ,":")=2) Тогда
    чч  = Число(Сред(ВремяЧ,1,2));
    мм  = Число(Сред(ВремяЧ,4,2));
    сс  = Число(Сред(ВремяЧ,7,2));
    Рез = 86400*КолДней + 3600*чч + 60*мм + сс;
    
    Иначе
    Рез = 0;
    КонецЕсли;
    
    Возврат Рез; //максимальное значение = 315 569 433 599 (12 знаков)
    КонецФункции
    
    Функция ДатаВремяИзСекунд(Секунд, ВозвДаты, ВозвЧас, ВозвМин, ВозвСек) Экспорт
    КолДней  = Цел(Секунд/86400);
    ВозвДаты = Дата(0,1,1) + КолДней;
    ОстСек   = Секунд%86400;// Секунд - КолДней*86400
    
    ВозвЧас  = Цел(ОстСек/3600);
    ОстСек   = ОстСек%3600;
    
    ВозвМин  = Цел(ОстСек/60);
    
    ВозвСек  = ОстСек%60;
    
    Возврат Строка(ВозвЧас)+":"+ВозвМин+":"+ВозвСек;
    КонецФункции
    
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Разумеется можно... Только ведь задача стоит передать в запрос. А разложить внутри запроса дату/время для сравнения невозможно. Поэтому теряет всякий смысл ваша идея
  11. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    дак и в запрос передавать в секундах и в реквизите документов тоже хранить в секундах
    и в запросе можно будет сравнивать как числа
  12. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    Вот придумал пример как можно использовать эти самые секунды
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ЗаявкаНаВыезд = Документ.ЗаявкаНаВыезд.ТекущийДокумент;
    |ДатаВремяВызова = Документ.ЗаявкаНаВыезд.ДатаВремяВызова;
    |Условие((ДатаВремяВызова % 86400 >= ВремяОт) И (ДатаВремяВызова % 86400 <= ВремяПо));
    |Условие((ЗаявкаНаВыезд.ДатаВремяДок >= ВыбНачМомент)  И (ЗаявкаНаВыезд.ДатаВремяДок <= ВыбКонМомент));
    |"//}}ЗАПРОС
    ;
    ВремяОт=ДатуВремяВСекунды(Дата(0,1,1),"13:20:00");
    ВремяПо=ДатуВремяВСекунды(Дата(0,1,1),"14:10:00");
    ВыбНачМомент=ДатуВремяВСекунды(ВыбНачПериода,"10:00:00");
    ВыбКонМомент=ДатуВремяВСекунды(ВыбКонПериода,"18:00:00");
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    допустим нужно показать все заявки начиная с ВыбНачМомент (начало рабочего дня) по ВыбКонМомент (конец рабочего дння)
    у которых время вызова попадает в интервал с 13:20:00 до 14:10:00

    Одно НО - данное решение я только-только придумал и нигде не применял (не проверял в общем, но в теории должно работать)
  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Так это же придется заводить специальный реквизит.. И не факт что в одном документе.
    + необходимо создавать механизм заполнения реквизита...

    Короче... Чего уж проще!
    Код:
    НужнаяПоз1=СформироватьПозициюДокумента(ТекущаяДата(),11,11,11);
    НужнаяПоз2=СформироватьПозициюДокумента(ТекущаяДата(),11,11,59);
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ЗаявкаНаВыезд = Документ.ЗаявкаНаВыезд.ТекущийДокумент;
    |Условие((ЗаявкаНаВыезд.ПолучитьПозицию() >= НужнаяПоз1)  И (ЗаявкаНаВыезд.ПолучитьПозицию()<= НужнаяПоз2));
    |"//}}ЗАПРОС
    ;
    
    
    Отберет все заявки в интервале от 11часов 11минут 11секунд до 11часов 11минут 59 секунд.
    Работает. Все штатными методами. Проверяйте.
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не проверял, но думаю сработает и при задании периода в запросе

Поделиться этой страницей