Имя: Пароль:
 
1C
1C 7.7
v7: 1С++
0 bananan
 
24.01.13
13:33
Все-таки читаю я документацию...
Вот сегодн запары по работе нет - решил хорошо ознакомится с документацией по 1С++.
Так во написал я код такой:
ТекстЗапроса = "
   
      |SELECT    Сотрудник.Descr AS Наименование
      |        ,Сотрудник.Code AS Код
      |FROM
      |    $Справочник.Сотрудники AS Сотрудник
      | WHERE Сотрудник.Code = 1241;";        
     RS = СоздатьОбъект("ODBCRecordset");
    RS.Отладка(1);
    ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
    //ТЗ.ВыбратьСтроку();                        
    Сообщить("ТЗ.Наименование-"+ТЗ.Наименование);
В таблице значений показывает одного сотрудника (его фамилию в поле НАименование и код в поле Код. Все нормально.. но, почему код     Сообщить("ТЗ.Наименование-"+ТЗ.Наименование); не выдает (сообщает) фамилию сотрудника?
Данный вопрос - это потому что я изучаю документацию, он не относится ни к какому конкретному запросу..
1 GLazNik
 
24.01.13
13:35
(0) а цикл по строкам где?
2 Ёпрст
 
24.01.13
13:44
рано, надо начинать с основ:
http://www.mista.ru/tutor_1c/tz.htm
http://www.mista.ru/tutor_1c/index.htm
3 bananan
 
24.01.13
13:57
(1) А зачем цикл по строкак при таком WHERE запрос вернет одну строку.
4 bananan
 
24.01.13
13:58
(2) Спасибо - значит берусь за это
5 AlecoZAV
 
24.01.13
13:59
ТЗ[1].Наименование
6 ДенисЧ
 
24.01.13
14:00
(2) ты не прав...
Начинать надо вот с этого: http://www.gramota.ru/class/coach/tbgramota/
7 GLazNik
 
24.01.13
14:04
(3) если одну строку... то можно использовать ВыполнитьСкалярный вместо ВыполнитьИнструкцию
(5) Не помню что б такое в 7.7 работало.
8 bananan
 
24.01.13
14:05
(6) ДенисЧ, ну ты - крутой, вот и читай орфографию
9 ЧеловекДуши
 
24.01.13
14:05
(0)Попробуй познать для себя Отладчик, люди говорят его за дорого продают ;)
10 bananan
 
24.01.13
14:07
(7) В 7.7. ВыполнитьСкалярный работает нормально все, спасибо
11 Ёпрст
 
24.01.13
14:07
(3) ошибаешься. Твой код ни вернет ни одной строки - будет пустая ТЗ на выходе.
12 bananan
 
24.01.13
14:08
+(10) Упс, не то я написал; - пардон!
13 Ganiev
 
24.01.13
14:09
(9)))))+
К какой строке ТЗ ты обращаешься?
14 bananan
 
24.01.13
14:09
(11) Код:

   ТекстЗапроса = "
   
      |SELECT    Сотрудник.Descr AS Наименование
      |        ,Сотрудник.Code AS Код
      |FROM
      |    $Справочник.Сотрудники AS Сотрудник
      | WHERE Сотрудник.Code = 1241;";        
     RS = СоздатьОбъект("ODBCRecordset");
    RS.Отладка(1);
    ТЗ = RS.ВыполнитьСкалярный(ТекстЗапроса);
Сообщить("ТЗ.Наименование-"+ТЗ.Наименование);
В окне сообщений выдал:
ТЗ.Наименование-Клімук
15 bananan
 
24.01.13
14:10
(9) А отладчик разве работает с внешними формами?
16 Ёпрст
 
24.01.13
14:13
(14) враньё..
17 Ёпрст
 
24.01.13
14:13
1. Запрос всегда пустой
2. ВыполнитьСкалярный не возвращает Таблицу значений
18 Ёпрст
 
24.01.13
14:15
+17 хотя, у тебя 2 поля, там вернёт структуру, только пустую - code ,это стока, сравнение её ч числом приведёт к пустому запросу
19 GLazNik
 
24.01.13
14:17
(17) а никто и не обещал ТЗ :)
(18) "code ,это стока" откуда такая уверенность? может кодировка числовая?
20 bananan
 
24.01.13
14:17
Ёпрст4! Зачем мне врать кому-либо на этом форуме?
Выйди на меня по скайпу - покажу тебе свой экран!
21 Ёпрст
 
24.01.13
14:18
(19) code всегда строка.
22 bananan
 
24.01.13
14:18
(19) Число это - посмотрел в конфигурации
23 bananan
 
24.01.13
14:19
(21) Вот это - как раз и есть вранье!
24 Ёпрст
 
24.01.13
14:20
(22,23) дурилка, CODE - это char(n), где n - длина кода, это всегда строка.
Смотри в SQL , а не в пофигураторе.
25 antoneus
 
24.01.13
14:21
(24) select descr from $Справочник.ЕдиницыИзмерений where code = 881 вернул "банка"
26 Ёпрст
 
24.01.13
14:22
(25) а в отладке , какой код ? И в профайлер что летит ?..
и в QA выполни.
27 Mikeware
 
24.01.13
14:27
ВыполнитьИнструкцию / ExecuteStatement

   Синтаксис: ВыполнитьИнструкцию([ТекстЗапроса], [ОбъектРезультатов], [Очищать])

   Параметры:

           ТекстЗапроса - тип: Строка. Текст запроса, если пустая строка - запрос считается параметризированным. Необязателен, по умолчанию - пустая строка.
           ОбъектРезультатов - тип: любой из ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них. (Это должен быть объект какого-либо из перечисленных типов, а не объект, реализующий их интерфейс.) Если параметр передан, то он и будет возвращаемым значением. Необязателен, по умолчанию пустое значение, в этом случае будет возвращен объект типа ТаблицаЗначений.
           Очищать - тип: Число. 1 - очистить переданный ОбъектРезультатов и создать колонки если его тип ТаблицаЗначений или ИндексированнаяТаблица. 0 - не очищать. Необязателен, по умолчанию - 1.

   Возвращает: тип: ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них, Число. Объект с результатом запроса, или число - количество обработанных строк.


ВыполнитьСкалярный / ExecuteScalar

   Синтаксис: ВыполнитьСкалярный([ТекстЗапроса])

   Параметры:

           ТекстЗапроса - тип: Строка. Текст запроса, если пустая строка-запрос считается параметризированным. Необязателен, по умолчанию - пустая строка.

   Возвращает: тип: Любой, Структура. Если значение поля результата запроса, или зачения полей результата запроса.

   Описание: Выполняет SQL запрос, при ошибке парсинга или при ошибке на ODBC драйвере формируется исключение. Запрос может возвращать количество обработанных строк: в этом случае возвращается это значение. Запрос может возвращать набор данных, состоящий из одной строки, при этом если в наборе данных одна колонка - возвращается значение из нее, если запрос возвращает несколько колонок - возвращается объект Структура, заполненный полями и именами ключей, соответствующими именам колонок и значениями из этих колонок. Если запрос возвращает набор данных, и в наборе данных нет ни одной строки - это не является ошибкой, в этом случае возвращается пустое значение типа, определенного в первой колонке, или объект Структура, заполненный соответствующим образом. Если запрос не параметризированный - метод гарантированно закрывает курсор.
28 antoneus
 
24.01.13
14:29
В отладке - select descr from sc116 where code = 881
В профайлере - аналогично.
QA вернул "банка".
29 Ёпрст
 
24.01.13
14:30
(28) ну, значит скуль сам неявно приводит к строке, хотя это и моветон
30 Mikeware
 
24.01.13
14:32
(26)(28) неявное приведение типов.
импользовать можно, но плохой стиль - можно и нарваться. по закону подлости - в самый неподходящий момент
31 bananan
 
24.01.13
14:46
На код:

      |SELECT    Сотрудник.Descr AS Наименование
      |        ,Сотрудник.Code AS Код  
      |        ,Сотрудник.Фирма AS Фирма
      |        ,Сотрудник.ДатаУвольнения AS ДатаУвольнения
       |        ,Сотрудник.ДатаПриема AS ДатаПриема
      |FROM
      |    $Справочник.Сотрудники AS Сотрудник
      | WHERE Сотрудник.Code < 1241;";  
Выдает ошибку:
   Server]Invalid column name 'Фирма'.
Делов в том что поле Фирма - имеет тип Справочник.Фирмы...
Здеь надо делать подзапрос?
32 monsterZE
 
24.01.13
14:47
посмотрел и числовой и строковый - везде чар(н)
33 monsterZE
 
24.01.13
14:47
*текстовый =)
34 monsterZE
 
24.01.13
14:49
(31) убери ее и скажет тоже самое на остальные строки =)
35 monsterZE
 
24.01.13
14:50
(31) ты хоть свои же темы пересматривай.. жовано пережовано
36 Delorn
 
24.01.13
14:59
(31) тебе все сказали в (1) зачем быть упорным таким?
",Сотрудник.Code"  обрати внимание на "code". именно так называется поле в реальной таблице
и теперь внимательно посмотри на ",Сотрудник.Фирма" где знак "$" ? поле "фирма" в реальной таблице отсутствует.
37 Wertual-s
 
24.01.13
15:02
Фирма должна быть как [Фирма as $Справочник.Фирмы]
38 Delorn
 
24.01.13
15:03
+(36)для (0) http://www.1cpp.ru/forumfiles/Attachments/mod_002.zip читай до просветления. Обязательно посмотри что представляют из себя таблицы в базе данных. Мне очень помогло.
39 Mikeware
 
24.01.13
15:04
(37) ответ неверный.
40 bananan
 
24.01.13
15:14
(35) Перечитываю и НЕ понимаю, почему такой код:
Клиент [Клиент $Справочник.Клиенты]
работает нормалььно, а код:
Фирма AS [Фирма $Справочник.Фирмы]
выдает ошибку:
 Invalid column name 'Фирма'.
В чем разница???
41 Delorn
 
24.01.13
15:15
(40) не приводи такой мусор в пример ни когда. Приведи полный пример запроса.И уточни название конфигурации и есть ли в ней справочник ФИРМЫ?
42 GLazNik
 
24.01.13
15:16
(40) ответ в (36)
43 Wobland
 
24.01.13
15:22
(40) Клиент [Клиент $Справочник.Клиенты] не будет работать нормально, не ври
44 bananan
 
24.01.13
15:23
(41) Есть там Справочник.Фирмы. Конфигурация АБТ 3.5.5 ПРОФ для Украины
45 rbserg
 
24.01.13
15:24
(31) Выполни запрос:
SELECT     * FROM $Справочник.Сотрудники AS Сотрудник WHERE Сотрудник.Code = '1241'

и посмотри, есть ли в выборке поле "Фирма".
Будешь приятно удивлен. Поля 'Code'  и 'Descr' там соответственно будут.
46 Mikeware
 
24.01.13
15:27
(45) ты думаешь, он сможет увидеть результаты запроса? :-)))
47 bananan
 
24.01.13
15:28
(45) Удивлен НЕПРИЯТНО, в выборке все поля на английском...
48 bananan
 
24.01.13
15:28
(46) Тебе показать результат?
49 Delorn
 
24.01.13
15:28
(44) полный пример запроса привести тяжело конечно... Ну тогда я тебе упрашивать не буду. Сравни три строчки  если натолкнут тебя на мысль твое счастье :)
1) |         ,Сотрудник.Фирма AS Фирма
2) |         ,$Сотрудник.Фирма AS Фирма
3)  |         ,$Сотрудник.Фирма  AS [Фирма $Справочник.Фирмы]
обязательно попробуй их все.
50 bananan
 
24.01.13
15:29
(49) Спасибо, - сейчас попробую
51 bananan
 
24.01.13
15:32
(49) Большое спасибо!!!
Работает код: $Сотрудник.Фирма AS [Фирма $Справочник.Фирмы]
52 КонецЦикла
 
24.01.13
15:32
все нечетал
код числовой?
53 bananan
 
24.01.13
15:32
(52) Да, код - числовой
54 monsterZE
 
24.01.13
15:34
=) прикольно, что тс заюзал пример из учебника, где черным по белому:
Вот и выполнился наш первый запрос. Это конечно хорошо, но справочников в конфигурации много, смотреть каждый раз в DDS ой как не хочется, да и читать такие запросы совсем не удобно. Если использовать ADO, а не 1С++, то так и придется делать. Но скажем спасибо разработчикам 1С++, что в ней есть метапарсер имен, который сам переведет все идентификаторы объектов в их реальные имена. А делается это так:

ТекстЗапроса = "
|SELECT
|    Спр.Code as Код,
|    Спр.Descr as Наименование
|FROM
|    $Справочник.Номенклатура as Спр";

Заменяются следующие имена:
$Справочник.ХХХ – справочник
$Документ.ХХХ – документ
$ДокументСтроки.ХХХ – табличная часть документа
---
пади стебется просто =\
55 bananan
 
24.01.13
15:35
(54) Данный код - не из учебника, он мне позже (завтра) пригодиться....
56 Wobland
 
24.01.13
15:37
(54) он на самом деле такой ;)
57 GLazNik
 
24.01.13
15:39
(55) в добавок к (49) предлагаю еще такой код попробывать:
DELETE FROM $Справочник.Сотрудники
58 Mikeware
 
24.01.13
15:41
(57) что уж мелочиться - тогда уж truncate
59 GLazNik
 
24.01.13
15:43
(58) ах уговорили... drop table
60 bananan
 
24.01.13
15:43
(57)(58)(59) Ваши бы старания да во благо Родины!
61 Mikeware
 
24.01.13
15:45
(60) ну так мы и стараемся во благо _своей_ родины :-)
62 Ёпрст
 
24.01.13
15:45
какие вы все мелочные
DROP DATABASE надоть
63 bananan
 
24.01.13
15:59
Такой вопрос в справочнике поле - поле - перечисление, если там 0 - то женский пол иначе - мужской...
Как это для 1С++ написать?
пробывал так:
|    CASE
      |    WHEN $Сотрудник.Пол = 0 THEN Стать "Ж"
      |    ELSE "Ч"    
     
Понятно ошибку выдает..
64 Ёпрст
 
24.01.13
16:01
(63) выкинуть case и типизировать к $Перечисление.Вид
65 Mikeware
 
24.01.13
16:01
(64)читай про  $Перечисление
66 bananan
 
24.01.13
16:02
(64) Спасибо, попробую (о возвожности типизации - забыл)
67 Mikeware
 
24.01.13
16:02
(65) может, ему не перечисление надо, а именно строку в зависимости от пола?
68 GLazNik
 
24.01.13
16:03
(63) "Ч"? "женщина друг человека"?
69 Ёпрст
 
24.01.13
16:03
(67) раздвояищься ?..
:)

пусть в начале с типизацией пробует.
70 Ёпрст
 
24.01.13
16:04
(68) Червона дива..
71 Mikeware
 
24.01.13
16:08
(68) он хохол...
------
Девушка ночевала у парня. Утром выходит из ванной и спрашивает:
- Дорогой, у тебя висит 2 полотенца с надписями «М» и «Ж». Я вытерлась полотенцем с надписью «Ж», потому что подумала, что М - это для мужчин?
-Ну, вообще-то, «М» - это для морды…
©
72 Delorn
 
24.01.13
16:13
(63) еще раз перечитай ссылку
ТекстЗапроса = "
|SELECT
|    Спр.ID as [Элемент $Справочник.Номенклатура]
|FROM
|    $Справочник.Номенклатура as Спр
|WHERE
|    $Спр.ТипНоменклатуры = :Товар";

RS.УстановитьТекстовыйПараметр("Товар", Перечисление.ТипыНоменклатуры.Товар);
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();
Это от туда
73 Delorn
 
24.01.13
16:15
+(72) Но тебя наверное интересует 6 пример по ссылке
|    $Спр.ТипНоменклатуры as [ТипНоменклатуры $Перечисление.ТипНоменклатуры]
74 bananan
 
24.01.13
16:24
Ж - жинка (женщина), Ч - чоловик (мужчина)
(72)(73) За ссылки спасибо, но у меня так работает:
|        ,$Сотрудник.Пол as [Стать $Перечисление.Пол]
(кстати) "стать" - это пол на украинском языке... :)
75 monsterZE
 
24.01.13
16:28
пиши запросы на украинском =) на родном..
76 Wobland
 
24.01.13
16:28
(74) гы. а я принял за бейсиковский атавизм LET
77 bananan
 
24.01.13
16:35
(75) При всем желании 1С украинскую букву "i" в упор не видит..
А русский я знаю где-то с 3-х лет... :)
78 Ёпрст
 
24.01.13
16:46
ntnc @Ёпрст
79 sapphire
 
24.01.13
16:48
Блeaть, ну неужели непонятно как это работает? :(

Короче, весь сакральный смысл работы прямых запросов в 1С++ сводится к следующему:

1С++ транслирует "мета-SQL" в SQL/t-SQL.

Даже объект есть такой в 1С++ МетаСКЛ....

Значит, нужно понимать следующее:
1. Как правильно использовать метаСКЛ в 1С++
2. Как правильно писать запросы в SQL/t-SQL

по п.1
${Имя типа}.{Идентификатор} вернет имя таблицы
$Справочник.Товары - SC11 к примеру, можно посмотреть как указано в файле 1cv7.dd/1cv7.dds

${Имя типа}.{Идентификатор}.{Поле} - вернет идентификатор поля таблицы. Что-то типа SP1321

в итоге, можно получить конструкцию [Имя таблицы].[Имя поля]

Ликбез по 77: все "Периодический" & Константы храняться в _1SCONST, общие реквизиты и флаги проведения по регистрам - в _1SJOURN.

по п.2: ищи на просторах интернета:
Microsoft SQL Server 2008. Основы T-SQL. Ицик Бен-Ган
80 Ёпрст
 
24.01.13
16:50
81 bananan
 
24.01.13
16:50
(79) Ицика нашел - при возможности - читаю
82 bananan
 
24.01.13
16:57
Процедуру ПриОткрытии надо после всех своих процедур определять или после?
Такой кусок кода
//============================
Процедура ПриОткрытии()
   ДатаАктуальности = РабочаяДата();
   Фирма = Константа.БазФирма.Получить(ДатаАктуальности);
   фОсновные = 1;
   фСовместители = 1;
   фУволенные = 0;
КонецПроцедуры

//*******************************************
Процедура Сформировать()
   Сообщить("ДатаАктуальности =  "+ДатаАктуальности);
выдает ошибку:
 Переменная не определена (ДатаАктуальности)
Что здесь не так??
83 Wobland
 
24.01.13
16:59
(82) даты актуальности нет, ты её спрятал
84 Ёпрст
 
24.01.13
17:00
(82) без разницы
85 bananan
 
24.01.13
17:01
(83) Не понял, - я ДАтуАктуальности назначаю ПриОткрытии()...
Где я ее спраятал и как?
86 Wobland
 
24.01.13
17:02
(85) вот в при открытии и спрятал. видна только там. кури Перем
87 Ёпрст
 
24.01.13
17:02
+84
ДатаАктуальности должна быть или глобальной переменной модуля формы или глобальной (экспортной )переменной глобальника
или реквизитом формы (или риквизитом объекта , если этот код не в обработке/отчете)
88 bananan
 
24.01.13
17:05
С переменной разобрался с вашей помощью...
А вот такой код:
ТекстЗапроса = "
   
      |SELECT    Сотрудник.Descr AS Наименование
      |        ,Сотрудник.Code AS Код  
      |        ,$Сотрудник.Фирма AS [Фирма $Справочник.Фирмы]
      |        ,$Сотрудник.ДатаУвольнения AS ДатаУвольнения
      |        ,$Сотрудник.ДатаПриема AS ДатаПриема    
      |        ,$Сотрудник.ДатаРождения AS ДатаРождения
      |        ,$Сотрудник.ПропискаАдрес AS ПропискаАдрес
      |        ,$Сотрудник.ФактАдрес AS ФактАдрес        
      |        ,$Сотрудник.Пол as [Стать $Перечисление.Пол]
      |        ,$Сотрудник.Образование AS [Образование $Перечисление.Образование]
      |        ,$Сотрудник.СемейноеПоложение AS [СемейноеПоложение $Перечисление.СемейноеПоложение]
      |        ,$Сотрудник.ИНН AS ИНН
      |        ,$Сотрудник.ДокВид AS [ДокВид $Перечисление.ВидыДокументов]
      |        ,$Сотрудник.ДокСерия AS ДокСерия
      |        ,$Сотрудник.ДокНомер AS ДокНомер
      |        ,$Сотрудник.ДокКемВыдан AS ДокКемВыдан
      |        ,$Сотрудник.ДокКогдаВыдан AS ДокКогдаВыдан
      |        ,SUM(Внутренний.Став) as Ставка
      |FROM    
      |(
      |  SELECT
      |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
      |  FROM
      |    $Справочник.Сотрудники Сотр
      |  WHERE
      |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
      |    AND $Сотр.ДатаПриема> :Дат1
      |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
      |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
      |) as Внутренний";
    RS = СоздатьОбъект("ODBCRecordset");
    RS.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989"));  
    RS.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1);  
             
    ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
Выдает ошибку:
  Meta name parser error: неизвестное метаимя или алиас "$Сотрудник"
Что он здесь хочет?? Подзапрос вставил... Может в подзапросе что не так?
89 Wobland
 
24.01.13
17:07
(88) перестань запятые где попало ставить. поубивать надо
на пальцах:

выбрать
сотрудник.что-то
из
(неважно что) как внутренний

какой такой сотрудник?
90 bananan
 
24.01.13
17:07
+(88) уже нашел... не надо с эотим разобрался
91 Ёпрст
 
24.01.13
17:08
(88) всё же книжку то почитай, про скулю..

щас тебе он в вежливой форме пока ошибки выдает, не помню уже, но с 10 или 13 раза уже будет чистый мат на русском!
92 bananan
 
24.01.13
17:10
Сори, запрос с подзапросом по сотрудниках обсуждали вчера и вчера подобный код работал,
в этот код я просто добавил в селекте несколько полей
а он выдает ошибку:
Invalid object name '#tmpSotr'.
93 bananan
 
24.01.13
17:11
(91) Книжку я почитываю периодически, а (88) - невнимательность
94 Wobland
 
24.01.13
17:11
(92) ну не знает оно тмпСотр. ты по-английски понимаешь вообще?
95 Ёпрст
 
24.01.13
17:12
(92) дык а сама временная табличка то есть ?
ты её параметром запроса установил ?
96 bananan
 
24.01.13
17:13
(95) Понял, спасибо!
97 sapphire
 
24.01.13
17:16
Жуть. Прям обострение какое-то.
98 bananan
 
24.01.13
17:28
по поводу tmpSotr...
так вот это писалось под готовый код (и оно, в конце концов заработало)
    RS.УложитьСписокОбъектов(Запрос.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники");      
Как видите здесь используется еще один запрос, а моя задача сейчас все сделать в одном запросе.
Как быть??
99 Ёпрст
 
24.01.13
17:29
(98)
нам отсюда не видно твой код
100 Wobland
 
24.01.13
17:30
(98) соединить
101 bananan
 
24.01.13
17:31
(99) показываю предыдущий код:

//============================
Процедура ПриОткрытии()
   ДатаАктуальности = РабочаяДата();
   Фирма = Константа.БазФирма.Получить(ДатаАктуальности);
   фОсновные = 1;
   фСовместители = 1;
   фУволенные = 0;
КонецПроцедуры

//============================
Процедура ИзмРазрез()
   Если (фОсновные=0) и (фСовместители=0) Тогда
       фОсновные = 1;
       фСовместители = 1;
   КонецЕсли;
КонецПроцедуры

//============================
Функция ФорматПок(Чсл) Экспорт
   Возврат Формат(Чсл,"Ч012.2.,");
КонецФункции

Процедура Сформировать(Пар)    
   ТекстЗапроса = "//{{ЗАПРОС(СписокСотрудников)
   |Период с {ДатаАктуальности} по {ДатаАктуальности};
   |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
   |Фир = Справочник.Сотрудники.Фирма;
   |Оклад = Справочник.Сотрудники.Оклад;
   |КвоЛьгот = Справочник.Сотрудники.КвоЛьгот;
   |Тариф = Справочник.Сотрудники.Тариф;
   |Пенсионер = Справочник.Сотрудники.Пенсионер;
   |Инвалид = Справочник.Сотрудники.Инвалид;
   |Должность = Справочник.Сотрудники.МестоРаботы;
   |Ставка = Справочник.Сотрудники.Ставка;
   |Совместитель = Справочник.Сотрудники.ТипСотрудника;
   |ДатаПриема = Справочник.Сотрудники.ДатаПриема;
   |ДатаУвольнения = Справочник.Сотрудники.ДатаУвольнения;
   |//основные
   |ДатаРождения = Справочник.Сотрудники.ДатаРождения;
   |//координаты
   |ПропискаАдрес = Справочник.Сотрудники.ПропискаАдрес;
   |ФактАдрес = Справочник.Сотрудники.ФактАдрес;
   |//кадровые
   |Стать = Справочник.Сотрудники.Пол;
   |Образование = Справочник.Сотрудники.Образование;
   |СемейноеПоложение = Справочник.Сотрудники.СемейноеПоложение;
   |//идентификация        
   |ИНН = Справочник.Сотрудники.ИНН;
   |ДокВид = Справочник.Сотрудники.ДокВид;
   |ДокСерия = Справочник.Сотрудники.ДокСерия;
   |ДокНомер = Справочник.Сотрудники.ДокНомер;
   |ДокКемВыдан = Справочник.Сотрудники.ДокКемВыдан;
   |ДокКогдаВыдан = Справочник.Сотрудники.ДокКогдаВыдан;
   |//условия запроса и т.д.
   |Условие(Фир=Фирма);
   |Условие (Число(Сотр.Родитель.Код) <> 0);
   |Условие(Сотр в ВыбСотрудник);
   |Условие(ДатаПриема<>Дата(0));
   |Условие(ДатаПриема<=ДатаАктуальности);";
   Если фОсновные=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Условие(Совместитель=1);";
   КонецЕсли;
   Если фСовместители=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Условие(Совместитель=0);";
   КонецЕсли;
   Если Пар=1 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Группировка Сотр Упорядочить По Сотр.Наименование;";
   Иначе
       ТекстЗапроса=ТекстЗапроса+"
       |Группировка Сотр Упорядочить По Сотр.Код;";
   КонецЕсли;
   ТекстЗапроса=ТекстЗапроса+"
   |Функция Окл = Сумма(Оклад);    
   |Функция Тар = Сумма(Тариф);";
         
   
   
   Запрос = СоздатьОбъект("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
       Возврат;
   КонецЕсли;

   Таб = СоздатьОбъект("Таблица");

   Таб.ВывестиСекцию("Шапка|Основная");
   Если фУволенные=1 Тогда
       Таб.ПрисоединитьСекцию("Шапка|Увольнение");
   КонецЕсли;
   Если (фОсновные=1) и (фСовместители=1) Тогда
       Таб.ПрисоединитьСекцию("Шапка|Совместитель");
   КонецЕсли;                          
   Если Основные = 1 Тогда
       Таб.ПрисоединитьСекцию("Шапка|Основные");
   КонецЕсли;
   Если Кадровые = 1 Тогда
       Таб.ПрисоединитьСекцию("Шапка|Кадровые");
   КонецЕсли;
   Если Идентификация = 1 Тогда
       Таб.ПрисоединитьСекцию("Шапка|Идентификация");
   КонецЕсли;
   Если Координаты = 1 Тогда
       Таб.ПрисоединитьСекцию("Шапка|Координаты");
   КонецЕсли;
   Кво = 0;  
   тЗанято = 0;
   Пока Запрос.Группировка("Сотр")=1 Цикл
       тЗанято = тЗанято + 1;
       Состояние( "Обработка " + Запрос.Сотр);
       Если Запрос.Сотр.ЭтоГруппа() = 1 Тогда    
             Запрос_=СоздатьОбъект("ODBCRecordset");    
           ТекстЗапроса = "
               |SELECT
               | SUM(Внутренний.Став) as Ставка
                 |From
                 |(
                 |  SELECT
                 |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
                 |  FROM
                 |    $Справочник.Сотрудники Сотр
                 |  WHERE
                 |     Сотр.ID IN (SELECT Val FROM #tmpSotr)
                 |    AND $Сотр.ДатаПриема> :Дат1
                 |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
                 |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
                 |) as Внутренний
               |";
             Запрос_.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989"));  
             Запрос_.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1);  
             Запрос_.УложитьСписокОбъектов(Запрос.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники");  
               тЗанято = Запрос_.ВыполнитьСкалярный(ТекстЗапроса);
             ПоШтату =  Запрос.Сотр.ПоШтату;        
             тВакантно = Запрос.Сотр.ПоШтату-тЗанято;
             ФиксДан = Шаблон("Занято: [тЗанято] \ По штату: [Запрос.Сотр.ПоШтату] \ Вакантно: [тВакантно]");          
         Таб.ВывестиСекцию("Группа|Основная");
         Если фУволенные=1 Тогда
             Таб.ПрисоединитьСекцию("Группа|Увольнение");    
         Конецесли;
         Если (фОсновные=1) и (фСовместители=1) Тогда
           Таб.ПрисоединитьСекцию("Группа|Совместитель");
       КонецЕсли;
       Иначе    
       
       Если (фУволенные=0) и (ДатаЧисло(Запрос.ДатаУвольнения)<>0) и (Запрос.ДатаУвольнения<=ДатаАктуальности) Тогда
           Продолжить;
       КонецЕсли;
       Кво = Кво + 1;
       ОснПенс = ?(Запрос.Пенсионер=1,"+","");
       ОснИнв = ?(Запрос.Инвалид=1,"+","");
       Таб.ВывестиСекцию("Сотрудник|Основная");
       Если фУволенные=1 Тогда
           Если (ДатаЧисло(Запрос.ДатаУвольнения)<>0) и (Запрос.ДатаУвольнения<=ДатаАктуальности) Тогда
               ДатаУвольнения = Формат(Запрос.ДатаУвольнения,"ДДММГГ");
           Иначе
               ДатаУвольнения = "";
           КонецЕсли;
           Таб.ПрисоединитьСекцию("Сотрудник|Увольнение");
       КонецЕсли;                              
       Если (фОсновные=1) и (фСовместители=1) Тогда
           ОснСовм = ?(Запрос.Совместитель=1,"+","");
           Таб.ПрисоединитьСекцию("Сотрудник|Совместитель");
       КонецЕсли;
       КонецЕсли;
       Если Основные = 1 Тогда
           Таб.ПрисоединитьСекцию("Сотрудник|Основные");
       КонецЕсли;
       Если Кадровые = 1 Тогда
           Таб.ПрисоединитьСекцию("Сотрудник|Кадровые");
       КонецЕсли;
       Если Идентификация = 1 Тогда
           Таб.ПрисоединитьСекцию("Сотрудник|Идентификация");
       КонецЕсли;                                            
       Если Координаты = 1 Тогда
           Таб.ПрисоединитьСекцию("Сотрудник|Координаты");
       КонецЕсли;
   КонецЦикла;

   Таб.ВывестиСекцию("Дно|Основная");
   Если фУволенные=1 Тогда
       Таб.ПрисоединитьСекцию("Дно|Увольнение");
   КонецЕсли;
   Если (фОсновные=1) и (фСовместители=1) Тогда
       Таб.ПрисоединитьСекцию("Дно|Совместитель");
   КонецЕсли;

   Таб.Опции(0,0,0,0);
   Таб.ТолькоПросмотр(0);
   Таб.Показать("Список сотрудников");

КонецПроцедуры

Здесь нонсенс: запрос на 1С++ выполняется в цикле обработки запроса по 1С... (Код писал не я)
102 bananan
 
24.01.13
17:31
(100) Что соеденить и как?
103 Ёпрст
 
24.01.13
17:34
(101) Дык он работает ?
Тогда забить.
Если не устраивает скорость - переписать
104 Wobland
 
24.01.13
17:34
(101) нене, чур меня
105 bananan
 
24.01.13
17:35
(103) Да он - работает; скорость - не устраивает, вот и пытаюсь переписать...
106 bananan
 
24.01.13
17:38
+(105) Т.е. я не понимаю чего мне делать вместо Запроса на 1С...
отсюда затык с:
 RS.УложитьСписокОбъектов(Запрос<<?>>.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники");  
Что мне взять вместо того запроса?
107 bananan
 
24.01.13
17:40
В принципе, если юзер выбирет Какого-то конкретного работика или какое -то подразделение фирмы, тогда, кажется что-то можно придумать.. А если надо по всей фирме - тогда как?
108 bananan
 
24.01.13
17:44
+(106) А вот текст первого запроса:
   ТекстЗапроса = "//{{ЗАПРОС(СписокСотрудников)
   |Период с {ДатаАктуальности} по {ДатаАктуальности};
   |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
   |Фир = Справочник.Сотрудники.Фирма;
   |Оклад = Справочник.Сотрудники.Оклад;
   |КвоЛьгот = Справочник.Сотрудники.КвоЛьгот;
   |Тариф = Справочник.Сотрудники.Тариф;
   |Пенсионер = Справочник.Сотрудники.Пенсионер;
   |Инвалид = Справочник.Сотрудники.Инвалид;
   |Должность = Справочник.Сотрудники.МестоРаботы;
   |Ставка = Справочник.Сотрудники.Ставка;
   |Совместитель = Справочник.Сотрудники.ТипСотрудника;
   |ДатаПриема = Справочник.Сотрудники.ДатаПриема;
   |ДатаУвольнения = Справочник.Сотрудники.ДатаУвольнения;
   |//основные
   |ДатаРождения = Справочник.Сотрудники.ДатаРождения;
   |//координаты
   |ПропискаАдрес = Справочник.Сотрудники.ПропискаАдрес;
   |ФактАдрес = Справочник.Сотрудники.ФактАдрес;
   |//кадровые
   |Стать = Справочник.Сотрудники.Пол;
   |Образование = Справочник.Сотрудники.Образование;
   |СемейноеПоложение = Справочник.Сотрудники.СемейноеПоложение;
   |//идентификация        
   |ИНН = Справочник.Сотрудники.ИНН;
   |ДокВид = Справочник.Сотрудники.ДокВид;
   |ДокСерия = Справочник.Сотрудники.ДокСерия;
   |ДокНомер = Справочник.Сотрудники.ДокНомер;
   |ДокКемВыдан = Справочник.Сотрудники.ДокКемВыдан;
   |ДокКогдаВыдан = Справочник.Сотрудники.ДокКогдаВыдан;
   |//условия запроса и т.д.
   |Условие(Фир=Фирма);
   |Условие (Число(Сотр.Родитель.Код) <> 0);
   |Условие(Сотр в ВыбСотрудник);
   |Условие(ДатаПриема<>Дата(0));
   |Условие(ДатаПриема<=ДатаАктуальности);";
   Если фОсновные=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Условие(Совместитель=1);";
   КонецЕсли;
   Если фСовместители=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Условие(Совместитель=0);";
   КонецЕсли;
ну и при различных уловиях текст запроса дополняется...
109 Ёпрст
 
24.01.13
17:45
сделать один запрос, далее сгруппировать с иерархией в индексированной табличке, или.. получить иерархию в самом запросе.
+ наложить фильтр на вычисление суммы по "уволенным" и "основным" сотрудникам в группе.
110 sapphire
 
24.01.13
17:45
(103) Автора забить. Код переписать.
111 bananan
 
24.01.13
17:47
(109) Дык я и пытаюсь все сделать в одном запрое.. а по поводу иерархии - нифига не понял :(
112 sapphire
 
24.01.13
17:48
(106) Это уже совсем плохо, если такой простой код не понимаешь.
113 Ёпрст
 
24.01.13
17:49
(111) чтоб получить иерархию справочника, тебе нужно, либо делать это в самом запросе (прямом) или на выходе через индексированную таблицу.
114 sapphire
 
24.01.13
17:50
А кто тут у нас, кроме ТС, обладатель md этой чудо-конфы?
115 sapphire
 
24.01.13
17:51
(113) В самом он врядли сможет.
116 sapphire
 
24.01.13
17:53
(113) Какая у него там версия скуля?
117 Ёпрст
 
24.01.13
17:53
(114) у меня еть :)
118 Ёпрст
 
24.01.13
17:53
(116) скорее всего 2000
119 sapphire
 
24.01.13
17:54
(118) Мысль написать изврат с кучей параметров :)
120 Ёпрст
 
24.01.13
17:55
чорт, я прибил его мд-ник..
:(
121 sapphire
 
24.01.13
17:56
(118) Можно получить данные сначала прямым запросом, а потом посчитать для групп.
122 sapphire
 
24.01.13
17:57
(118) просто в 2000 курсором только можно :(
123 bananan
 
24.01.13
17:59
кажется 2005 версия у нас
124 bananan
 
24.01.13
18:00
А где и как можно посмотреть версию?
125 sapphire
 
24.01.13
18:13
select @@VERSION Версия
126 bananan
 
24.01.13
18:26
Ла и здесь нужно выбрать ставку для конкретного сотрудника,
а вот как сделать иерархию, и вот что в данном случае означает слово иерархия - не понимаю, иерархия, ну скажем Фирма в фирме подразделения несколько подразделений имеют еще свои подразделения ну и практически в каждом подразделении есть один и больше сотрудников.
Это подразумевается под иерархией?
т.е. в корнре - фирма - от нее ветви подразделениия и т.д. а уже на ветках сотрудники.
Так?
127 viktor_vv
 
24.01.13
18:40
(126) А где ты Ицика нашел ?
А то че-то в столице как-то глухо с ним.
128 viktor_vv
 
24.01.13
18:41
(127) Я имел ввиду в бумажном варианте. Или ты скачал ?
129 bananan
 
24.01.13
18:44
(128) Скачал
130 bananan
 
24.01.13
18:45
а в бумажном варианте- не искал
131 bananan
 
24.01.13
19:09
Опять же - не понимаю. В главном (внешнем) запросе я выбираю какого-то сотрудника в подзапросе по ИД искать ставку для этого суотрудника и т.д?
ТАк? Или, может кто что-то лучшее подскажет...
132 bananan
 
24.01.13
19:12
То ли что с форумомо то ли что... я уже несколько сообщений написал. А они все "пропали"..
133 bananan
 
24.01.13
19:14
конструкцию Сотр.ID IN (SELECT Val FROM #tmpSotr) Чем можно заменить? Т.е. как создать временную таблицу или что еще??
134 Wobland
 
24.01.13
19:16
навскидку. Сотр.ID IN (SELECT нужные тебе сотрудники)
135 bananan
 
24.01.13
19:17
SELECT (*) Сойдет?
136 Wobland
 
24.01.13
19:18
(135) select "*" тогда уж ;)
137 bananan
 
24.01.13
19:21
Написал такой код:
|SELECT    Сотрудник.Descr AS Наименование
      |        ,Сотр.Code AS Код  
      |        ,$Сотр.Фирма AS [Фирма $Справочник.Фирмы]
      |        ,$Сотр.ДатаУвольнения AS ДатаУвольнения
      |        ,$Сотр.ДатаПриема AS ДатаПриема    
      |        ,$Сотр.ДатаРождения AS ДатаРождения
      |        ,$Сотр.ПропискаАдрес AS ПропискаАдрес
      |        ,$Сотр.ФактАдрес AS ФактАдрес        
      |        ,$Сотр.Пол as [Стать $Перечисление.Пол]
      |        ,$Сотр.Образование AS [Образование $Перечисление.Образование]
      |        ,$Сотр.СемейноеПоложение AS [СемейноеПоложение $Перечисление.СемейноеПоложение]
      |        ,$Сотр.ИНН AS ИНН
      |        ,$Сотр.ДокВид AS [ДокВид $Перечисление.ВидыДокументов]
      |        ,$Сотр.ДокСерия AS ДокСерия
      |        ,$Сотр.ДокНомер AS ДокНомер
      |        ,$Сотр.ДокКемВыдан AS ДокКемВыдан
      |        ,$Сотр.ДокКогдаВыдан AS ДокКогдаВыдан
      |        ,SUM(Внутренний.Став) as Ставка
      |FROM    
      |(
      |  SELECT
      |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
      |  FROM
      |    $Справочник.Сотрудники Сотр
      |  WHERE
      |     Сотр.ID IN (SELECT Сотрв.Code AS КодВ FROM $Справочник.Сотрудники Сотрв))
      |    AND $Сотр.ДатаПриема> :Дат1
      |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
      |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
      |) as Внутренний";
Выдает ошибку:
 Сформировать(<<?>>1)
Слишком много фактических параметров...
138 Wobland
 
24.01.13
19:22
(137) о чём тебе говорит сообщение об ошибке? ты же подумал прежде, чем спрашивать, правда?
139 bananan
 
24.01.13
19:22
И по ошибке кликаеш - никакой реакции... Что это может быть?
140 Mikeware
 
24.01.13
19:22
(137) естественно...
читай документацию
141 bananan
 
24.01.13
19:23
(138) Где в Сформировать () у меня паремтры?
142 Wobland
 
24.01.13
19:23
(141) Сформировать(<<?>>1)
143 bananan
 
24.01.13
19:24
Вот код процедуры Сформировать() полностю:
//*******************************************
Процедура Сформировать()
   Сообщить("ДатаАктуальности =  "+ДатаАктуальности);
   ТекстЗапроса = "
   
      |SELECT    Сотрудник.Descr AS Наименование
      |        ,Сотр.Code AS Код  
      |        ,$Сотр.Фирма AS [Фирма $Справочник.Фирмы]
      |        ,$Сотр.ДатаУвольнения AS ДатаУвольнения
      |        ,$Сотр.ДатаПриема AS ДатаПриема    
      |        ,$Сотр.ДатаРождения AS ДатаРождения
      |        ,$Сотр.ПропискаАдрес AS ПропискаАдрес
      |        ,$Сотр.ФактАдрес AS ФактАдрес        
      |        ,$Сотр.Пол as [Стать $Перечисление.Пол]
      |        ,$Сотр.Образование AS [Образование $Перечисление.Образование]
      |        ,$Сотр.СемейноеПоложение AS [СемейноеПоложение $Перечисление.СемейноеПоложение]
      |        ,$Сотр.ИНН AS ИНН
      |        ,$Сотр.ДокВид AS [ДокВид $Перечисление.ВидыДокументов]
      |        ,$Сотр.ДокСерия AS ДокСерия
      |        ,$Сотр.ДокНомер AS ДокНомер
      |        ,$Сотр.ДокКемВыдан AS ДокКемВыдан
      |        ,$Сотр.ДокКогдаВыдан AS ДокКогдаВыдан
      |        ,SUM(Внутренний.Став) as Ставка
      |FROM    
      |(
      |  SELECT
      |     $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став
      |  FROM
      |    $Справочник.Сотрудники Сотр
      |  WHERE
      |     Сотр.ID IN (SELECT Сотрв.Code AS КодВ FROM $Справочник.Сотрудники Сотрв))
      |    AND $Сотр.ДатаПриема> :Дат1
      |    AND $Сотр.ДатаПриема<= :ДатаАктуальности
      |    AND  ($Сотр.ДатаУвольнения = '01.01.1753' or  $Сотр.ДатаУвольнения>= :ДатаАктуальности )
      |) as Внутренний";
    RS = СоздатьОбъект("ODBCRecordset");
    RS.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989"));  
    RS.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1);  
   
    ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
    Пока ТЗ.ПолучитьСтроку()=1 цикл
       Чис = Чис + 1;
       Если Чис > 3 тогда
           Возврат;
       КонецЕсли;
    КонецЦикла;              
КонецПроцедуры
144 Wobland
 
24.01.13
19:24
(143) сколько параметров в заголовке?
145 bananan
 
24.01.13
19:26
(142) В моем коде покажи такой вызов процедуры Сформировать..
В заголовке нет параметров ...
Упс. Нашел я параметры они на кнопках формы...
146 bananan
 
24.01.13
19:26
Сча с параметрамы - раздберусь
147 Wobland
 
24.01.13
19:28
(145) ты начни думать. и только после того, как не сможешь самостоятельно найти ответ, спрашивай сюда. это практический совет из личного опыта - лучший имхо способ роста в профессиональном плане
148 Wobland
 
24.01.13
19:33
Сотр.ID IN (SELECT Сотрв.Code
поправьте меня, всегда будет пусто
149 bananan
 
24.01.13
19:35
Параметры убрал ошибка:
 Incorrect syntax near the keyword 'AND'.
Это уже легче (если запрос правильно работает) :)
150 Mikeware
 
24.01.13
19:35
(148) случайные совпадения возможны, но маловероятны...
зы. он таки напоминает мне обезъяну за пишущей машинкой, пытающуюся напечатать даже не "войну и мир", а просто связное предложение...
151 Wobland
 
24.01.13
19:36
и скоро ты придёшь к (89)...
152 Wobland
 
24.01.13
19:36
(149) какие мысли есть?
153 Wobland
 
24.01.13
19:38
(152) мда.. он долго будет лишнюю скобку искать
154 Wobland
 
24.01.13
19:39
(153) плин, ну я всё же верю, что человек ищет, а не сидит и ждёт доброго дядю
155 Mikeware
 
24.01.13
19:39
(153) если б только скобка. он вообще не понимает, и не пытается понять - что пишет...
156 Wobland
 
24.01.13
19:40
(155) ну, синтаксически же только скобка. а, ну и (89)
157 Mikeware
 
24.01.13
19:43
(156) а Сотр откуда возьмется?
158 Wobland
 
24.01.13
19:45
(157) вот и я о том же
159 sapphire
 
25.01.13
10:15
(127) В сети, в формате pdf есть
160 Ёпрст
 
25.01.13
10:15
да и так купить можно, в бумажном виде.
На полянке какой-нить или во всяких либру и озонах.
161 sapphire
 
25.01.13
10:17
Кажись там есть еще и периодика, не?
Основная теорема систематики: Новые системы плодят новые проблемы.