Ошибка в 1с нестандартное распределение собственных средств
Перехват исключений в коде
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
2. Тем не менее, необходимость перехвата исключений в коде все же возникает. Например, для того чтобы уточнить текст ошибки, дополнив его прикладной, понятной конечному пользователю, информацией. Однако при этом необходимо фиксировать причину ошибки в журнале регистрации для того, чтобы системный администратор имел возможность выполнить диагностику проблемы и при необходимости передать информацию об ошибке в службу технической поддержки.
3. Частные случаи некорректного использования и перехвата исключений.
Область применения (уточнение): управляемое приложение, обычное приложение.
3.1. Если имеется некоторая серверная бизнес-логика, которая вызывается с клиента при интерактивной работе пользователя:
&НаСервере
Процедура ВыполнитьОперацию()
// код, приводящий к вызову исключения
.
КонецПроцедуры
то неправильно маскировать от пользователя и администратора исходную проблему:
// на клиенте
Попытка
ВыполнитьОперацию();
Исключение
ПоказатьПредупреждение(,НСтр("ru = 'Операция не может быть выполнена.'"));
КонецПопытки;
&НаСервере
Процедура ВыполнитьОперацию()
Попытка
// код, приводящий к вызову исключения
.
Исключение
// Запись события в журнал регистрации для системного администратора.
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка.
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
и тогда на клиенте:
Не следует использовать функцию ОписаниеОшибки , т.к. она неинформативна для разработчика, потому что не возвращает стек в тексте ошибки.
3.2. Не следует анализировать текст исключений с целью интерпретации причины ошибки. Текст исключения может меняться в зависимости от локализации. В условиях отсутствия штатных средств (например, типизированных исключений), следует выдавать пользователю тексты исключений «как есть». Для понятности, его можно дополнить пояснением возможных причин.
Например:
В тех случаях, когда анализ типов исключений критически важен для корректной работы бизнес-логики, следует отказаться от исключений и использовать коды ошибок (коды возврата). При этом недопустимо использовать числовые коды ошибок, т.к. код становится нечитаемым:
КодОшибки = ЗагрузитьФайлИзИнтернета(. );
Если КодОшибки = 12345 Тогда
.
ИначеЕсли .
правильно применять строковые литералы (например, "Успешно", "НетМестаНаДиске", "Отменено" и т.п.):
РезультатЗагрузки = ЗагрузитьФайлИзИнтернета(. );
Если РезультатЗагрузки = "Успешно" Тогда
.
ИначеЕсли .
Строковые литералы кодов ошибок не локализуются.
Исключение составляют случаи работы с веб-сервисами и другими внешними системами, где коды ошибок не доступны, а результат работы транслируется в вызывающий код прикладной конфигурации в виде исключений.
3.3. Если имеется некоторая клиентская бизнес-логика (код выполняется полностью на клиенте):
&НаКлиенте
Процедура СоздатьФайлНаДиске()
// код, приводящий к вызову исключения
.
КонецПроцедуры
то рекомендуется делать дополнительный серверный вызов для протоколирования неудачного результата операции в журнал регистрации:
&НаСервереБезКонтекста
Процедура ЗаписатьОшибкуРаботыСФайлами(. )
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка.
ПодробноеПредставлениеОшибки);
КонецПроцедуры
3.4. Недопустимо перехватывать любые исключения, бесследно для системного администратора:
Попытка
// код, приводящий к вызову исключения
.
Исключение // перехват любых исключений
КонецПопытки;
Как правило, подобная конструкция скрывает реальную проблему, которую впоследствии невозможно диагностировать.
Правильно:
Попытка
// код, приводящий к вызову исключения
.
Исключение
// Пояснение причин перехвата всех исключений "незаметно" от пользователя.
// .
// И запись события в журнал регистрации для системного администратора.
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка.
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Но если пользователь не может отработать останавливающее предупреждение в рамках выполняемой операции или ошибочная ситуация носит исключительный характер и делает бессмысленными все остальные проверки, которые выводят другие останавливающие предупреждения, то следует вызывать исключение.
Процедура ПередЗаписью(Отказ)
Если Не ЗарегистрироватьИзмененияНаУзлахПлановОбмена() Тогда
ВызватьИсключение НСтр("ru = 'Не удалось зарегистрировать изменения на узлах планов обмена. Обратитесь к администратору.'");
КонецЕсли;
.
КонецПроцедуры
Подробнее см. пп. 1.1 и 1.3 стандарта Информирование пользователя.
3.6. Недопустимо делать проверки наличия у объекта реквизитов, методов, макетов и т.п., используя для этого исключения, т.к. это может привести к сложно диагностируемым ошибкам, а также затрудняет отладку в режиме «Останавливаться по ошибке».
Вместо перехвата исключений в этом случае рекомендуется:
- использовать механизмы работы с метаданными, чтобы явным образом проверять наличие или отсутствие реквизита (макета и т.п.);
- если различия связаны с особенностями встраивания библиотек – описывать особенности явным образом в переопределяемых модулях (см. Переопределяемые и поставляемые объекты);
- пересмотреть логику работы методов, использующих перехват исключений. Например, можно предусмотреть параметры, которые определяются в вызывающем коде и указывают нужно или нет обращаться к какому-либо методу или свойству объекта.
Попытка
КонтекстЭДОСервер.ПолучитьМакет("КомпонентаОбмена");
ПутьВК = КонтекстЭДОСервер.ПутьКОбъекту + ".Макет.КомпонентаОбмена";
Исключение
КонецПопытки;
МакетКомпонентыОбмена = КонтекстЭДОСервер.Метаданные().Макеты.Найти("КомпонентаОбмена");
Если МакетКомпонентыОбмена <> Неопределено Тогда
ПутьКМакету = КомпонентаОбмена.ПолноеИмя()
КонецЕсли;
3.7. Порядок обработки исключений при использовании транзакций описан в стандарте Транзакции: правила использования.
3.8. Неправильно использовать исключения для приведения значения к типу. Для таких операций необходимо использовать возможности объекта ОписаниеТипов .
Попытка
КоличествоДнейРазрешения = Число(Значение);
Исключение
КоличествоДнейРазрешения = 0; // значение по умолчанию
КонецПопытки;
ОписаниеТипа = Новый ОписаниеТипов("Число");
КоличествоДнейРазрешения = ОписаниеТипа.ПривестиЗначение(Значение);
Дата публикации 25.03.2021
Использован релиз 3.0.90
С 2021 года в фактическую себестоимость незавершенного производства и готовой продукции не включаются управленческие расходы, кроме случаев, когда они непосредственно связаны с производством продукции, выполнением работ, оказанием услуг (пп. "г" п. 26 ФСБУ 5/2019). В связи с этим в программе "1С:Бухгалтерия 8" (ред. 3) с релиза 3.0.89 затраты, учтенные на счете 26, включаются только в себестоимость продаж и не включаются в себестоимость продукции, работ, услуг. Поддерживается следующий порядок закрытия счета 26 при выполнении регламентной операции "Закрытие счетов затрат 20, 23, 25, 26" в составе обработки "Закрытие месяца".
- Счет 26 в бухгалтерском и налоговом учете закрывается на счет 90.08.1, если форме "Учетная политика" установлен хотя бы один из флажков: "Выпуск продукции" и/или "Выполнение работ, оказание услуг заказчикам". В налоговом учете в этом случае затраты, учтенные на счете 26, всегда относятся к косвенным.
- Счет 26 в бухгалтерском учете закрывается на счет 90.02.1 при условии, что в форме "Учетная политика" сняты оба флажка "Выпуск продукции" и "Выполнение работ, оказание услуг заказчикам". Этот вариант используется для организаций, деятельность которых не связана с производственным процессом (комиссионеры, агенты, брокеры, дилеры и т. п., кроме организаций, осуществляющих торговую деятельность) и которые все затраты учитывают на счете 26 (Инструкция по применению плана счетов бухгалтерского учета, утв. приказом Минфина РФ от 31.10.2000 № 94н). В налоговом учете в этом случае затраты, учтенные на счете 26, могут относиться к прямым или к косвенным расходам (правила отнесения расходов к прямым устанавливаются в регистре сведений "Методы определения прямых расходов производства в НУ", раздел "Главное" – "Налоги и отчеты" – "Налог на прибыль" – ссылка "Перечень прямых расходов", подробнее здесь).
Смотрите также
Читайте также: