Программное редактирование базы на сервере 1С

1. Manticor 66 11.12.17 10:17 Сейчас в теме
Возникла необходимость редактировать программно уже созданную базу на сервере 1С.

По аналогии из публикации https://infostart.ru/public/146898/ получаю нужную базу на кластере и пытаюсь произвести редактирование описания и признака отключения рег. заданий:

&НаСервере
Процедура СоздатьБазуВРеестреНаСервереТест1(текБаза1С = Неопределено)
    
    
    ИмяРабочейБазы = "test_Vin";    
    СтрокаСоединения = "test_Vin";
    
    ИмяСервера = "MOW03-PT1C04T";        // адрес 1С сервер
    АдминКластера = "";
    ПарольАдминаКластера = "";
    //Админ1С = "COMConnect";     // пользователь с полными правами
    //ПарольАдмина1С = "";        // пароль админа 1С
    
    
    Соединение = Новый COMОбъект("V82.COMConnector");               // Соединились с 1С
    Попытка
        СоединениеАгент = Соединение.ConnectAgent(ИмяСервера);      // Соединились с 1С Агентом
        Кластеры = СоединениеАгент.GetClusters();                   // Получитли массив кластеров (COMSafeArray)
    Исключение
        #Если НаКлиенте тогда
            Сообщить("Ошибка соединения с COM сервером: " + ОписаниеОшибки());
        #КонецЕсли
        Возврат;
    КонецПопытки;
    
    КоличествоКластеров = Кластеры.GetLength(0);
    Если КоличествоКластеров < 1 тогда
        #Если НаКлиенте тогда
            Сообщить("Не найден кластер на сервере " + ИмяСервера);
        #КонецЕсли
        Возврат;
    КонецЕсли;
    
    РабочийКластер = Кластеры.GetValue(0);
    Попытка
        // Авторизируемся на кластере (Кластер,Имя,Пароль)
        СоединениеАгент.Authenticate(РабочийКластер, АдминКластера, ПарольАдминаКластера);
    Исключение
        #Если НаКлиенте тогда
            Сообщить("Ошибка авторизации: " + ОписаниеОшибки());
        #КонецЕсли
        Возврат;
    КонецПопытки;
    
    // Подключаемся к рабочему процессу
    РабочийПроцесс = СоединениеАгент.GetWorkingProcesses(РабочийКластер).GetValue(0);
    Порт = СтрЗаменить(Строка(РабочийПроцесс.MainPort),Символы.НПП,"");  // убиваем непереносимые пробелы
    СтрокаПодлючения = РабочийПроцесс.HostName + ":" + Порт;
    СоединениеСРабочимПроцессом = Соединение.ConnectWorkingProcess(СтрокаПодлючения);
    //СоединениеСРабочимПроцессом.AddAuthentication(Админ1С,ПарольАдмина1С);
    
    // Ищем текущую базу данных
    МассивБаз = СоединениеСРабочимПроцессом.GetInfoBases();
    БазаНайдена = Ложь;
    Для каждого РабочаяБаза из МассивБаз цикл
        ИскомаяБаза = РабочаяБаза.Name;
        БазаНайдена = Найти(СтрокаСоединения,ИскомаяБаза) > 0;
        Если БазаНайдена тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если Не БазаНайдена тогда
        #Если НаКлиенте тогда
            Сообщить("База (" + СтрокаСоединения + ") не найдена на сервере " + ИмяСервера);
        #КонецЕсли
        Возврат;
    КонецЕсли;
    
    
    РабочаяБаза.Descr = "Тест описание";
    РабочаяБаза.ScheduledJobsDenied = Истина;   // Блокируем выполнения регламентных заданий
    СоединениеСРабочимПроцессом.UpdateInfoBase(РабочаяБаза);    
    
КонецПроцедуры
Показать


База на сервере SQL создавалась пустой и без пользователей.

Ругается так:
{ВнешняяОбработка.НазначениеПравВКопияхБаз.Форма.Форма.Форма(1448)}: Ошибка при вызове метода контекста (UpdateInfoBase)
СоединениеСРабочимПроцессом.UpdateInfoBase(РабочаяБаза);
по причине:
Произошла исключительная ситуация: Информационная база не зарегистрирована

