Имя: Пароль:
1C
1С v8
где выполняется код?
,
0 vde69
 
15.11.16
16:07
есть некий кусок кода, проблемы в нем возникают при работе с COM (ошибка прав)

для понимания я включил туда следующий код который всегда "???"


#Если Сервер Тогда
    Сообщить("Выполняется на сервере");
#ИначеЕсли  Клиент Тогда
    Сообщить("Выполняется на клиенте");
#ИначеЕсли  ВнешнееСоединение Тогда
    Сообщить("Выполняется в COM соединении");
#Иначе
    Сообщить("???");
#КонецЕсли


какие будут предложения?
1 Волшебник
 
модератор
15.11.16
16:08
сделай запись в журнал регистрации
2 EugeniaK
 
15.11.16
16:15
(0) Какая платформа?
Я бы еще попробовала варианты
НаСервере
ТолстыйКлиентОбычноеПриложение
НаКлиенте
ТолстыйКлиентУправляемоеПриложение
ТонкийКлиент
3 Ёпрст
 
15.11.16
16:16
ТонкийКлиент (ThinClient)
   ВебКлиент (WebClient)
4 Ёпрст
 
15.11.16
16:16
МобильноеПриложениеКлиент (MobileAppClient)
   МобильноеПриложениеСервер (MobileAppServer)
5 Ёпрст
 
15.11.16
16:17
Ты это, всё пробуй :)
6 Лефмихалыч
 
15.11.16
16:25
если COM, то это либо внешнееСоединение, либо Сервер.
Что за ошибка-то?
7 vde69
 
15.11.16
16:33
код выполняется на сервере через

                Выполнить(ТекущийОбработчик.КодОбработчика);


вероятно директивы банально не работают для "Выполнить"
8 Лефмихалыч
 
15.11.16
16:36
(7) ты ошибку-то покажешь или как?
9 NafBF
 
15.11.16
16:38
(7) я тоже делал по Выполнить(...) и все тоже, видимо при Выполнить(...) всё игнорируется
10 GedKo
 
15.11.16
16:39
"Выполнить" отрабатывается в контексте собственного вызова.
11 Torquader
 
15.11.16
16:49
(10) А если из "выполнить" вызывается функция на сервере, то контекст-то поменяется.
12 vde69
 
15.11.16
17:03
(8) ошибка

{(52)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: -2147024891(0x80070005): Отказано в доступе.


код

        Попытка
            мОб="WinNT:"+СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/")+",user";
            Сообщить(мОб);
            objNameSpace = ПолучитьCOMОбъект(мОб);  
            Если objNameSpace.AccountDisabled = Истина Тогда
                ОшибкаТекущегоПользователя = ОшибкаТекущегоПользователя + "; уволен";
            КонецЕсли;
            objNameSpace = неопределено;
        Исключение
            Сообщить(ОписаниеОшибки());
            ОшибкаТекущегоПользователя = ОшибкаТекущегоПользователя + "; не найден в AD";
        КонецПопытки;
13 Serginio1
 
15.11.16
17:33
Выполняются в БезопасныйРежим
14 Вафель
 
15.11.16
17:33
А у пользователя КОМ есть права администратора?
15 EugeniaK
 
15.11.16
17:38
(12) Начни с выполнения примера кода без "Выполнить()"
16 Господин ПЖ
 
15.11.16
17:38
виндовая ошибка с доступом...

может антивиь думает что вирус лазит?
17 vde69
 
15.11.16
17:44
(13) нет,
проверил - обычный режим

ошибка возникает из-за того, что выполнение на сервере идет под учеткой службы 1с, а она локальная...

а мне нужна доменная учетка...

вот теперь чешу репу чего делать... переносить код на клиент - не хочется, гемороя много...
18 Вафель
 
15.11.16
17:46
а чтобы сервер под доменом не запустить?
19 Лефмихалыч
 
15.11.16
17:49
(17) запускай службу под доменной учеткой
или
wmic /node:[targetIPaddr] /user:[admin] process call create
20 Serginio1
 
15.11.16
17:59
(17) А ты внутри выполнить проверь
21 Serginio1
 
15.11.16
18:00
А ком то 64 разрядный? или это exe
22 Garykom
 
гуру
15.11.16
18:06
Выкинуть COM не предлагать?
23 Вафель
 
15.11.16
18:40
(22) А как еще? компоненту писать?
24 Garykom
 
гуру
15.11.16
18:45
(23) http://v8.1c.ru/o7/201312rest/ уже 3 года прошло
25 Garykom
 
гуру
15.11.16
18:45
(24)+ "REST интерфейс позволяет читать данные 1С:Предприятия, изменять их, создавать новые объекты данных и удалять существующие."
26 Вафель
 
15.11.16
18:46
(25) Те ты предлагаешь внешнюю прогу писать, которая бы дергала рест от 1с?
27 Garykom
 
гуру
15.11.16
18:47
(26) А писать внешнюю прогу которая дергает по COM 1С не нуна?
28 Вафель
 
15.11.16
18:48
(27) Тут 1с дергает по кому wmc
29 Fragster
 
гуру
15.11.16
18:48
Инструкции препроцессора
Инструкции препроцессора
Для указания разрешения использования процедур и функций общих модулей и модулей объектов используют инструкции препроцессора.
Синтаксис:

   #Если <Логическое выражение> Тогда
   #ИначеЕсли <Логическое выражение> Тогда
   …
   #Иначе
   #КонецЕсли

   где:
   <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
   <Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
   <Булева операция> = {И | ИЛИ}

Используемые термы:

   #Если (#If)
   #Тогда (#Then)
   #ИначеЕсли (#ElsIf)
   #Иначе (#Else)
   #КонецЕсли (#EndIf)
   #Область (#Region)
   #КонецОбласти (#EndRegion)
   Клиент (Client)
   НаКлиенте (AtClient)
   НаСервере (AtServer)
   МобильноеПриложениеКлиент (MobileAppClient)
   МобильноеПриложениеСервер (MobileAppServer)
   ТолстыйКлиентОбычноеПриложение(ThickClientOrdinaryApplication)
   ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication)
   Сервер (Server)
   ВнешнееСоединение (ExternalConnection)
   ТонкийКлиент (ThinClient)
   ВебКлиент (WebClient)  
   И (AND)
   ИЛИ  (OR)
   НЕ (NOT)

Регистр букв (строчные или заглавные) при написании не имеет значения.

Описание использования:

Группировка и свертка групп строк в модулях на встроенном языке

   #Область [<Имя области>]
   …
   #КонецОбласти

[<Имя области>] – это идентификатор, который будет использоваться для отображения заголовка области, когда область свернута.

Если <Имя области> отсутствует, не является  идентификатором или состоит из нескольких идентификаторов, будет выдаваться синтаксическая ошибка.

При редактировании модуля, в случае, если имя области не указано, при отображении свернутой области будет использована не локализуемая строка вида "[.....]".

Эти инструкции препроцессора ни на что не влияют. При формировании клиентской части модулей в управляемом приложении, инструкции вырезаются из формируемого клиентского модуля и, соответственно, в клиентское приложение не передаются.


Инструкции препроцессора #Область и #КонецОбласти должны быть парными. Они не могут пересекаться с другими инструкциями препроцессора.
Такой код вызовет ошибки компиляции модуля.

#Область Обл1

#Если Клиент Тогда

#КонецОбласти

#КонецЕсли

Инструкции препроцессора #Область и #КонецОбласти могут быть вложенными, т.е. обозначать области, вложенные друг в друга:

#Область Обл1

#Область Обл2


#КонецОбласти

#КонецОбласти

Поскольку единственное назначение инструкций препроцессора #Область и #КонецОбласти состоит в обозначении группируемых или группируемых и сворачиваемых строк в модулях на встроенном языке, не поддерживается пересечение этих инструкций с другими группируемыми конструкциями встроенного языка, например с процедурами/функциями, условными операторами, циклами.

Правильно:

#Область Обл1

Процедура Проц1()

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

#КонецОбласти

Неправильно (группируемые части модуля пересекаются):

#Область Обл1

Процедура Проц1()

#КонецОбласти

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

В варианте клиент-сервер

Если используется клиент–серверный вариант запуска системы "1С:Предприятие", то можно организовывать выполнение различных процедур и функций на сервере приложения или на клиентском месте.

   Для выполнения на сервере (инструкции Сервер и НаСервере равнозначны):
   #Если НаСервере Тогда
   …
   #КонецЕсли

   Для того, чтобы процедура присутствовала и была вызвана на стороне сервера, фрагмент кода должен выглядеть следующим образом:

   #Если Сервер Тогда
   Процедура Проц1() Экспорт
   …
   КонецПроцедуры
   #КонецЕсли

Важно! В приведенном тексте ВСЯ процедура, а не ее часть находится внутри блока #Если Сервер Тогда … #КонецЕсли.

При запуске конфигурации на выполнение производится загрузка и компиляция конфигурации. Экземпляры всех общих модулей создаются как на серверной, так и на клиентской стороне. Если в каком-то из общих модулей содержится приведенный фрагмент кода, то он в соответствии с инструкцией препроцессора #Если Сервер Тогда … #КонецЕсли будет скомпилирован только на стороне сервера, а на стороне клиента данный фрагмент «выпадет» из компилируемого текста и, таким образом, процедура на стороне клиента не будет представлена совсем.
Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер "1С:Предприятия".

Если блок #Если Сервер Тогда … #КонецЕсли включает только часть процедуры, то процедура будет присутствовать как на стороне клиента, так и на стороне сервера. Только на клиентской стороне она будет без той части, которая заключена в блок, поэтому результат выполнения процедуры может зависеть от того, где обрабатывается вызов этой процедуры.

   Для выполнения на клиентском месте в обычном и управляемом режиме:

   #Если НаКлиенте Тогда
   …
   #КонецЕсли

   или

   #Если Клиент Тогда
   …
   #КонецЕсли

Инструкция препроцессора НаКлиенте (AtClient) определена для всех клиентских приложений. Для тонкой подстройки модуля под конкретное клиентское приложение дополнительно введены инструкции ТолстыйКлиентОбычноеПриложение (ThickClientOrdinaryApplication), ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication), ТонкийКлиент (ThinClient) и ВебКлиент (WebClient), которые определены в соответствующих приложениях.
   Для выполнения на клиенте:

   #Если ТолстыйКлиентОбычноеПриложение Тогда
   …
   #КонецЕсли
   #Если ТолстыйКлиентУправляемоеПриложение Тогда
   …
   #КонецЕсли

   Для выполнения на тонком клиенте:

   #Если ТонкийКлиент Тогда
   …
   #КонецЕсли

   Для выполнения на веб-клиенте:

   #Если ВебКлиент Тогда
   …
   #КонецЕсли

В файл–серверном варианте

В обычном клиенте в обычном и управляемом режиме доступны НаКлиенте, Клиент, ТолстыйКлиентОбычноеПриложение, ТолстыйКлиентУправляемоеПриложение , НаСервере, Сервер.
В файловом варианте инструкции препроцессора #Если Сервер…, #Если Клиент…, #Если ТолстыйКлиентОбычноеПриложение или #Если ТолстыйКлиентУправляемоеПриложение… определены всегда, поэтому экземпляр кода будет присутствовать всегда.
В тонком клиенте доступны – ТонкийКлиент, НаКлиенте, Клиент.
На серверной части тонкого клиента – Сервер, НаСервере.
Во внешнем соединении – ВнешнееСоединение, НаСервере, Сервер.

В сессии СОМ-соединения

Для включения возможности использования процедур и функций в сессии внешнего соединения применяется инструкция препроцессора ВнешнееСоединение.

   #Если ВнешнееСоединение Тогда
   …
   #КонецЕсли

Особенности использования инструкций препроцессора совместно с директивами компиляции см. в главе "Директивы компиляции".

В мобильном приложении (клиент)

Для включения возможности использования процедур и функций в мобильном приложении на стороне клиента применяется инструкция препроцессора МобильноеПриложениеКлиент. Директива действует независимо от Клиент, то есть код одновременно и Клиент и МобильноеПриложениеКлиент.

   #Если МобильноеПриложениеКлиент Тогда
   …
   #КонецЕсли

В мобильном приложении (сервер)

Для включения возможности использования процедур и функций в мобильном приложении на стороне сервера применяется инструкция препроцессора МобильноеПриложениеСервер. Директива действует независимо от Сервер, то есть код одновременно и Сервер и МобильноеПриложениеСервер.

   #Если МобильноеПриложениеСервер Тогда
   …
   #КонецЕсли


--------------------------------------------------------------------------------

     Методическая информация
30 Garykom
 
гуру
15.11.16
18:50
(28) С фига ли? Или ТС обращается по COM к базе 1С и она дергает по COM WMI ? Идиотизм...
31 Вафель
 
15.11.16
18:52
(30) тут классическая задача отключить пользователей в 1с, которые отключены в домене
32 Garykom
 
гуру
15.11.16
18:55
(31) Эээ ничего не понял. Вы телепат или просто ТС это сказал? Где?
33 vde69
 
15.11.16
21:55
(32) об этом в коде написано....

собственно я придумал как сделать, правда не уверен, что будет универсально...
34 Garykom
 
гуру
15.11.16
22:15
(33) ага терь вижу (12)

Просто не совсем логично из 1С проверять список заблокированных в домене и отрубать их в 1С.
Логичнее скриптик для оси который юзеров проверяет и создает/включает/отключает учетки в 1С.
35 Garykom
 
гуру
15.11.16
22:16
(34)+ Потому что оси то они разные бывают, к примеру AD DC может быть и на linux'е.
36 Torquader
 
15.11.16
22:44
(35) Да, может, только там и по OLE никуда не сходишь и WMI не будет - так что, в любом случае, будет зависимо от системы.
Поэтому, проще писать или скрипт или службу, которая получает данные о пользователях домена, а потом вызывает 1С и выполняет синхронизацию с полученными данными.
37 vde69
 
16.11.16
17:07
вот собственно код который вроде корректно работает, есть проблема с полем AccountExpirationDate, кроме как через попытку не нашел решения, если кто подскажет будет совсем хорошо

//--------------------------------------------------

МассивАктивныхУчеток = Новый Массив;
МассивЗаблокированыхУчеток = Новый Массив;
Попытка

    мТекущаяДата = ТекущаяДата();

    //-------------------------------------------
    ИмяДомена = "xxxxxxxxx";
    
    мОб="WinNT://"+ИмяДомена;
    objNameSpace = ПолучитьCOMОбъект(мОб);  
    
    м = Новый Массив();  м.Добавить("User"); // Computer User Group GlobalGroup domain  
    м2 = Новый COMSafeArray(м, "VT_VARIANT");
    objNameSpace.Filter = м2;
    Для каждого item Из objNameSpace Цикл  
        ЕстьЗапретПоДате = Ложь;
        Попытка
            ЕстьЗапретПоДате = item.AccountExpirationDate < мТекущаяДата;
        Исключение
        КонецПопытки;
        
        мУчетка = ВРег("\" + ИмяДомена + "\" + item.Name);
        Если ЕстьЗапретПоДате Тогда
            МассивЗаблокированыхУчеток.Добавить(мУчетка);
        ИначеЕсли item.AccountDisabled = Ложь Тогда
            МассивАктивныхУчеток.Добавить(мУчетка);
        Иначе
            МассивЗаблокированыхУчеток.Добавить(мУчетка);
        КонецЕсли;
    КонецЦикла;
    
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;