Программное редактирование базы на сервере 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 312 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, а проблема та же. Изменение описания базы не доступно.
Описание изменяется только через "Соединение с агентом сервера"
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)