Как отработать ошибку запроса 1С 7.7 при подключении из 8.3

1. michaelbag 08.09.20 14:21 Сейчас в теме
Уважаемые коллеги!

Ситуация следующая. Из базы 1С:Управление медицинским центром (1С:Предприятие 8.3 (8.3.16.1063)) подключаюсь к старой файловой базе 1С 7.7.

Компонент 1С7.7 создается, подключаюсь, все ок. Создаю объект запроса:

ЗапросВ77 = В77.CreateObject("Запрос");


Формирую текст запроса и выполняю ЗапросВ77.Выполнить(ТекстЗапросаКонтрагентов)

В случаях - если в запросе ошибка системы вылетает из попытки и пытается компонент закрыть:

В77 = Неопределено;


Но к сожалению, экземпляр 1С7.7 остается запущенным - это мешает повторному запуску подключения.

А если принудительно снять задачу в Диспетчере задач - то при следующем подключении компонента автоматически переиндексирует базу 7.7.

Подскажите, как корректно отработать возможные некорректные запросы из 1с 8.3 в компонент 1с 7.7?

При следующем фрагменте

Если ЗапросВ77.Выполнить(ТекстЗапросаКонтрагентов) = 0 Тогда
	ОбщегоНазначения.СообщитьОбОшибке("Не удалось выполнить запрос к справочнику контрагентов. Обработка прекращена.");
	РезультатЗапроса = "<ht ml><head></head><body><p>Запрос не выполнен.</p></body></html>";
	ОбщегоНазначения.СообщитьПользователю("Запрос не выполнен. " + ТекстЗапросаКонтрагентов);
	ЗапросВ77 = Неопределено;
	В77 = Неопределено;
	Возврат;
КонецЕсли;


ЗапросВ77.Выполнить(ТекстЗапросаКонтрагентов) = 0 - не отрабатывается с возникновением исключения.

Пытаюсь все завернуть в отдельную попытку:

		Попытка
			Если ЗапросВ77.Выполнить(ТекстЗапросаКонтрагентов) = 0 Тогда
				ОбщегоНазначения.СообщитьОбОшибке("Не удалось выполнить запрос к справочнику контрагентов. Обработка прекращена.");
				РезультатЗапроса = "<ht ml><head></head><body><p>Запрос не выполнен.</p></body></html>";
				ОбщегоНазначения.СообщитьПользователю("Запрос не выполнен. " + ТекстЗапросаКонтрагентов);
				ЗапросВ77 = Неопределено;
				В77 = Неопределено;
				Возврат;
			КонецЕсли;
		Исключение
			ОбщегоНазначения.СообщитьПользователю("Запрос не выполнен с исключением. " + ТекстЗапросаКонтрагентов);
			РазорватьСоединение(В77);
			Возврат;
		КонецПопытки;
Показать


Компонент не убивается, оставаясь запущенным. :-(

В других ситуациях РазорватьСоединение(В77); - срабатывает штатно.

Ну и уточнение кода этой процедуры:

&НаКлиенте
Процедура РазорватьСоединение(В77 = Неопределено)
	
	В77 = Неопределено;
	ОбщегоНазначенияКлиент.СообщитьПользователю("Соединение с 1С 7.7 разорвано.");
		
КонецПроцедуры


Помогите. А то уже несколько дней пытаюсь отработать ситуацию.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex_bob 246 08.09.20 14:38 Сейчас в теме
А вы что, хотите произвольные запросы из 77 возвращать? Или конкретные данные?
3. michaelbag 08.09.20 14:43 Сейчас в теме
(2) Я хочу в 8.3 готовить произвольные запросы для 1С 7.7, подключаться с этим запросом, получать данные и дальше в 8.3 с ними работать, допуская ситуации запросов с ошибками.
4. oleg-x 27 08.09.20 14:52 Сейчас в теме
(3) Не допускайте ситуации с ошибками и проблем не будет. Сам запрос можете отладить в самой 7.7
5. oleg-x 27 08.09.20 14:54 Сейчас в теме
Ну или напишите процедуру выполнения запроса на стороне 7,7 и оберните там в попытку. И уже из 8.3 обращаетесь в 7.7, передав текст запроса, а обратно будет возвращать результат. Тогда проблем с компонентой не будет, в случае ошибки вернет исключение.
michaelbag; alex_bob; +2 Ответить
6. michaelbag 08.09.20 15:54 Сейчас в теме
(5) Согласен, что данный вариант наиболее правильный.

Но главное на вопрос «Возможно ли отработать исключение в 1с 8.3 при выполнении компонентой 1с 77 некорректного запроса (без изменения конфигурации 1с 7.7)? Со штатным закрытием процесса 1с 7.7 и без необходимости переиндексации базы.» ответ - НЕТ?
7. oleg-x 27 08.09.20 16:14 Сейчас в теме
8. michaelbag 08.09.20 16:48 Сейчас в теме
Внес в глобальный модуль 77 функцию:

Функция глПолучитьРезультатЗапросаДля83(ТекстЗапроса) экспорт
	Запрос = СоздатьОбъект("Запрос");
	Попытка
		Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
			Возврат 0;
		КонецЕсли;
		ТЗ = СоздатьОбъект("ТаблицаЗначений");
		Запрос.Выгрузить(ТЗ, 0, 0);
		Возврат ТЗ;
	Исключение
		Сообщить("Запрос для 1с 8.3 не может быть выполнен. " + ОписаниеОшибки());
		Возврат 0;
	КонецПопытки;
КонецФункции
Показать



(5) А как через COM объект обратиться к функции-обёртке с получением результата?
9. alex_bob 246 08.09.20 17:58 Сейчас в теме
в77.глПолучитьРезультатЗапросаДля83(ТекстЗапроса)


Сообщить() уберите. Либо запись в журнал регистрации, либо в какой-то доступный в 83 файл.
michaelbag; +1 Ответить
10. slasher777 29.09.20 20:08 Сейчас в теме
Не должно быть такой проблемы, если не перепроводился документ отпуска по уходу. Очистите кэш, результаты перепроведения могут там застрять, в конце концов можете ещё отладчиком пройтись и поискать, откуда ноги сторно растут.
Оставьте свое сообщение

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