Запуск 1С 7.7 по расписанию без авторизации пользователя

Автор АЛьФ, 21 марта 2024, 11:07

« назад - далее »

АЛьФ

Цитата: Злоп от 29 марта 2024, 12:43Полные права виндявого пользователя на папку с базой должны быть.
Папка сетевая и шара подключается с помощью
EXEC xp_cmdshell 'net use R: \\192.168.0.43\e$\Development\Programmer\AFedorov\_bases_\v7\_copy_ /user:*** /Persistent:no'
Из задания в папку пишет. Как проверить достаточно ли прав?

АЛьФ

Попробовал переделать на обращение через OLE.
Initialize возвращает 0 и в журнале регистрации теперь только подключение, без отключения.

АЛьФ

На самом деле с каталогом непонятно, конечно.
Подключается с данными одного пользователя, но запуск 1С идет от системы (от пользователя, под которым SQL запущен). 1С папку видит и к базе логинется, в журнал регистрации пишет. Но тут же отваливается, записав это в тот же ЖР. Т.е. доступа достаточно на чтение и на запись.
Вот почему бы 1С в этом случает не писать в тот же ЖР причину отвала? Загадка...

АЛьФ

Ха! А вот еще тайна природы.
Если код запроса запустить не в задании, а просто в запросе, то запускается и начинает работу. Но валится в исключение на выполнении метода глСервис.ПолучитьСписокАктивныхПользователей().

АЛьФ

А вот фиг! Тайна еще тайней получается. Сработал, как в предыдущем сообщении только один раз. А теперь при любом запуске подключение и тут же отвал.

АЛьФ

Выявилась странная закономерность. Подключаюсь к серверу, на котором стоит SQL, своим логином. Там запускаю "от имени администратора" 1С под регламентным пользователем. Все запускается, как ожидается.
Тут же со своего компа в открытой "менежмент студио" запускаю запрос с регламентыми заданиями, получаю исключение в методе ПолучитьСписокАктивныхПользователей (т.е. идет уже запуск 1С на уровне выполнения глобального модуля и дошло до ПриНачалеРаботыСистемы()). Запускаю этот же запрос второй раз, получаю вход-выход без инициализации глобального модуля.

А может и нет связи между запусками...
Ваще не понимаю что там происходит...

АЛьФ

Тупик... Так ничего и не удалось сегодня сделать. То вход-выход, то вход - вылет по исключению. Без какой-либо системы.
Пытался делать запуск от имени моего логина. Безрезультатно.
Похоже придется писать подмену dll, чтобы отловить где же затык.

АЛьФ

В итоге решение: использовать регламентное задание v8 для запуска батника, в котором прописан запуск семерки.
Все работает.

zhenyat

Здравствуйте
У меня настроено так:
1. Создан cmd - шник, в котором выполняются различные регламентные действия (создание баккапов конфигруатором и  запуск 1с для восстановления индексных файлов:

set CURDATE=%DATE%
set LOG=C:\cmds\Log\backup-%CURDATE:~6,4%-%CURDATE:~3,2%-%CURDATE:~0,2%.txt
set BACKUP_PATH=\\-------\backup\1c77

echo %TIME% ***Begin > %LOG%

del /q D:\-------\ExtForms\DB_SQLite\*
echo %TIME% БД SQLite очищена >> %LOG%

"%ProgramFiles(x86)%\1cv77\bin\1cv7s.exe" config /dD:\------- /tE:\Temp /nBackup /@C:\cmds\Backup

echo %TIME% Резервная копия создана >> %LOG%

if exist %BACKUP_PATH% (
	move E:\Backup\base.zip %BACKUP_PATH%\Work-%CURDATE:~6,4%-%CURDATE:~3,2%-%CURDATE:~0,2%.zip >> %LOG%
) else (
	rename E:\Backup\base.zip Work-%CURDATE:~6,4%-%CURDATE:~3,2%-%CURDATE:~0,2%.zip
)

del /f/q D:\------\*.cdx
"%ProgramFiles(x86)%\1cv77\bin\1cv7s.exe" enterprise /m /dD:\----- /tE:\Temp /nBackup

echo %TIME% Индексы восстановлены >> %LOG%

А раньше и был запуск от имени специального пользователя регламентов - для него в "ПриНачалеРаботыСистемы()" был запуск разных обработок.

2. в планировщике этот батничек запускается от имени специального юзера, с настройками "Выполнять для всех пользователей" и "Выполнять с наивысшими правами"
Естественно, для этого пользователя необходимые базы уже прописаны в реестре

Эта связка работает уже лет 10

MadDAD

Цитата: АЛьФ от 29 марта 2024, 13:48Ха! А вот еще тайна природы.
Если код запроса запустить не в задании, а просто в запросе, то запускается и начинает работу. Но валится в исключение на выполнении метода глСервис.ПолучитьСписокАктивныхПользователей().

Так а что за исключение? Может проблема в правах доступа к папкам пользователей?
Вообще на сколько я помню с семерошных времен - для корректной работы семерки сессия под которой запускается платформа должна быть открыта интерактивно хотя бы один раз после перезапуска сервера, иначе получаются такие спецеффекты. Там какой-то затык с контекстом.

GSoft

Сам запуск делался штатным планировщиком без выкрутас. Только первый запуск делался в ручном режиме под пользователем чтобы все правильно прописалось и настроилось

А про реализацию задачи уже на стороне 1С - я в свое время писал такую штуку для разбора командной строки из ярлыка запуска

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

""C:\Program Files\1Cv77\BIN\1cv7s.exe" enterprise /d"\\ИмяПК\fs\1C\base\itbase\" /N"ИнфоЭкран" "Attr-Отчет.ИнфоЭкранСПП,ИнфоЭкран,ХТМ,ЗакрытьФорму,ЗакрытьПриложение""


1. код запуска основной функции при старте системы
//обработка доппараметров командной строки, пока только для инфоэкранов
	Если ОбработкаДопПараметровКоманднойСтроки() > 0 Тогда
		//В параметрах передан признак закрытия приложения
		СтатусВозврата(0);
		Возврат;
	КонецЕсли;
	//работа системы для инфоэкрана закончена




2. код самой функции (при старте системы)
//_____________________________________________________________________________
Функция ОбработкаДопПараметровКоманднойСтроки() 
	ЕстьПроблемы = 0;
    Закрыть1С = 0;
	
	Если (НазваниеНабораПрав() = "Пользователь") и (ИмяПользователя() = "ИнфоЭкран") Тогда
		Состояние("Обработка параметров командной строки");
		////пока не формируем отчеты из регистров эта проверка не нужна
		////проверка наличия "Оперативного учета"
		//Если НаличиеКомпонентыОперативныйУчет() = 0 Тогда
		//	Возврат 2;
		//КонецЕсли;
		
		////эта проверка пока тоже под вопросом
		//// автоматическое открытие периода
		//Если АвтоматическоеОткрытиеПериода() = 0 Тогда
		//	Возврат 5;
		//КонецЕсли;
		                           
		
		////загружаем только формекс, больше ничего из компонент не надо
		//Если глЗагрузитьКомпонентуФормекс(0) = 0 Тогда
		//	//формекс не загружен, инициализировать командную строку не получится
		//	СписокДопПарам = 0;
		//Иначе        
		//	//формекс загружен, инициализируем командную строку
		//	СписокДопПарам = РазборКоманднойСтрокиФормекс();
		//КонецЕсли;
		//2024-10-02
		Если ПустоеЗначение(глФормексЗагружен) = 1 Тогда
			Если глЗагрузитьКомпонентуФормекс() = 0 Тогда
				//формекс не загружен, инициализировать командную строку не получится
				СписокДопПарам = 0;
			КонецЕсли;

			//формекс загружен только что, инициализируем командную строку
			СписокДопПарам = РазборКоманднойСтрокиФормекс();
		Иначе
			//формекс уже загружен, инициализируем командную строку
			СписокДопПарам = РазборКоманднойСтрокиФормекс();
		КонецЕсли;  
		//2024-10-02
		
		Если СписокДопПарам = 0 Тогда
			//доппараметры отсутствуют или не инициализирован Формекс
			//поэтому запускаем только то что точно надо 
			Результ = "";
			Результ = ИнфоЭкранСПП(0);    
			Закрыть1С = 1;
		Иначе
			Если (ТипЗначенияСтр(СписокДопПарам) = "СписокЗначений") тогда //и (СписокДопПарам.ПолучитьЗначение(1) = "ДопПараметры") Тогда
				Если ТипЗначенияСтр(глСервис) = "Сервис" Тогда // (глФормексЗагружен = 1)  
					Конт = "глМод";  
					
					Для Инд  =  1 По СписокДопПарам.РазмерСписка() Цикл
						//Ищем набор объектов
						ТекущийПараметр = СокрЛП(СписокДопПарам.ПолучитьЗначение(Инд));	
						                                                 
						//в принципе можно в цикле увеличитвать значения счетчика на кол-во значений по умолчанию
						//для отчета на 4 параметра
						//для обработки на 3 параметра
						Если Найти(ТекущийПараметр,"Обработка.") = 1 Тогда
							ТекущийПараметр	= СтрЗаменить(ТекущийПараметр, "Обработка.", "");
						ИначеЕсли Найти(ТекущийПараметр,"Отчет.") = 1 Тогда
							ТекущийПараметр	= СтрЗаменить(ТекущийПараметр, "Отчет.", "");
						ИначеЕсли Найти(ТекущийПараметр,"ЗакрытьПриложение") = 1 Тогда
							ТекущийПараметр	= "";
							Закрыть1С = 1;
						Иначе
							ТекущийПараметр	= "";
						КонецЕсли;
						
						Если ПустоеЗначение(ТекущийПараметр) = 0 Тогда                                   
							Результ = "";
							
							Попытка
								глСервис.ВыполнитьФункцию(Конт,ТекущийПараметр,СписокДопПарам,Результ);    
							Исключение
								Сообщить(ОписаниеОшибки());
								Сообщить("Ошибка при выполнении функции: " + "ТекущийПараметр", "!");
								ЕстьПроблемы = 1;
							КонецПопытки;
						КонецЕсли;
					КонецЦикла;	
				КонецЕсли;
			КонецЕсли;                               
		КонецЕсли;
	КонецЕсли;   

	Если ЕстьПроблемы > 0 Тогда
		Сообщить("Были ошибки при выполнении глобального модуля", "!!!");
	КонецЕсли;
	
	Возврат Закрыть1С;	
КонецФункции	// ОбработкаДопПараметровКоманднойСтроки


3. а дальше в нужном объекте производим разбор параметров полученных из функции (2)