Имя: Пароль:
1C
1С v8
Почему в запросах следует использовать Границу вместо Даты?
,
0 ivanovnm
 
11.11.13
12:05
В одной из организаций местный РП меня отчитал: "Мы в запросах используем только границы, почему вы в запросе используете даты?". Запрос был в СКД.

Заказчики у организации именитые, соответственно кодеры должны быть знающие опытные. Оттуда я уже ушел, но этот вопрос до сих пор не дает покоя. В яндексах-гуглах ничего похожего нет. Может кто-то в курсе, объяснит причину отказа от использования тип "Дата" в запросах?
14 ivanovnm
 
11.11.13
12:14
(12) Вот вот
15 Classic
 
11.11.13
12:15
(9)
Так в семерке все доки в одной таблице валялись - можно спокойно было определить порядок документов. В восьмерке это уже проблематичней
16 Fish
 
11.11.13
12:16
(13) Потому что надо читать СП: "Для значений типа Булево всегда возвращается Истина." :)
17 Maxus43
 
11.11.13
12:17
(0) >>местный РП меня отчитал

как РП может и ничего, а так наслушался кодеров и думает что умный. Никто никогда не говорил что следует использовать её... она используется когда надо, а не везде. Если они тыкают везде границу - то контора быдлокодеров это, только и всего
18 Classic
 
11.11.13
12:18
(13)
И хорошо :)
19 skunk
 
11.11.13
12:18
(12)привычка хуже пистолета ... показали одиэснику про границы ... вот он и шлет эти границы туда куда надо и не надо
20 ivanovnm
 
11.11.13
12:19
(6) Микроскоп - не для забивания гвоздей
21 Classic
 
11.11.13
12:19
(17)
Угу. Наверняка просто раз столкнулся с необходимостью использования границы (в документе скорее всего) -  и все, он обладает тайным знанием про то, что даты - это фигня. Границы - наше фсьо
22 Зойч
 
11.11.13
12:19
(17) У конторы есть стандарты и они их придерживаются. А тут пришел х@р с горы и заявляет что будет писать как он хочет
23 Classic
 
11.11.13
12:21
(22)
РП? :)
24 Тролль главный
 
11.11.13
12:21
(16) странный ответ
25 Maxus43
 
11.11.13
12:22
(22) стандарты это хорошо, но пихать границу в каждую щель - хреновый стандарт.
Дак слова то ещё умные, "Мы в запросах используем только границы" :) клиентам же по ушам этим ездит, а проги ржут после этого, и над РП, и над заказчиком, и над проами с такими стандартами
26 Бледно Золотистый
 
11.11.13
12:22
(24) Чего странного?
27 Зойч
 
11.11.13
12:26
(23) Что РП? кто то же должен проверять. Для маленьких команд вполне может и рп
28 Тролль главный
 
11.11.13
12:26
(26)было бы странно, если бы в СП было написано по-другому
это все равно, что: "почему Земля притягивает предметы?" "так в книжке написано"
29 ИсчадиеADO
 
11.11.13
12:27
(27) палишься :)
30 ИсчадиеADO
 
11.11.13
12:28
а чо, рп разве может быть не прогом?
31 Classic
 
11.11.13
12:29
(28)
Скажем так. Хорошо, что ЗначениеЗаполнено(Ложь) = Истина.
Хотя с точки зрения хранения данных это странно
32 Classic
 
11.11.13
12:29
(30)
Конечно. Правда чаще РП - просто паршивый прог, но и непрогом он тоже может быть
33 Зойч
 
11.11.13
12:30
(30) чтоб следить за стандартами особой квалификации не надо
34 Нуф-Нуф
 
11.11.13
12:32
ну когда нужен остаток на конец месяца - нужно использовать границу
35 ИсчадиеADO
 
11.11.13
12:32
(32) жесть какая...
а тут еще Рому Печенкина ругают...
(34) обычно в скд пишут ДобавитьКДате(&КонМесяца, Секунда,1)
36 Нуф-Нуф
 
11.11.13
12:34
(35) чет гамнокодом попахивает
37 Зойч
 
11.11.13
12:34
(35) быдлокод
38 Джинн
 
11.11.13
12:34
(35) Обычно в СКД применяют стандартный период и не занимаются извращениями
39 Classic
 
11.11.13
12:36
(36)(37)
Слет РПшников-стандартистов?
40 ИсчадиеADO
 
11.11.13
12:41
(38) стандартный период - это отлично, но в некоторых задачах сам период может быть расчетным
41 Пол Ньюман
 
11.11.13
12:45
Прочитал 40 ответов, так и не понял в каких случаях нужно применять границу, а в каких достаточно даты. Например для регистра накопления, таблицы ОстаткиОбороты
42 Zifgif
 
11.11.13
12:47
(0)Граница была актуальна 8.1 и кодеры которые ее любят явно воспитывались до версии 8.2. В Версии 8.2  В СКД понятия границы нету вообще (Закладка  "параметры"), поэтмоу я вообще отказлся от использования границы. Если нужны остатки на 23:59:59 Берешь на секунду раньше, то есть начало следующего дня. и все! НО! ПОМНИ , ЧТО В Оборотных регистрах секунда уже включает все записи. т.е. в оборотном дата с 23:59:59 - возьмет все записи
43 Тролль главный
 
11.11.13
12:48
ИМХО в СКД для остаков и/или оборотов достаточно КОНЕЦПЕРИОДА()
44 Classic
 
11.11.13
12:49
(41)
Да все просто.
В ВТшках действуют такие правила
Остатки() - по умолчанию вид границы Исключая
Обороты, ОстаткиИОбороты - вид границы Включая

Вариантов когда данные принципы не совпадают с требованиями в отчетах не очень часты.
Остатки на конец месяца как правило без оборотов не нужны, в таких случая обычно оперирут понятиям остатки на начало месяца
Остатки на начало конца периода оборотов нужны еще реже.
Обычно подобные траболы возникают когда начинаешь делать объединения/соединения разных типов ВТ. Тогда надо аккуратно смотреть. Но и в таком случае ДОБАВИТЬКДАТЕ куда читабельней, чем два разных параметра
45 skunk
 
11.11.13
12:50
(41)надо не для регистров смотреть ... а по ситуации .. в отчетах границу использовать моветон, там лучшее дата ... в модулях проведения документов скорее наоборот
46 педальный трактор
 
11.11.13
12:50
(43) Не работает если документы записаны на  23:59:59
47 Аденэсниг
 
11.11.13
12:50
>= не равно >
48 ИсчадиеADO
 
11.11.13
12:51
(43) нет, для остатков нет,  для оборотов да
49 Нуф-Нуф
 
11.11.13
12:53
Внимание. Результаты тестов.

Запрос:

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад КАК Склад1,
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура1,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры1,
    ТоварыНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры1,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток1
{ВЫБРАТЬ
    Склад1.*,
    Номенклатура1.*,
    ХарактеристикаНоменклатуры1.*,
    СерияНоменклатуры1.*,
    КоличествоОстаток1}
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&ВотТутБудутРазныеПериоды, ) КАК ТоварыНаСкладахОстатки
ГДЕ
    ТоварыНаСкладахОстатки.Склад = &Склад
    И ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура

Запрос был выполнен 4 раза, где в качестве параметра ВотТутБудутРазные передавались следующие значения:

1. Дата 10.11.2013 23:59:59
2. КонецПериода(10.11.2013 23:59:59)
3. СтандартныйПериод.ДатаОкончания, где дата окончания = 10.11.2013
4. ГраницаВключая на основе даты 10.11.2013 23:59:59

В базе есть движение регистра сделанное с периодом 10.11.2013 23:59:59

Так вот. Верные остатки будут только в варианте 4
50 Нуф-Нуф
 
11.11.13
12:57
лично у меня функция общего модуля, которая возвращает границе по дате. в выражения параметров удобно использовать следующее ОбщийМодульСКД.КонецПериода(&ПериодОтчета, "День")
51 Поросенок Петр
 
11.11.13
12:58
Ба! Сколько капитанов очевидности в ветке! Целый офицерский корпус.
52 azernot
 
11.11.13
12:58
Виртуальная таблица Остатки выдаёт данные на дату не включительно. Т.е. Остатки на 10.11.2013 23:59:59 не будут включать движения за 10.11.2013 23:59:59.

Виртуальная таблица ОстаткиИОбороты выдаёт даные по дату включительно, те конечный остаток на 10.11.2013 23:59:59 будет включать движения за 10.11.2013 23:59:59.
53 ivanovnm
 
11.11.13
12:59
(49) А вариант 11.11.2013 00:00:00 чем не нравится?
54 Тролль главный
 
11.11.13
13:00
(46)(48) в СКД? значит книжка врёт
55 Нуф-Нуф
 
11.11.13
13:00
держите. бесплатно.

Функция КонецПериода(Дата, Период) Экспорт
    
    Период = ВРег(Период);
    Если Период = "МИНУТА" Тогда
    
        Возврат Новый Граница(КонецМинуты(Дата), ВидГраницы.Включая);
        
    ИначеЕсли Период = "ЧАС" Тогда
        
        Возврат Новый Граница(КонецЧаса(Дата), ВидГраницы.Включая);
        
    ИначеЕсли Период = "ДЕНЬ" Тогда
        
        Возврат Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
        
    ИначеЕсли Период = "НЕДЕЛЯ" Тогда
        
        Возврат Новый Граница(КонецНедели(Дата), ВидГраницы.Включая);
        
    ИначеЕсли Период = "МЕСЯЦ" Тогда
        
        Возврат Новый Граница(КонецМесяца(Дата), ВидГраницы.Включая);
        
    ИначеЕсли Период = "КВАРТАЛ" Тогда
        
        Возврат Новый Граница(КонецКвартала(Дата), ВидГраницы.Включая);
        
    ИначеЕсли Период = "ГОД" Тогда
        
        Возврат Новый Граница(КонецГода(Дата), ВидГраницы.Включая);
        
    Иначе
        
        Возврат Дата;
        
    КонецЕсли;
       
КонецФункции
56 Нуф-Нуф
 
11.11.13
13:01
(53) просто не гуд
57 ivanovnm
 
11.11.13
13:02
(56) почему?
58 Нуф-Нуф
 
11.11.13
13:03
(57) потому что (с)
59 ivanovnm
 
11.11.13
13:04
(58) тут и не поспоришь
60 Нуф-Нуф
 
11.11.13
13:04
(60) ато! ))))
61 Поросенок Петр
 
11.11.13
13:05
(55) Функция, возвращающая разные типы. Фу.
62 ivanovnm
 
11.11.13
13:05
(60) как будто в ту контору вернулся :)
63 Нуф-Нуф
 
11.11.13
13:08
используйте границы, будьте мужиками, блеать!
64 Romich1981
 
11.11.13
13:09
(49) +1
65 Тролль главный
 
11.11.13
13:09
(63) убедил, даешь единоообразие!
66 Поросенок Петр
 
11.11.13
13:13
Ну и собственно, как обычно. Три стадии специалиста:

1. Не знает про функционал/подход и не использует его где нужно.
2. Узнал про функционал/подход и теперь суёт его куда надо и куда не надо. В особо запущенных случаях везде его пропагандирует.
3. Использует функционал/подход именно там, где он нужен.

В любой срачевой ветке про кодинг прослеживается эта закономерность. Про СКД, БСП, временные таблицы и т.п.
67 Нууф-Нууф
 
11.11.13
13:21
(66) намек понятен )))

тогда как спец 3го уровня скажи, когда нужно использовать границу, а когда ДобавитьВремя?
68 Classic
 
11.11.13
13:28
(67)
При правильно рассчитанных остатках граница без момента времени не нужна вообще.
69 Поросенок Петр
 
11.11.13
13:28
(67) Тыща раз тут уже озвучили. Вирт таблица оборотов второй параметр типа Дата по-умолчанию приводит к границе включая. А добавлять секунду это, от незнания границ вообще такое можно придумать.
70 Нууф-Нууф
 
11.11.13
13:32
(69) про обороты в курсе. я про виртуальную таблицу остатки говорил
71 Нууф-Нууф
 
11.11.13
13:33
(68) а что есть правильно рассчитанные остатки?
72 Пол Ньюман
 
11.11.13
13:36
Правильно я понимаю? Для остатков и оборотов лучше указывать Границу ключая, иначе не попадут записи последней секунды?
73 Classic
 
11.11.13
13:36
(71)
?
Они обычно правильно рассчитаны.
При неправильно рассчитанных остатках остаток на конец периода не совпадает с остатком на начало следующего.
Иногда для нахождения подобного бага ГРАНИЦА в запросе не помешает. В остальных случаях - граница избыточное зло.
74 Classic
 
11.11.13
13:37
(72)
для оборотов и так по-умолчанию ВКЛЮЧАЯ
Для остатков надо определиться, вы остатки на начало хотите или на конец
75 Тролль главный
 
11.11.13
13:38
(69) а зачем помнить тут так, а тут этак, надо единообразно
76 Пол Ньюман
 
11.11.13
13:39
(74) Например в ОстаткиОбороты получаю остатки по периодам на начало и конец.
77 Classic
 
11.11.13
13:40
В ОстаткиИОбороты по умолчанию граница ВКЛЮЧАЯ
78 Classic
 
11.11.13
13:40
(77)
Начальный исключая, конечный - включая.
В общем все с логикой совпадает :)
79 Нууф-Нууф
 
11.11.13
13:48
(73) т.е. ты за "ДобавитьКДате"?
80 Нууф-Нууф
 
11.11.13
13:49
и где же специалист 3го уровня...
81 Поросенок Петр
 
11.11.13
13:51
Ужо разжовано всё сто раз.
82 Classic
 
11.11.13
13:54
(79)
Да. В отчетах конечно. Когда одним из периодов становится документ - здесь рисуется совсем другая история.
А в отчетах - ДОБАВИТЬКДАТЕ. Нефиг устраивать зоопарк параметров, для каждого из которых надо помнить, а что за граница у него.
83 Поросенок Петр
 
11.11.13
13:55
+(81)
Непосредственное указание границы чаще всего необходимо в тех случаях, когда мы получаем остатки на конец периода через ВТ "Остатки". Всё. Остальное использование границ оправдано при использовании вместе с моментом времени документа.

(82) А тут не соглашусь.
84 ivanovnm
 
11.11.13
14:02
(83) А тут не соглашусь. Чем Граница.Включая на 01.01.2013 23:59:59 лучше чем Дата 02.01.2013 00:00:00?
85 Нуф-Нуф
 
11.11.13
14:07
(84) потому что если в скд у тебя несколько разных запросов, и остатки и остаткиИобороты, то ты будет конфуз
86 Classic
 
11.11.13
14:14
(85)
С ДОБАВИТЬКДАТЕ не будет, а с границами - вполне возможно. поскольку логика сразу разлетается по разным местам
87 ivanovnm
 
11.11.13
14:14
(85) Конфуз будет если будет граница - ее нельзя перевести в дату, а с датой наоборот никакого конфуза не возникнет
88 Зойч
 
11.11.13
14:15
(87) зачем границу в дату переводить?
89 Classic
 
11.11.13
14:17
(88)
Простейший пример - в Оборотах с периодичностью ДЕНЬ считать количество дней с начала периода.
Для этих целей еще один параметр заводить?
90 ivanovnm
 
11.11.13
14:23
(88) Допустим нужны обороты за период из регистра остатков и состояние на окончание периода из регистра состояния. Если конец периода задать как границу, то ни правильного состояния не получить, ни рассчитать не получится.
91 sanja26
 
11.11.13
14:28
Кто получает в отчетах остатки на границу??
Я за добавить к дате
92 Classic
 
11.11.13
14:29
Давайте голосовалку
93 ivanovnm
 
11.11.13
14:32
(92) В этой теме можно сделать?
94 Нуф-Нуф
 
11.11.13
14:33
(86) наоборот. объявил границу в параметрах и юзай ее во всех запросах СКД (остатках и остаткиИоборотах), а если использовать просто дату, то в одном месте придется использовать дату, а в другом добавлять секунду
95 Нуф-Нуф
 
11.11.13
14:33
(93) добавь голосовалку, будь мужиком, блеать!
96 milan
 
11.11.13
14:38
Может РП имел ввиду то, что периоды отчета надо вводить через реквизит с типом "стандартный период" и выставлять параметры ВТ через значения его границ ?
97 Classic
 
11.11.13
14:38
(94)
Во всех?
В одном тебе надо ВКЛЮЧАЯ, в другом - ИСКЛЮЧАЯ и каждый раз надо смотреть, как какой параметр заполнили в где-то в модуле отчета. А так знаешь, что Остатки - всегда исключая и не паришься - анализируешь только текст запроса. С  одной переменной/параметром, которая означает ОкончаниеПериода
98 ivanovnm
 
11.11.13
14:40
(96) через значения его реквизитов, а при чем тут границы?
99 sanja26
 
11.11.13
14:46
хотя если параметр выводить в шапку отчета, то при ДобавитьКДате() будет не та дата на виду у пользователя. в такой ситуации можно и границу
100 milan
 
11.11.13
14:46
(98) при том что если 2 параметра датаначала и датаокончания
то остатки и обороты получишь с 01.01.12 по 31.12.12
а если брать из периода получишь с 01.01.12 по конец дня 31.12.12
101 Classic
 
11.11.13
14:47
(99)
Почему это? Как раз параметр у нас один
102 Classic
 
11.11.13
14:47
(99)
Почему это? Как раз параметр у нас один и правильный
103 sanja26
 
11.11.13
14:49
(102) точно, тогда нафиг вообще границу в отчетах
104 badboychik
 
11.11.13
15:54
еще в курсах по СКД вроде видел такое:

ДОБАВИТЬКДАТЕ(ДатаОкончания(&Период),"СЕКУНДА",1)
105 ivanovnm
 
11.11.13
16:05
(104) может ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(&Период, День), СЕКУНДА, 1)
106 badboychik
 
11.11.13
16:12
это если прямо в запросе. А если в выражениях на СКД, то точнее так:  ДОБАВИТЬКДАТЕ(&Период.ДатаОкончания,"СЕКУНДА",1)
107 capitanjack1
 
11.11.13
16:48
а почему нормально работают запросы
в которые параметр &КонДата передаются параметры типа
КонецМесяца(ТекущаяДата()). ведь например расчеты себестоимости проводятся на 23:59:59 последней даты месяца и всё обороты нормально попадают в запросы ? (границами я тоже не пользуюсь)
108 Classic
 
11.11.13
17:11
(107)
Потому что Обороты - это ВКЛЮЧАЯ по умолчанию
109 jk3
 
11.11.13
18:26
(0) Такие выражения только от незнания тонкостей работы виртуальных таблиц 1С.

Тот же типовой отчет бухии КарточкаСчета на СКД:
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
                {(&НачалоПериода)},
                {(&КонецПериода)},

РегистрБухгалтерии.Хозрасчетный.Остатки(
            {(&КонецПериодаОстатки)},

При этом: &КонецПериодаОстатки = ДобавитьКДате(&КонецПериода, "Секунда", 1)

Имхо, в СКД граница не нужна, для таблицы Остатки делается именно таким типовым образом. А остальные таблицы по-умолчанию включают конец периода.

А вот в коде для таблицы Остатков юзать границу -- хорошая практика, чтобы самому же не наступить на грабли.
110 Сияющий Асинхраль
 
11.11.13
19:00
(104) Кстати да, смотришь на это и ругаться хочется, ну почему 1С не может по-человечески, однообразно определять везде нормальные граничные даты. В разных дырках получается свой изврат :-(
111 Classic
 
11.11.13
19:15
(110)
Так 1С нормально и определяет. Откуда 1С знать, тебе на начало надо или на конец? Ну могли бы две вьюшки по остаткам нарисовать - так лучше бы было?
112 ProgAL
 
11.11.13
20:58
(109) В этом отчете КонецПериода как реквизит отчета тип Дата, состав Дата. Т. е. в СКД передается как начало дня. Почему срабатывает Добавить секунду так что включается и 23.59.59 ?
113 jk3
 
12.11.13
10:36
(112) Нажми три точки -- там тип "Дата и время" у &КонецПериода и &КонецПериодаОстатки
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн