|
где выполняется код? | ☑ | ||
---|---|---|---|---|
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 = Ложь Тогда МассивАктивныхУчеток.Добавить(мУчетка); Иначе МассивЗаблокированыхУчеток.Добавить(мУчетка); КонецЕсли; КонецЦикла; Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |