Имя: Пароль:
1C
1C 7.7
v7: Опять запрос.. (я не умею называть темы)
0 bananan
 
17.01.13
17:15
Есть готовый запрос
Текст запроса такой:
Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
       "//{{ЗАПРОС(Сформировать)
       |Период с ВыбНачПериода по ВыбКонПериода;
       |Обрабатывать НеПомеченныеНаУдаление;
       |ТМЦ = Регистр.Обороты.ТМЦ;
       |Клиент = Регистр.Обороты.Клиент;
       |Агент = Регистр.Обороты.Агент;
       |РасходГрн = Регистр.Обороты.РасходГрн;
       |РасходКво = Регистр.Обороты.РасходКво;
       |Функция РасходГрнСумма = Сумма(РасходГрн);
       |Функция КвоРасход = Сумма(РасходКво);
       |Группировка Агент без групп;
       |Группировка Клиент  без групп;
       |Группировка ТМЦ;
       |Условие(ТМЦ в ВыбТМЦ);
       |Условие(Клиент в ВыбКлиент);
       |Условие(Агент в ВыбАгент);";
       Если СпИнкас.ТекущаяСтрока() = 2 Тогда
           ТекстЗапроса = ТекстЗапроса +"      
           |Условие(Клиент.Инкас =0);";
       ИначеЕсли СпИнкас.ТекущаяСтрока() = 3 Тогда
           ТекстЗапроса = ТекстЗапроса +"      
           |Условие(Клиент.Инкас =1);";
       Конецесли;
   
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
Так вот: нужно сюда добавить возможность выбора склада..
я сделал так:
   "//{{ЗАПРОС(Сформировать)
       |Период с ВыбНачПериода по ВыбКонПериода;
       |Обрабатывать НеПомеченныеНаУдаление;
       |Склад = Регистр.Обороты.Склад;
       |ТМЦ = Регистр.Обороты.ТМЦ;
       |Клиент = Регистр.Обороты.Клиент;
       |Агент = Регистр.Обороты.Агент;
       |РасходГрн = Регистр.Обороты.РасходГрн;
       |РасходКво = Регистр.Обороты.РасходКво;
       |Функция РасходГрнСумма = Сумма(РасходГрн);
       |Функция КвоРасход = Сумма(РасходКво);
       |Группировка Агент без групп;
       |Группировка Клиент  без групп;
       |Группировка ТМЦ;
       |Условие(Склад в выбСклад);
       |Условие(ТМЦ в ВыбТМЦ);
       |Условие(Клиент в ВыбКлиент);
       |Условие(Агент в ВыбАгент);";
       Если СпИнкас.ТекущаяСтрока() = 2 Тогда
           ТекстЗапроса = ТекстЗапроса +"      
           |Условие(Клиент.Инкас =0);";
       ИначеЕсли СпИнкас.ТекущаяСтрока() = 3 Тогда
           ТекстЗапроса = ТекстЗапроса +"      
           |Условие(Клиент.Инкас =1);";
       Конецесли;
   
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
НИчего в результатах не изменилось.
К тому же в форме добавил "поле" для выбора склада...
ну и кнопки к этому полю..
Когда при открытии отчета в первый раз нажимаю кнопку выбора - нормально работает. А когда после этого еще раз нажимаю на кнопку выбора - выдает ошибку:
Если выбСклад.РазмерСписка()>0 Тогда
{\\SERVER12\VPKTEST$\EXTFORMS\ОТЧЕТПОАГЕНАМСВ.ERT(436)}: Поле агрегатного объекта не обнаружено (РазмерСписка)
Ну и два впороса:
1. Что не так у меня в запросе
2. Что не так с полем выбора склада?
209 bananan
 
23.01.13
16:57
выдал ошибку Invalid column name 'Ставка'.
210 bananan
 
23.01.13
16:58
а поле в справочнике 100% называется Ставка... но поле это периодическое... Здесь надо еще чего-то задать в запросе?
211 Wobland
 
23.01.13
17:00
212 sapphire
 
23.01.13
17:00
(211) Великий просветитель :D
213 sapphire
 
23.01.13
17:01
(210) Когда же ты документацию осилишь, а?
214 bananan
 
23.01.13
17:01
(211) Спсибо за ссылку; - читал
Сейчас вопрос как достучаться до периодического поля ставкав справочнике сотрудники в запросе под 1С++...
215 Wobland
 
23.01.13
17:06
Пример: Справочник.Номенклатура, подчиненный справочник Цены с периодической ценой.

ТекстЗапроса = "
|SELECT  
|    СпрН.Descr Наименование,
|    $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена    
|FROM
|    $Справочник.Номенклатура СпрН
|LEFT JOIN
|    $Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
|                             $СпрЦ.ТипЦен = :ТипЦен";
216 bananan
 
23.01.13
17:13
(215) Непонятно что за СпрН и СпрЦ...
217 bananan
 
23.01.13
17:15
(216) пардон, СпрН -  Справочник.Номенклатура
218 bananan
 
23.01.13
17:19
Написал в тексте запроса так:
|SELECT SUM(Справочник.Сотрудники.Ставка) as Кво
Выдает ошибку:
The column prefix 'Справочник.Сотрудники' does not match with a table name or alias name used in the query.
219 bananan
 
23.01.13
17:22
(215) и непонятно как применять $ПоследнееЗначение. к полю ставка из справочника.сотрудники
220 Wobland
 
23.01.13
17:22
(218) теперь спроси "как в 1С++ правильно написать SUM(Справочник.Сотрудники.Ставка)?"
221 Wobland
 
23.01.13
17:23
(219) Периодические реквизиты хранятся в файле _1SConst. Для получения их значений служит виртуальное значение $ПоследнееЗначение.<ИмяСправочника> | Константа.<ИмяРеквизита | ИмяКонстанты>(<ИдОбъекта>, <Дата>[, <Время>[, <ИДДокумента>]]), которое является коррелированным подзапросом (вложенный запрос, в котором используется значения основного).
222 Wobland
 
23.01.13
17:24
мне вот интересно, человек справится сам или кто-то щас придёт и всё испортит? пойду с начала ветку почитаю
223 bananan
 
23.01.13
17:27
(220-222) Написал так в запросе:
SELECT SUM($ПоследнееЗначение.Справочник.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)) as Кво
Выдает ошибку:
Meta name parser error: виртуальное поле не найдено "$ПоследнееЗначение.Справочник.Сотрудники"
224 bananan
 
23.01.13
17:28
(222) Сам, скорее всего, - не справлюсь
225 Wobland
 
23.01.13
17:28
(224) хорошо читал (205)?
226 bananan
 
23.01.13
17:30
Вижу и понимаю что неправильно:
$ПоследнееЗначение.Справочник.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности
а как правильно написать - не знаю..
227 viktor_vv
 
23.01.13
17:31
Дам наводку

$ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена

найди одно отличие от твоей

$ПоследнееЗначение.Справочник.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)
228 viktor_vv
 
23.01.13
17:32
И я точно не помню, но кажись ПсоледенееЗначение в SUM() не взлетит, потому как оно в подзапрос разворачивается.
229 bananan
 
23.01.13
17:33
(227) у меня так:
SELECT SUM($ПоследнееЗначение.Справочник.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)) Ставка
230 Mikeware
 
23.01.13
17:35
(229) продолжайте наблюдение...©
231 Wobland
 
23.01.13
17:36
(229) убери функцию для начала, вдруг viktor_vv прав
232 Mikeware
 
23.01.13
17:39
(231) а почему это "вдруг"? в документации прекрасно написано. в конце концов, есть Отладка() или перпроцессирование, или просто вывод текста запроса, или профайлер...
проблема-то в соотношени радиусов...
233 Wobland
 
23.01.13
17:40
(232) а я документацию в этом месте не читал ;)
234 bananan
 
23.01.13
17:40
9231) Функцию убрал - ошибка осталась
235 viktor_vv
 
23.01.13
17:41
Да оно там, в принципе, доступно матюкнется, правда на буржуинском :).
236 viktor_vv
 
23.01.13
17:42
(234) Ты (227) внимательно, посимвольно сравнил ?
237 Wobland
 
23.01.13
17:42
(234) прокомментируй (227)
238 bananan
 
23.01.13
17:43
(236) Не понимаю я здесь что к чему...
239 Wobland
 
23.01.13
17:43
с (205) прошло 50 минут
240 bananan
 
23.01.13
17:44
(237) код: $ПоследнееЗначение.Справочник.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности) выдает ошибку: Meta name parser error: виртуальное поле не найдено "$ПоследнееЗначение.Справочник.Сотрудники"
241 Wobland
 
23.01.13
17:46
(240) различия в чём?
242 Mikeware
 
23.01.13
17:46
(240) и это вполне закономерно...
243 PALESIA
 
23.01.13
17:49
пятнично))) ну и какой-же приколист (0) 1С++ подсунул?)
244 viktor_vv
 
23.01.13
17:49
(238) Сравнивай посимвольно две строки слева направо, на первом отличии, остановись и задумайся.

$ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена
$ПоследнееЗначение.Справочник.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)
245 Mikeware
 
23.01.13
17:52
(244) какое-какое последнее слово???
ты сам-то понял, что ему сказал???????
:-))
246 Ёпрст
 
гуру
23.01.13
17:53
(244) надо не ответ давать, а хелп :))

http://www.1cpp.ru/docum/icpp/html/ODBC.html#id38
247 viktor_vv
 
23.01.13
17:53
(245) А вдруг :))) .
248 sapphire
 
23.01.13
17:54
(224)
$ПоследнееЗначение.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)
249 Wobland
 
23.01.13
17:55
(246) это вторая ссылка за сегодняшний вечер. мою он врёт, что уже читал
250 Wobland
 
23.01.13
17:55
всё-таки кто-то пришёл
251 bananan
 
23.01.13
17:56
написал так:
SELECT SUM($ПоследнееЗначение.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)) Став
выдает ошибку:
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
252 viktor_vv
 
23.01.13
17:58
(251) Про sum и подзапрос уже выше писали.
Убери sum().
253 bananan
 
23.01.13
17:58
Что-то вроде Инет у меня глючит...
Повторяю, написал такой код:
SELECT SUM($ПоследнееЗначение.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности)) Став
Ошибка:
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
254 Ёпрст
 
гуру
23.01.13
17:59
(251) и правильно делает, выгреби последнее значение в подзапросе, а потом уже суммируй во внешнем.
255 Ёпрст
 
гуру
23.01.13
17:59
если приспичило
256 Wobland
 
23.01.13
17:59
(253) голова у тебя глючит. научи её читать и понимать написанное
257 bananan
 
23.01.13
18:01
(254)(252)
Код такой:
SELECT $ПоследнееЗначение.Сотрудники.Ставка(Справочник.Сотрудники.ID, :ДатаАктуальности) Став
Ошибки:
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

The column prefix 'Справочник.Сотрудники' does not match with a table name or alias name used in the query.
258 bananan
 
23.01.13
18:01
(254) Здесь без функции и все-равно ошибка в запросе..
259 viktor_vv
 
23.01.13
18:01
(254) Ну все, еще сотня постов про внешний Select :)).
260 Wobland
 
23.01.13
18:02
(257) а в примере как?
261 bananan
 
23.01.13
18:03
(260) $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена
262 Wobland
 
23.01.13
18:03
(261) а у тебя? в чём разница?
263 viktor_vv
 
23.01.13
18:03
SELECT $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
264 viktor_vv
 
23.01.13
18:04
А то боюсь намеками будем долго ехать.
265 Wobland
 
23.01.13
18:05
(264) ещё полторы-две сотни постов. сейчас он складывать будет
266 bananan
 
23.01.13
18:07
(263) СПАСИБО!!!
Теперь буду с подзапросом мучится :)
267 bananan
 
23.01.13
18:08
+(266) Чего-то сходу не соображу что здесь в подзапросе искать...
268 Wobland
 
23.01.13
18:10
выбрать сумма(чего-то)
из
(выбрать твои ставки)
269 Wobland
 
23.01.13
18:11
+(268) сгруппировать, если надо
270 bananan
 
23.01.13
18:12
(268)SELECT $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став - это подзапрос?
А в запросе  SELECT SUM(Став)?
271 bananan
 
23.01.13
18:19
Код такой:
|SELECT SUM(Став)
         |FROM $Справочник.Сотрудники Сотр
         |INNER JOIN
         |SELECT $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
         |WHERE Сотр.ID IN (SELECT Val FROM #tmpSotr)
         |AND $Сотр.ДатаПриема> :Дат1
         |AND $Сотр.ДатаПриема<= :ДатаАктуальности
         |AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
         |";        
Ошибка:
 ]Incorrect syntax near the keyword 'SELECT'.
272 bananan
 
23.01.13
18:19
(269) А что здесь группировать?
273 Mikeware
 
23.01.13
18:25
м-дя...
274 Wobland
 
23.01.13
18:29
выбрать
сумма(таб1.поле1)
из
(выбрать таб2.поле2 как поле1
из таб2) как таб1

вот тебе нужная схема
275 bananan
 
23.01.13
18:32
(274) Сейчас попробую..
276 bananan
 
23.01.13
18:44
(274)... Сейчас попробую эту схему...
Хотя, НЕ ПОНИМАЮ я вроде так и делаю:
Суммиорую SUM(Став)
в подзапросе выбираю |INNER JOIN
         |SELECT $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
277 Wobland
 
23.01.13
18:44
(276) кого с чем и зачем соединяешь?
278 Wobland
 
23.01.13
18:45
а в схеме ведь никаких джойнов
280 Wobland
 
23.01.13
18:48
(279) достал? ;)
282 Mikeware
 
23.01.13
18:48
виктор, не балуй!
пусть пытается понять, сто значит слово "думать"
283 viktor_vv
 
23.01.13
18:49
(280) Есть немного :)), правда упорный.
284 Mikeware
 
23.01.13
18:49
(283) ты в последнем слове сделал ошибку..
285 viktor_vv
 
23.01.13
18:49
(282) Завязываю :).
286 viktor_vv
 
23.01.13
18:50
(284) Когда писал, была такая мысль :)).
287 Mikeware
 
23.01.13
18:50
(286) :-))
288 bananan
 
23.01.13
18:50
(279) Спасибо!!!
289 bananan
 
23.01.13
18:53
Запрос - работает, но... я опять туплю код в скрипте такой:
ТекстЗапроса = "
           |SELECT
           |Внутренний.ID as [Сотрудник $Справочник.Сотрудники],
           | SUM(Внутренний.Став) as Ставка
             |
             |From
             |(
             |  SELECT
             |    Сотр.ID as ID,
             |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
             |  FROM
             |    $Справочник.Сотрудники Сотр
             |  WHERE
             |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
             |    AND $Сотр.ДатаПриема> :Дат1
             |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
             |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
             |) as Внутренний
           |Group by
           |   Внутренний.ID
           |";
         Запрос_.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989"));  
         Запрос_.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1);  
         Запрос_.УложитьСписокОбъектов(Запрос.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники");  
         тЗанято = Запрос_.ВыполнитьСкалярный(ТекстЗапроса);
         ПоШтату =  Запрос.Сотр.ПоШтату;          
         Если Запрос.Сотр.ПоШтату-тЗанято<0 Тогда
           тВакантно = 0;                        
         КонецЕсли;
         ФиксДан = Шаблон("Занято: [тЗанято] \ По штату: [Запрос.Сотр.ПоШтату] \ Вакантно: [тВакантно]");
А вот на вывод вместо суммы ставок и частей ставок выдает:
Занято: Структура \ По штату: 109.5 \ Вакантно: 2
290 bananan
 
23.01.13
18:54
т.е. тЗанято как-то иначе надо представить...
291 Wobland
 
23.01.13
18:56
что за Запрос? я про переменную
292 bananan
 
23.01.13
18:57
А запрос
|SELECT
           |Внутренний.ID as [Сотрудник $Справочник.Сотрудники],
           | SUM(Внутренний.Став) as Ставка
             |
             |From
             |(
             |  SELECT
             |    Сотр.ID as ID,
             |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
             |  FROM
             |    $Справочник.Сотрудники Сотр
             |  WHERE
             |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
             |    AND $Сотр.ДатаПриема> :Дат1
             |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
             |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
             |) as Внутренний
           |Group by
           |   Внутренний.ID
           |";
что возвращает?
293 bananan
 
23.01.13
18:58
(291) Где это?
294 Wobland
 
23.01.13
18:58
(292) обычно ТЗ
295 Wobland
 
23.01.13
18:58
(293) в (289)
297 viktor_vv
 
23.01.13
19:00
А, вернее он куда-то пропал :)).
298 Wobland
 
23.01.13
19:00
(296) что такое скалярный? я сейчас для повышения эрудиции, сам не знаю
299 bananan
 
23.01.13
19:00
(289) там так (покажу больше кода):
 Запрос_=СоздатьОбъект("ODBCRecordset");    
        ТекстЗапроса = "
           |SELECT
           |Внутренний.ID as [Сотрудник $Справочник.Сотрудники],
           | SUM(Внутренний.Став) as Ставка
             |
             |From
             |(
             |  SELECT
             |    Сотр.ID as ID,
             |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
             |  FROM
             |    $Справочник.Сотрудники Сотр
             |  WHERE
             |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
             |    AND $Сотр.ДатаПриема> :Дат1
             |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
             |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
             |) as Внутренний
           |Group by
           |   Внутренний.ID
           |";
         Запрос_.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989"));  
         Запрос_.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1);  
         Запрос_.УложитьСписокОбъектов(Запрос.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники");  
         тЗанято = Запрос_.ВыполнитьСкалярный(ТекстЗапроса);
         ПоШтату =  Запрос.Сотр.ПоШтату;          
         Если Запрос.Сотр.ПоШтату-тЗанято<0 Тогда
           тВакантно = 0;                        
         КонецЕсли;
         ФиксДан = Шаблон("Занято: [тЗанято] \ По штату: [Запрос.Сотр.ПоШтату] \ Вакантно: [тВакантно]");
         Если фУволенные=0 Тогда
             Если тЗанято = 0 Тогда
                 продолжить;
             Конецесли;
300 Mikeware
 
23.01.13
19:00
(294) у него  Запрос_.ВыполнитьСкалярный(ТекстЗапроса)
301 Mikeware
 
23.01.13
19:01
(297) :-))
302 Wobland
 
23.01.13
19:02
(299) что такое "Запрос"?
303 Wobland
 
23.01.13
19:04
(302) какой тип у переменной? что туда присваивается?
304 bananan
 
23.01.13
19:15
Разве запрос:
   |SELECT
           |Внутренний.ID as [Сотрудник $Справочник.Сотрудники],
           | SUM(Внутренний.Став) as Ставка
             |
             |From
             |(
             |  SELECT
             |    Сотр.ID as ID,
             |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
             |  FROM
             |    $Справочник.Сотрудники Сотр
             |  WHERE
             |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
             |    AND $Сотр.ДатаПриема> :Дат1
             |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
             |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
             |) as Внутренний
           |Group by
           |   Внутренний.ID
           |";
Вернет структуру, а не число??
305 Wobland
 
23.01.13
19:17
(304) выбираешь ИД и ждёшь числу?
306 bananan
 
23.01.13
19:26
Такой код:
   |SELECT
           | SUM(Внутренний.Став) as Ставка
             |
             |From
             |(
             |  SELECT
             |    Сотр.ID as ID,
             |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
             |  FROM
             |    $Справочник.Сотрудники Сотр
             |  WHERE
             |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
             |    AND $Сотр.ДатаПриема> :Дат1
             |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
             |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
             |) as Внутренний
           |Group by
           |   Внутренний.ID
           |";
выдает в любом случае 1 (единицу)!!!
307 bananan
 
23.01.13
19:33
+(306) убрал:
|Group by
           |   Внутренний.ID

Теперь считает так как надо! Всем большое спасибо.!!!
308 Wobland
 
23.01.13
19:48
Сотр.ID as ID, убери ещё