Имя: Пароль:
1C
1C 7.7
v7: 1с++ Получение документа из регистра, недопустимое имя столбца "IDDoc".
,
0 palpetrovich
 
21.03.16
10:49
код:

Select  
    Рег.IDDoc as [Докм $Документ],
    Товар [Товар $Справочник.Товары],
    Склад [Склад $Справочник.Склады],
    СтоимостьРасход
FROM
    $РегистрОстаткиОбороты.ОстаткиТоваров(
            :ВыбНачПериода,
            :ВыбКонПериода~,,,,,
            (Товар, Склад),
            Стоимость
            ) Рег

подскажите, что ему надо?
67 Mikeware
 
21.03.16
12:44
(66) восемь, восемь.. тарапился
68 Mikeware
 
21.03.16
12:46
(66) если надо годмесяц - бери из даты первые 6 символов. Если до дня - первые 8.
а дэйтпарт - нужно для номера недели, или для дня недели, или номера квартала
69 ЧеловекДуши
 
21.03.16
12:50
(42) У регистра должна быть галочка "Быстрые движения"
70 ЧеловекДуши
 
21.03.16
12:50
+ Или типо того
71 ЧеловекДуши
 
21.03.16
12:51
(48) Да лучше, но писать немного дольше :)
72 Mikeware
 
21.03.16
12:52
(69) "не тормози. сникерсни"©
73 Serginio1
 
21.03.16
12:52
74 palpetrovich
 
21.03.16
13:04
(73) спасибо
75 Mikeware
 
21.03.16
13:16
(73) а зачем?
если собирать по неделям, то знать дату начала недели совершенно необязательно.
если уж нужно будет это отобразить (в шапке, например) - можно получить период недели по ее номеру на этапе вывода
76 palpetrovich
 
21.03.16
14:29
(75) да, нужно именно для вывода, просто боюсь при запросе за период с "переходящим" годом - получу бардак...
12.2015; 01.2016 при периодичности "месяц" отсортируется как 1, 12
77 palpetrovich
 
21.03.16
14:34
+ (76)  а в этом коде, я не могу из "2132016" получить "21032016"

        |    (cast(DATEPART(day, cast(left(Рег.ПозицияДокумента,8) as datetime))  as varchar)  +  
        |    cast(DATEPART(month, cast(left(Рег.ПозицияДокумента,8) as datetime))  as varchar)  +    
        |    cast(DATEPART(year, cast(left(Рег.ПозицияДокумента,8) as datetime))  as varchar) ) as Период,
78 palpetrovich
 
21.03.16
14:38
+(77)  впрочем получилось :)  ...уж не знаю насколько это оптимально

        |    (left( '0' + cast(DATEPART(day, cast(left(Рег.ПозицияДокумента,8) as datetime))  as varchar) , 2) +  
        |    left( '0' + cast(DATEPART(month, cast(left(Рег.ПозицияДокумента,8) as datetime))  as varchar) , 2) +    
        |    cast(DATEPART(year, cast(left(Рег.ПозицияДокумента,8) as datetime))  as varchar) ) as Период,
79 palpetrovich
 
21.03.16
14:41
+ (78)  мдя, что-то меня не туда занесло, пока решал "строковую" задачку, потерял главное :)
80 palpetrovich
 
21.03.16
14:49
о, такая конструкция возвращает первый день в месяце

        |    DATEADD(day,-DAY( cast(left(Рег.ПозицияДокумента,8) as datetime)) +1, cast(left(Рег.ПозицияДокумента,8) as datetime) )  as Период,

осталось такое сделать для первого дня недели
81 Mikeware
 
21.03.16
14:50
(76) так отрезай первые 6 символов: 201512,201601,201602...
82 Mikeware
 
21.03.16
14:51
(80) за каким нахреном?
83 Serginio1
 
21.03.16
14:53
84 Aleksey
 
21.03.16
14:55
(5) как раз ларёк с типовой без проблем сваливает на 8-ку.
85 palpetrovich
 
21.03.16
15:01
(82) ну вообще-то да, (81) решает ту-же задачу :)
а вот как с неделями быть надеюсь в (83) найду :)
86 Mikeware
 
21.03.16
15:06
(85) какя разница, написано оно на t-sql или на 1с? Если тебе нужно "начало недели" в запросе - это одно, а если только при выводе - нахрена грузить сервер излишними вычислениями?
87 palpetrovich
 
21.03.16
15:07
(83) да, для 1-го дня недели работает, спасибо
|DATEADD(DD, DATEDIFF(DD, 0, cast(left(Рег.ПозицияДокумента,8) as datetime))/7*7, 0)  as Период,
88 ADirks
 
22.03.16
07:00
всякие началы

Функция стрНачалоПериода(ПолеДаты, ВидПериода) Экспорт
    Если ВидПериода = "Месяц" Тогда
        стрНачалоПериода = "DateAdd(d, 1 - DatePart(d, "+ПолеДаты+"), "+ПолеДаты+")";
        
    ИначеЕсли ВидПериода = "Неделя" Тогда
        стрНачалоПериода = "DateAdd(dd, -DatePart(dw, "+ПолеДаты+")+1, "+ПолеДаты+")";
        
    ИначеЕсли ВидПериода = "Квартал" Тогда
        стрНачалоПериода = "DateAdd(M, -(Month(" + ПолеДаты + ") - 1)%3, " + стрНачалоПериода(ПолеДаты, "Месяц") + ")";
        
    ИначеЕсли ВидПериода = "Год" Тогда
        стрНачалоПериода = "DateAdd(M, 1 - Month(" + ПолеДаты + "), " + стрНачалоПериода(ПолеДаты, "Месяц") + ")";
        
    КонецЕсли;
    
    Возврат стрНачалоПериода;
КонецФункции
89 palpetrovich
 
22.03.16
10:52
(88) спасибо
90 ADirks
 
22.03.16
10:54
блин... с неделей то у меня косяк :)
у буржуев начало недели - воскресенье почему-то

более правильно так:

    ИначеЕсли ВидПериода = "Неделя" Тогда
        стрНачалоПериода = "DateAdd(dd, -DatePart(dw, "+ПолеДаты+") + 2 - (@@DATEFIRST%7), "+ПолеДаты+")";
91 Mikeware
 
22.03.16
10:55
(90) ну, давно известно, что они начинают неделю с отдыха....
92 palpetrovich
 
22.03.16
11:10
(90) странно, у меня с кодом в (88) все нормально
22.02.16, 29.02.16, 07.03.16
может от системных установок зависит?
93 palpetrovich
 
22.03.16
11:11
+(92)  впрочем с кодом из (90) тоже :)
94 Serginio1
 
22.03.16
11:13
95 Serginio1
 
22.03.16
11:21
96 ADirks
 
22.03.16
11:39
(92) это потому что у тебя в настройках сервера указано, что первый день понедельник. Был бы аглицкий дистрибутив - было бы воскресенье первым днём

(94) а я знаю, и поэтому не хочу от этого зависеть
97 palpetrovich
 
22.03.16
11:40
подскажите, а почему так получается?
кусок кода:

Select
    cast(left(Рег.ПозицияДокумента,8) as datetime) as День,
    Рег.Товар [Товар $Справочник.Товары],      
    СпрТ.Descr + cast(cast(left(Рег.ПозицияДокумента,8) as datetime) as varchar) as Ключ1
FROM        
    $РегистрОстаткиОбороты.ОстаткиТоваров(
            :ВыбНачПериода,    :ВыбКонПериода~,
            Документ,,,, (Товар),Стоимость) Рег
INNER JOIN
     $Справочник.Товары as СпрТ (nolock) on СпрТ.id = Рег.Товар

// колонка День - "22.02.16"
// колонка Ключ1 - "Товар1  фев 28 2016 12:00 AM"
98 palpetrovich
 
22.03.16
11:42
+(97)  а я почемуто ожидал
// колонка Ключ1 "Товар1  22.02.16"
99 Ёпрст
 
22.03.16
11:43
(97) дата и строка, что не ясного ?
100 Ёпрст
 
22.03.16
11:44
(98) кастани к дате (если скуль >=2005)? ,без времени
101 ADirks
 
22.03.16
11:49
лучше использовать Convert() с явным указанием формата
типа:
Convert(DateTime, Left(Date_Time_IDDoc, 8), 112)

и в обратку
CONVERT(char(12), GetDate(), 104)
102 palpetrovich
 
22.03.16
11:50
(100) скуль 2005
(99) как что неясно
cast(left(Рег.ПозицияДокумента,8) as datetime) - дает 22.02.16
а
cast(cast(left(Рег.ПозицияДокумента,8) as datetime) as varchar) - дает фев 28 2016 12:00 AM
103 Mikeware
 
22.03.16
11:52
(102) в первом случае у бебя возвращайется дэйттайм, которую 1с неявно конвертит в дату
а воо-втором ты конвертишь дэйттайм с пустым временем в варчар, и получаешь строку. которую тебе 1с так и оставляет.
104 palpetrovich
 
22.03.16
11:52
(101) я пробовал вначале, но при использовании "CONVERT" сортировка "ORDER BY Период" отрабатывает как "по строке", т.е.
03.03.16
28.02.16
...
мне это как-то не нра :)
105 ADirks
 
22.03.16
11:53
(104) так укажи для сортировки формат 112, а не какой попало
106 Ёпрст
 
22.03.16
11:54
(102)
cast(left(Рег.ПозицияДокумента,8) as date)
107 ADirks
 
22.03.16
11:54
всякие неявные преобразования - злейшее зло.
на сервере с другими настройками всё сломается
108 Mikeware
 
22.03.16
11:55
(104) формат даты укажи, в какой конывертить
109 Ёпрст
 
22.03.16
11:55
А для сортировки, делай
order by Рег.ПозицияДокумента и усё
110 palpetrovich
 
22.03.16
11:56
(105) я 1с++ начал заниматься 5 дней назад, для меня тут сплошной темный лес :)
111 Mikeware
 
22.03.16
11:57
(110) чем дальше в лес, тем толще партизаны...
112 palpetrovich
 
22.03.16
12:02
(106) тТип date не является определенным системным типом. (109) спасибо
113 ЧеловекДуши
 
22.03.16
12:05
(112) Чет какие-то у вас странные трудности :)

Вы поймите, что вы должны рассматривать, в прямом запросе, только те типы, которые может прожевать платформа 1С :)
114 trad
 
22.03.16
12:10
(96) 1cv7 при старте выполняет SET DATEFIRST 1
так что при работе в этом сеансе у нас первый день понедельник
115 ADirks
 
22.03.16
12:10
(110) ну вообще-то, это не про 1С++, а про T-SQL
про convert, к примеру:  https://msdn.microsoft.com/ru-ru/library/ms187928(v=sql.120).aspx

(112) чё это вдруг? вернуть в 1С не всё получится, а в самом запросе могу вертеть как хочу
116 palpetrovich
 
22.03.16
12:11
(113) ну как трудности, я могу конечно это дополнительное поле добавить в ТЗ и после, просто подумал что на этапе запроса быстрее получится
117 palpetrovich
 
22.03.16
12:13
(115) о, оказывается я еще и T-SQL изучаю :)
"чё это вдруг" - если это на "тТип date не является определенным системным типом" - так это не я сказал, это  цитата :)
118 palpetrovich
 
22.03.16
12:14
Select cast(left(Рег.ПозицияДокумента,8) as date) as День,
...
State 42000, native 243, message [Microsoft][ODBC SQL Server Driver][SQL Server]Тип date не является определенным системным типом.
119 ADirks
 
22.03.16
12:14
(117) ошибочка вышла, это было к (113)
120 trad
 
22.03.16
12:14
в sql 2k нет типа date
121 palpetrovich
 
22.03.16
12:19
(120)  спасибо
так что, есть возможность получить "Товар1  22.02.16" ...вот почему-то уверен, что есть :)
122 Ёпрст
 
22.03.16
12:19
(118) Не помню ужо, возможно, date  и time появились только с 2008 sql
123 Ёпрст
 
22.03.16
12:19
(121) substr
124 ДенисЧ
 
22.03.16
12:19
(121) Есть
125 Ёпрст
 
22.03.16
12:20
точнее, substring, или left
126 Mikeware
 
22.03.16
12:20
(121) datepart, или просто отрезать левые 8
127 ДенисЧ
 
22.03.16
12:20
(125) А зачем?
Что, конверт не даст нужного формата?
128 trad
 
22.03.16
12:22
(121) значение типа datetime или smalldatetime при помощи convert можно преобразовать в строку со всевозможным форматированием
129 ADirks
 
22.03.16
12:22
(128) тока MSDN сначала надо прочитать :)
130 trad
 
22.03.16
12:24
(129) при таком количестве помогателей - некогда
131 Ёпрст
 
22.03.16
12:25
(130) конечна, ускоренное прочтение буконлайн, это ж читать надо
132 ДенисЧ
 
22.03.16
12:25
(129) Да ты издеваешься... Ещё и документацию читать... Некогда, работать надо...
133 Ёпрст
 
22.03.16
12:27
Да и задач, в которых нужно из даты делать строки а из ссылки на товар - наименования, как то не встречались
:)
134 Ёпрст
 
22.03.16
12:27
в запросах
135 palpetrovich
 
22.03.16
12:35
(126) "20160228"
(127) "28-02-2016" ...хотя скорее всего я "конверт"ом не умею пользоваться
136 palpetrovich
 
22.03.16
12:36
+(135)  повторюсь, так хочется  "Наименование28.02.2016"
137 ДенисЧ
 
22.03.16
12:40
(135) Ну ты BOL-то уже открыл на статье о конверте? И его параметрах?
138 Mikeware
 
22.03.16
12:41
(137) давай, я ему BOL продам? :-)
139 palpetrovich
 
22.03.16
12:43
+(135)  да, таки не умею,
"CONVERT(VARCHAR(11), cast(left(Рег.ПозицияДокумента,8) as datetime), 104)" - дает 28.02.2016
140 Ёпрст
 
22.03.16
12:44
(139) а че 11 ?
141 Ёпрст
 
22.03.16
12:44
а не 10, хотя, размерность мог бы и не указывать
142 Mikeware
 
22.03.16
12:45
(141) а вдруг в каком-то месяце больше 99 дней?
143 palpetrovich
 
22.03.16
12:47
(137) (138) понятния не имею что такое BOL
(140) с какого-то примера скопипастил
144 palpetrovich
 
22.03.16
12:49
+ (143) да, 10 хватает вроде
145 trad
 
22.03.16
12:52
(136) а для чего такая конкатенация?
146 Ёпрст
 
22.03.16
12:54
(145) чтоб выяснить потом, что оказывается, в справочнике есть куча элементов с одинаковым наименованием, поэтому отчет криво работает
:)
Как ты сам не догадался ?!
147 trad
 
22.03.16
13:05
(146) ты протелепатировал "ключ" в (97) ?
148 Ёпрст
 
22.03.16
13:14
(147) а то!
Ну, я бы понял, если бы он в этот ключ писал id, потом, например спец символ или пробел и потом строковое представление даты.. а так, наименование, это же бубль гум!
149 palpetrovich
 
22.03.16
14:41
(145) тренируюсь я ваще-т :)
Ну и да, ИД понадежней будет. Правда допполе нужно будет для решения задачки:
Рег.Товар as IDтов,      
Рег.Товар [Товар $Справочник.Товары],      
...
Rtrim(Рег.Товар) + CONVERT(VARCHAR(10), cast(left(Рег.ПозицияДокумента,8) as datetime), 104) as Ключ1
150 trad
 
22.03.16
14:57
а просто так нет?
Рег.Товар + left(Рег.ПозицияДокумента,8) as Ключ1
151 Mikeware
 
22.03.16
14:58
(150) слишком просто...
152 Mikeware
 
22.03.16
14:58
+(151) ни лыж тебе, ни гамака...
153 palpetrovich
 
22.03.16
15:09
(150) мне надо для дальнейших действий, упрощенно:
цикл по основной ТЗ
ТекКлюч = СокрЛП(ТЗ.IDтов)+СокрЛП(ТЗ.День)
Если ТЗ_свернуаяПоКлюч1.найтиЗначене(ТекКлюч,стр,"Ключ1")...
154 Mikeware
 
22.03.16
15:12
(153) что ты этим хочешь сделать?
используй индексированную таблицу...
155 Ёпрст
 
22.03.16
15:18
(154) Это слишком просто
156 Mikeware
 
22.03.16
15:20
(155) ну да. тоже ни лыж, ни гамака...
157 Mikeware
 
22.03.16
15:21
(155) интересный эффект в РВиджет - если грузить его не в глобальнике, то в меню названия обрезаются до 6 символов...
158 ДенисЧ
 
22.03.16
15:24
А если
Rtrim(Рег.Товар) + CONVERT(VARCHAR(10), cast(left(Рег.ПозицияДокумента,8) as datetime), 4) as Ключ1
159 Ёпрст
 
22.03.16
15:24
(157) еще и от версии зависит
160 Ёпрст
 
22.03.16
15:25
вообще, то нужна только позиция (или дата) и товар, выгрузить в ИТЗ, налепить индексов и любой вывод
161 palpetrovich
 
22.03.16
15:49
(160) Народ, я реально занимаюсь этим 5 дней, какая еще ИТЗ? :)
что, раельно любой вывод? любые группировки + вывод "периодики" по горизонтали со всеми итогами (горизонтальными и вертикальными)?
162 Mikeware
 
22.03.16
16:08
а чоб и нет? :-)
163 palpetrovich
 
22.03.16
16:15
(162) может и так, я-ж не в курсе...
164 Serginio1
 
22.03.16
16:16
165 palpetrovich
 
22.03.16
16:22
(164) спасибо конечно, но там как-бы для 8-ки все, а скачать архив - не могу...  "Получите файл бесплатно, если ваша компания у нас еще не зарегистрирована." :)
166 Serginio1
 
22.03.16
16:29
(165) По второй ссылке скачай
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший