Обработка исключений

Исключения – очень слабо раскрытая тема в мире 1С разработки. С одной стороны, это обусловлено довольно ограниченными возможностями, с другой – и те, что есть, используются не всеми.

Две главные вещи, которые необходимо усвоить – ошибочные ситуации должны быть обработаны, а результат обработки должен содержать всю необходимую информацию для идентификации ошибки.

Бессмысленные сообщения

Первая боль – это бессмысленные сообщения об ошибке. Думаю, все встречали сообщения типа Не удалось провести Реализация товаров услуг по причине: Не удалось провести Реализация товаров услуг.
Очень часто при обработке сообщений об ошибках игнорируются пользовательские сообщения (а те, кто выводит сообщения пользователю, почему-то, игнорируют журнал регистрации).

Для того чтобы сделать сообщения более понятными, необходимо получать сообщения пользователю там, где такие сообщения могут быть. Это может быть и проверка заполнения объекта, и проведения документов, зависящих от остатков.

Функция СообщенияПользователю(УдалитьПолученные = Истина) Экспорт
	
	СформированноеСообщение = "";
	
	ПолученныеСообщения = ПолучитьСообщенияПользователю(УдалитьПолученные);
	
	Для Каждого Сообщение Из ПолученныеСообщения Цикл
		СформированноеСообщение = ?(ПустаяСтрока(СформированноеСообщение),
			Сообщение.Текст,
			СтрШаблон("%1%2%3", СформированноеСообщение, Символы.ПС, Сообщение.Текст)
		);
	КонецЦикла;
	
	Возврат СформированноеСообщение;
	
КонецФункции

Трассировка ошибки

Вторая боль в обработке ошибок – обрыв стек-трейса. В 1С есть ключевое слово “ВызватьИсключение”. У этого слова двойное назначение:
1. Наиболее известное – мы можем породить новое исключение со своим текстом, которые поймаем где-то выше в стеке выполнения.
2. Вызов без текста в блоке Исключение-КонецПопытки. Этот вызов позволяет сначала обработать ошибку, записать какую-то запись в журнал, а после этого продолжить обработку исключения в вышестоящих попытках. При этом вызванное исключение будет содержать полный стек вызовов, который привел к возникновению исключения.

Стек выполнения, зачастую, является самой важной информацией для понимания ошибки, способах её воспроизведения и устранения.

Кстати, в конфигуратор, в меню “Отладка” есть малоизвестный пункт меню “Стек вызовов”, который тоже может быть очень сильным инструментом для отладки приложения.

Соответствие в 1С

Соответствие в 1С — это реализация структуры данных «ассоциативный массив». Во всех популярных языках программирования есть реализации подобной структуры: Dictionary, HashMap, Map (именно так соответствие пишется в 1С на английском языке).

Ассоциативный массив предполагает наличие трех операций:

  1. Вставка(Ключ, Значение)
  2. Поиск(Ключ)
  3. Удаление(Ключ)

Одно из требований к ассоциативным массивам — выполнение всех операций в худшем случае со сложностью O(log n). 

Реализация на хэш-таблицах, например, дает среднее время O(1), но при этом допускает просадку по скорости при вставке значения из-за дополнительных перестроений хэш-таблиц.