Как такое может быть? если я создавал пустую базу и на SQL сервере и на сервере 1С? Может как то по другому возможно редактировать базу в сервере 1с?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
15. spacecraft 13.12.17 11:00 Сейчас в теме +3 $m
(14) я привел типовой код из УТ11. Следовательно он рабочий.
Сама база запускается?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. ImHunter 315 11.12.17 14:08 Сейчас в теме
(1) Через RAC/RAS. Процесс можно немного упростить использованием Deployka. Правда, деплойка использует не весь функционал RAS. Ну и еще для ее работы OScript необходим.
9. Manticor 66 11.12.17 15:41 Сейчас в теме
(1) У кого-нибудь отрабатывает данный код?
11. spacecraft 12.12.17 11:03 Сейчас в теме
(1) как то так:
Процедура РедактированиеИБ()
	COMСоединитель = "v82.COMConnector";
	СтрокаСоединенияСАгентомСервера = "tcp://" + АдресАгентаСервера + ":" + Формат(ПортАгентаСервера, "ЧГ=0");
	СоединениеСАгентомСервера = COMСоединитель.ConnectAgent(СтрокаСоединенияСАгентомСервера);
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);

	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);

	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
		
	ИнформационнаяБаза.Descr = "Тест описание";
	ИнформационнаяБаза.ScheduledJobsDenied = Истина;
	
	СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
	
	ИнформационнаяБаза = Неопределено;
	СоединениеСРабочимПроцессом = Неопределено;
	Кластер = Неопределено;
	СоединениеСАгентомСервера = Неопределено;
	COMСоединитель = Неопределено
КонецПроцедуры

Функция ПолучитьКластер(СоединениеСАгентомСервера, Знач ПортКластера, Знач ИмяАдминистратораКластера, Знач ПарольАдминистратораКластера)
	Для Каждого Кластер Из СоединениеСАгентомСервера.GetClusters() Цикл
		Если Кластер.MainPort = ПортКластера Тогда
			СоединениеСАгентомСервера.Authenticate(Кластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
			Возврат Кластер;
		КонецЕсли;
	КонецЦикла;
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'На рабочем сервере %1 не найден кластер %2'"),
		СоединениеСАгентомСервера.ConnectionString,
		ПортКластера);
КонецФункции

Функция СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер)
	Для Каждого РабочийПроцесс Из СоединениеСАгентомСервера.GetWorkingProcesses(Кластер) Цикл
		Если РабочийПроцесс.Running И РабочийПроцесс.IsEnable  Тогда
			СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
			Возврат COMСоединитель.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
		КонецЕсли;
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найдено активных рабочих процессов.'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"));
	
КонецФункции
	
Функция ПолучитьИБ(СоединениеСРабочимПроцессом, Кластер, Знач ИмяВКластере, Знач ИмяАдминистратораИБ, Знач ПарольАдминистратораИБ)
	СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
	Для Каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
		Если ИнформационнаяБаза.Name = ИмяВКластере Тогда
			Если Не ЗначениеЗаполнено(ИнформационнаяБаза.DBMS) Тогда
				ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильные имя и пароль администратора информационной базы %1 в кластере серверов %2:%3 (имя: ""%4"").'"),
					ИмяВКластере,
					Кластер.HostName, 
					Кластер.MainPort,
					ИмяАдминистратораИБ);
			КонецЕсли;
			Возврат ИнформационнаяБаза;
		КонецЕсли;
	КонецЦикла;
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не найдена информационная база ""%3""!'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"),
		ИмяВКластере);
КонецФункции
Показать
12. Manticor 66 12.12.17 17:19 Сейчас в теме
(11) Попробовал Вашу процедуру)

У вас почему то вместо com объекта строка: COMСоединитель = "v82.COMConnector". Я поправил на Новый COMОбъект("V82.COMConnector").

Все равно ошибка, что база на обнаружена. Какой то бедовый случай((. База создается, но никак не удается ее редактировать.

Я уже все перепробовал - и с аутентификацией пользователя и без. Даже создаю новую базу. Потом новосозданную редактирую. Ошибка. Может в com- компоненте какая проблема??

А у Вас база с пользователями? В кластере как аутентификация проходит - есть администраторы в одноименной ветке?

У Вас код работает? Удается редактировать базу?
Прикрепленные файлы:
13. spacecraft 12.12.17 20:27 Сейчас в теме
(12)
V82.COMConnector

Судя по скрину интерфейс такси. Может тогда V83.COMConnector используется?
14. Manticor 66 13.12.17 10:30 Сейчас в теме
(13) Нет, использование V83 или V82 определяется версией самого сервера 1С, где модифицируется база.

Я пробовал и с версией V83. Также не видит что база зарегистрирована. А у Вас база редактируется?
15. spacecraft 13.12.17 11:00 Сейчас в теме +3 $m
(14) я привел типовой код из УТ11. Следовательно он рабочий.
Сама база запускается?
18. Manticor 66 13.12.17 16:33 Сейчас в теме
(15) База запускается. Начал копаться в УТ 11 - там этот код вызывается из обработки "Настройка разрешений на использование внешних ресурсов". Она не предназначена для непосредственного использования.

Откуда можно вызвать данную обработку а следовательно и метод который редактирует базу?
19. spacecraft 13.12.17 17:42 Сейчас в теме
(18) проще проверить Блокировку регламентных заданий. Там аналогичное выполнение.
Начинается в Администрирование - Поддержка и обслуживание - Блокировка работы пользователей.
21. Manticor 66 14.12.17 18:42 Сейчас в теме
(19) посмотрел работу типового функционала. Кажется нашел причину ошибки. Дело все было в свойстве базы "Descr ". Почему то в связке с этим новым свойством база не перезаписывается. НО! Почему?

Если брать другие свойства как DeniedMessage, SessionsDenied - они изменяемы, а вот Descr - НЕТ.

Олег, Спасибо за помощь)
2. гаврюша 2 11.12.17 10:39 Сейчас в теме
Попробуйте не комментировать: //Админ1С и //ПарольАдмина1С = "", а присвоить им пустые значения. Или завести пользователя с полными правами и задать везде его имя и пароль.
7. Manticor 66 11.12.17 15:07 Сейчас в теме
(2)
ами и задать везде его имя


Также пробовал назначать админа в кластере, прописывал имя и пароль

Пробовал так делать. Эффект тот же.

Пробовал создавать новую базу методом ИБ = РабПроц.CreateInfoBase(BaseInfo,0).
База создается.

Отчего же не получается изменять уже существующую методом UpdateInfoBase?
3. yaroslav.artem 11.12.17 11:19 Сейчас в теме
Наоборот с паролем попробуйте.
4. Aitbay 11.12.17 13:33 Сейчас в теме
Для каждого РабочаяБаза из МассивБаз цикл
        ИскомаяБаза = РабочаяБаза.Name;
        БазаНайдена = Найти(СтрокаСоединения,ИскомаяБаза) > 0;
        Если БазаНайдена тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если Не БазаНайдена тогда
        #Если НаКлиенте тогда
            Сообщить("База (" + СтрокаСоединения + ") не найдена на сервере " + ИмяСервера);
        #КонецЕсли
        Возврат;
    КонецЕсли;
    
    
    РабочаяБаза.Descr = "Тест описание";
    РабочаяБаза.ScheduledJobsDenied = Истина;   // Блокируем выполнения регламентных заданий
    СоединениеСРабочимПроцессом.UpdateInfoBase(РабочаяБаза);    
Показать

в отладке чему равно РабочаяБаза? если цикл закончится и ничего не найдет? РабочаяБаза будет последнее значение и не факт найденное
8. Manticor 66 11.12.17 15:10 Сейчас в теме
(4) база есть в ресстре, в переменной РабочаяБаза - искомая база в отладчике
(6) у меня читая база. В ней нет ни пользователей, ни инфы.
6. Octopus 337 11.12.17 14:15 Сейчас в теме
Авторизация не нужна только для тех баз, в которых нет пользователей. Если есть хотя бы один - нужно указывать параметры полноправного пользователя. Иначе не пустит.
10. Manticor 66 12.12.17 09:18 Сейчас в теме
Кто то сталкивалcя с такой проблемой? У кого то работает данный код для редактирования базы на сервере 1С???
23. Anchoret 60 31.08.18 16:22 Сейчас в теме
(10)
Ушпешно работает, могу программно устанавливать блокировку сеансов, но, когда добавляю в код изменение описания ИБ, то отвалиывается с ошибкой
"Произошла исключительная ситуация: Информационная база не зарегистрирована"
16. bs.nnov 13.12.17 11:12 Сейчас в теме
запусти Администрирование серверов 1С Предприятия в списке Информационных баз есть база?
17. Manticor 66 13.12.17 15:25 Сейчас в теме
(16)
ние серверов 1С Предприяти


Есть! Это же очевидно.
20. spacecraft 13.12.17 19:40 Сейчас в теме
Все действия производятся на компьютере где установлен сервер1С? Если нет, то попробовать там. Возможно зарегистрированный СОМконнектор на удаленном компьютере не соответствует версии сервера1С.
22. Manticor 66 14.12.17 18:43 Сейчас в теме
(20) тогда бы было соответствующее сообщение о несоответствии. Это уже проходили)
24. ingmar 26.02.21 13:43 Сейчас в теме
(23)
Удалось ли найти причину данного поведения? На дворе 2021 год, 1с 8.3.17, а проблема та же. Изменение описания базы не доступно.
Описание изменяется только через "Соединение с агентом сервера"
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот