- Не работает приложение на Android. Что делать
- Как удалить кэш приложения на Android
- Как сбросить данные приложения на Android
- Не запускается приложение. Как исправить
- Не работает поиск в Excel: в чем проблема?
- Не работает поиск в Excel
- Windows 11
- Не отображается текст в ячейке Excel
- Как отобразить строки в Excel
- Как закрыть Эксель, если не закрывается
- Как сделать, чтобы Эксель не округлял числа
- Причины
- Что делать
- Вариант №1
- Вариант №2
- Вариант №3
- Устранение сбоя
- Что еще попробовать
- Вы не умеете работать с транзакциями
- Почему надо бить тревогу
- Что такое транзакции в 1С
- Объектные блокировки
- А теперь про транзакции
- Размазывание транзакций по методам
- Пытаемся исправить код
- Первый подход типичного 1С-ника
- Методы работы с транзакциями в 1С
- Финальный вариант
- Чек-лист рефакторинга
- В заключение
Не работает приложение на Android. Что делать
Android – операционная система чрезвычайно многогранная, а потому и проблемы, с которой сталкиваются её пользователи, зачастую не имеют универсального решения. Даже такая банальная ситуация, как сбои в работе установленных приложений, может быть решена несколькими разными способами. Сказывается и фрагментация, к которой привело обилие разных версий ОС и кастомных оболочек, зачастую функционирующих совершенно не так, как чистый Android, и подход самой Google к наполнению Google Play софтом, который многие разработчики не адаптируют даже под самые популярные устройства, не говоря уже об аппаратах от малоизвестных брендов.
Не работают приложения на Android? У этого может быть сотня причин и примерно столько же способов решить проблему. Но мы предлагаем лишь основные
Как удалить кэш приложения на Android
Несмотря на то что сам я никогда не чищу кэш на Android, ходят легенды, что иногда – в ночь на Ивана Купала – он может переполняться и препятствовать запуску приложений. Конечно, это мало похоже на правду, да и у меня за почти десятилетнюю практику использования Android такого никогда не было. Однако Google рекомендует перво-наперво очистить кэш, если вдруг вы обнаружили, что приложение, которое вчера работало, сегодня вдруг не запускается или работает со сбоями, например, испытывая самопроизвольные вылеты.
- Для этого перейдите в «Настройки» — «Приложения»;
- Отыщите в списке нужное и откройте его страничку;
- Оттуда перейдите во вкладку «Память» и нажмите «Очистить кэш».
Некоторые приложения из AppGallery от Huawei не работают без Google Play
Лично мне такой метод ни разу не помогал, но Google настойчиво пихает его во все свои инструкции, а потому пренебрегать им я не посмел. Однако, если этот метод вам не помог, и вы хотите отыскать что-то более действенное, читайте дальше.
Как сбросить данные приложения на Android
Если после удаления кэша проблема не исчезла, а приложение как не запускалось, так и не запускается, вернитесь в ту же вкладку и попробуйте выполнить сброс данных. Как по мне, это более эффективный способ, однако – предупреждаю сразу – сработает он только в том случае, если вы уже какое-то время пользовались приложением. Со свежеустановленным софтом такой номер, скорее всего, не прокатит, поскольку у них ещё и сбрасывать-то нечего. Но поскольку помешать вам я не смогу в любом случае, пробуйте.
- Перейдите в «Настройки» — «Приложения»;
- Отыщите нужное приложение и откройте его страничку;
- Оттуда перейдите в раздел «Память» и нажмите «Сброс».
Появились фальшивые приложения, которые обещают показать больных коронавирусом
Данное действие удалит все данные приложения, включая сохранённые файлы, базы данных, настройки, аккаунты и прочие сведения, будут удалены, что, по сути, вернёт его к изначальному виду. При этом удаления самой программы не произойдёт, просто всё будет выглядеть так, как будто вы установили её впервые. Мне, кажется, данный способ помог только однажды, и то – лишь с приложением, которое я скачал из интернета в виде APK-файла. А для тех, которые скачиваются из Google Play, есть и другие методы.
Не запускается приложение. Как исправить
- Например, удаление и повторная установка. Как ни странно, но этот способ является самым эффективным из всех. Из-за постоянных экспериментов Google с методами загрузки софта, который разработчики делят на несколько компонентов, скачиваемых последовательно, иногда установка может производиться некорректно. Поэтому проще всего будет удалить приложение со смартфона, перейти в Google Play и скачать его повторно. Этот способ работает даже на iOS, что и говорить про Android.
- На всякий случай также могу предложить попробовать скачать приложение в виде APK-файла из APKMirror и APKPure – просто откройте любой из этих сайтов, вбейте в поиске название приложения, скачайте его и установите. Оно встанет ровно так же, как если бы вы скачали его из Google Play. Понятия не имею, как это работает, но иногда одна и та же программа могла не работать после загрузки из Google Play, и при этом совершенно исправно функционировала, если я скачивал её со сторонних ресурсов. Правда, перед этим нужно разрешить загрузку из ненадёжных источников, ну и помните, что это может быть небезопасно.
- Обновление тоже можно смело добавить в список эффективных способов. Я самолично столкнулся с этим на прошлой неделе, когда тестировал 3D-животных из Google на своём Honor View 20. Поначалу трёхмерный зверинец ни в какую не запускался, и я было решил, что дело в блокировках Google. Однако после того как я установил свежее обновление Chrome, всё заработало. Поэтому могу смело рекомендовать данный способ и вам. Просто перейдите в Google Play – «Мои приложения и игры» — «Обновления» и скачайте последний апдейт для проблемного приложения.
Как Google блокирует свои приложения и сервисы на смартфонах Huawei
Если ни один из описанных выше способов вам не помогает – а такое вполне может быть, — очевидно, что проблема на стороне разработчика. Практика показывает, что это случается чаще всего, в чём можно убедиться, почитав отзывы. Поэтому, если вам позарез нужно восстановить функциональность приложения, перейдите на его страницу в Google Play, найдите контакты разработчика и сообщите ему о проблеме. Я практически уверен в том, что ваше обращение не останется без внимания, поскольку разработчик в первую очередь заинтересован в том, чтобы его продукт работал исправно и приносил ему деньги.
Источник
Не работает поиск в Excel: в чем проблема?
Не работает поиск в Excel
Windows 11
Не отображается текст в ячейке Excel
Как отобразить строки в Excel
Как закрыть Эксель, если не закрывается
Как сделать, чтобы Эксель не округлял числа
Не работает поиск в Excel? Снимите защиту с листа, введите поисковую фразу меньше 255 символов, жмите на «Найти далее», а не на «Найти все». Проверьте правильность установленного значения, обнулите поиск по формату или переустановите Эксель при наличии проблем с программой. Ниже подробно рассмотрим, в чем могут быть причины подобных сбоев, и как их самостоятельно решить.
Причины
В документах Excel, состоящих из множества полей, часто приходится использовать опцию поиска. Это очень удобно и позволяет быстро отыскать интересующий фрагмент. Но бывают ситуации, когда воспользоваться этой функцией не удается. Для решения проблемы нужно знать, почему в Экселе не работает поиск, и какие шаги предпринять для восстановления работоспособности.
К основным объяснениям возможных сбоев стоит отнести:
- Большая длина фразы, объем которой более 255 символов. Такая проблема возникает редко.
- На листе установлена защита, которая не дает вызвать нужную функцию.
- Для ячеек установлен параметры «Скрывать формулы», а областью поиска являются «формулы».
- Пользователь задает «Найти далее» вместо «Найти все». В таком случае выделения просто не будет видно.
- Ошибки в задании области поиска. К примеру, установлен параметр «Значения», а нужно просмотреть необходимые формулы.
- Установлен параметр «Ячейка целиком», а на практике поисковый запрос не имеет совпадения со значением секции. Нужно снять отметку «Ячейка целиком».
- Задан показатель по формату или не обнулен после прошлого поиска.
- Проблемы с Эксель и необходимость переустановки программы.
Это основные причины, почему не работает поиск в Эксель. Но все проблемы легко решаются, если знать, как действовать.
Что делать
Для начала вспомним, как правильно работает поиск в Excel. На выбор пользователям доступно несколько вариантов.
- Жмите на «Главная».
- Выберите «Найти и выделить».
- Кликните «Найти …».
- Введите символы для поиска.
- Жмите «Найти далее / все».
В первом случае указывается первый интересующий фрагмент с возможностью перемещения к следующему, а во втором — весь список.
Способ №2 (по интервалу):
- Выделите нужную область ячеек в Excel.
- Жмите Ctrl+F на клавиатуре.
- Введите нужный запрос и действуйте по рассмотренному выше методу.
Способ №3 (расширенный):
- Войдите в «Найти и заменить».
- Жмите на «Параметры».
- Выберите инструменты для поиска.
- Жмите на кнопку подтверждения.
Если вы все сделали правильно, но все равно не работает поиск в Эксель, попробуйте следующие шаги:
- Убедитесь, что количество введенных символов меньше 255. В ином случае функция не работает.
- Снимите защиту с листа Excel. Для этого войдите в «Файл», а далее «Сведения» и «Снять защиту листа». В случае, если установлен пароль, его необходимо ввести в диалоговом окне и подтвердить.
- Снимите параметр «Скрывать формулы» для ячейки и попробуйте запустить процесс в Excel еще раз.
- Задайте разные варианты поиска в Excel. Если не работает «Найти все», проверьте «Найти далее».
- Снимите отметку с пункта «Ячейка целиком».
В некоторых случаях не работает поиск в Экселе, и появляется ошибка #Знач! В таком случае можно использовать одно из следующих решений.
Вариант №1
Бывают ситуации, когда исковый текст не удалось найти и появляется ошибка. В таком случае убедитесь, что слово введено правильно с учетом регистра и вводимых символов.
Вариант №2
Попробуйте удалить аргумент «нач_позиция», если в нем нет необходимости, или присвойте ему правильный параметр.
Вариант №3
Для определения числа символов в текстовой строке применяйте опцию ДЛСТР. При этом задайте правильный поисковый параметр.
Устранение сбоя
Распространенная причина, почему Эксель не ищет, и не работает поиск в программе — сбой софта. Это может выражаться зависанием, отсутствием ответа или прекращением работы. В таком случае попробуйте следующие решения:
- Запустите Excel в безопасном режиме и убедитесь, что он нормально работает. Для этого жмите и удерживайте Ctrl при запуске софта. В этом случае ПО пропускает ряд функций и параметров, которые могут привести к сбоям в работе. Если проблему не удалось решить путем запуска в безопасном режиме, переходите к следующему пункту. В ином случае отключите лишние настройки.
- Установите последние обновления, которые могут помочь с устранением проблемы.
- Убедитесь, что офис Excel не пользуется другим процессом. Эта информация должна быть в нижней части окна. Для устранения проблемы попробуйте закрыть посторонние процессы, а после этого снова проверьте, работает ли опция поиска.
- Полностью удалите, а после этого поставьте программу Excel снова. Зачастую этот метод помогает, если Excel не ищет или не работает по какой-то причине.
Кроме рассмотренных выше, можно попробовать другие варианты. К примеру, попробуйте поменять область поиска с помощью дополнительных параметров. Бывают ситуации, когда пользователь ищет по формулам, а нужный текст находится в результате формул.
Что еще попробовать
Если опция так и не работает в Excel, попробуйте дополнительные рекомендации:
- Убедитесь, что у вас правильная раскладка и вы действительно нажимаете Ctrl+F.
- Проверьте размер документа. Функция иногда зависает и не работает, если ПК / ноутбуку не хватает оперативной памяти из-за большого объема работы.
- Проверьте устройство на вирусы. Возможно, проблема возникает из-за вредоносного ПО.
- Попробуйте установить более новую версию Excel. При этом старый вариант желательно полностью удалить и почистить остатки.
- Убедитесь, что вы задаете правильные расширенные варианты поиска.
Существует много причин, почему вдруг Эксель не ищет, и функция не работает. Чаще всего это связано с невнимательностью пользователя и ошибками поиска. Иногда причиной являются сбои программы, что может потребовать полного удаления старого и установки нового софта.
В комментариях расскажите, какой из предложенных вариантов вам помог, и какие еще методы можно использовать для восстановления нормальной работоспособности Excel.
Источник
Вы не умеете работать с транзакциями
Заголовок вышел броским, но накипело. Сразу скажу, что речь пойдет об 1С. Дорогие 1С-ники, вы не умеете работать с транзакциями и не понимаете что такое исключения. К такому выводу я пришел, просматривая большое количество кода на 1С, рождаемого в дебрях отечественного энтерпрайза. В типовых конфигурациях с этим все достаточно хорошо, но ужасающее количество заказного кода написано некомпетентно с точки зрения работы с базой данных. Вы когда-нибудь видели у себя ошибку «В данной транзакции уже происходили ошибки»? Если да — то заголовок статьи относится и к вам. Давайте под катом разберемся, наконец, что такое транзакции и как правильно с ними обращаться, работая с 1С.
Почему надо бить тревогу
Для начала, давайте разберемся, что же такое представляет собой ошибка «В данной транзакции уже происходили ошибки». Это, на самом деле, предельно простая штука: вы пытаетесь работать с базой данных внутри уже откаченной (отмененной) транзакции. Например, где-то был вызван метод ОтменитьТранзакцию, а вы пытаетесь ее зафиксировать.
Почему это плохо? Потому что данная ошибка ничего не говорит вам о том, где на самом деле случилась проблема. Когда в саппорт от пользователя приходит скриншот с таким текстом, а в особенности для серверного кода, с которым интерактивно не работает человек — это… Хотел написать «критичная ошибка», но подумал, что это buzzword, на который уже никто не обращает внимания…. Это задница. Это ошибка программирования. Это не случайный сбой. Это косяк, который надо немедленно переделывать. Потому что, когда у вас фоновые процессы сервера встанут ночью и компания начнет стремительно терять деньги, то «В данной транзакции уже происходили ошибки» это последнее, что вы захотите увидеть в диагностических логах.
Есть, конечно, вероятность, что технологический журнал сервера (он ведь у вас включен в продакшене, да?) как-то поможет диагностировать проблему, но я сейчас навскидку не могу придумать вариант — как именно в нем найти реальную причину указанной ошибки. А реальная причина одна — программист Вася получил исключение внутри транзакции и решил, что один раз — не карабас «подумаешь, ошибка, пойдем дальше».
Что такое транзакции в 1С
Неловко писать про азбучные истины, но, видимо, немножго придется. Транзакции в 1С — это то же самое, что транзакции в СУБД. Это не какие-то особенные «1С-ные» транзакции, это и есть транзакции в СУБД. Согласно общей идее транзакций, они могут либо выполниться целиком, либо не выполниться совсем. Все изменения в таблицах базы данных, выполненные внутри транзакции, могут быть разом отменены, как будто ничего не было.
Далее, нужно понимать, что в 1С не поддерживаются вложенные транзакции. Собственно говоря, они не поддерживаются не «в 1С», а вообще не поддерживаются. По-крайней мере, теми СУБД, с которыми умеет работать 1С. Вложенных транзакций, например, нет в MS SQL и Postgres. Каждый «вложенный» вызов НачатьТранзакцию просто увеличивает счетчик транзакций, а каждый вызов «ЗафиксироватьТранзакцию» — уменьшает этот счетчик. Данное поведение описано в множестве книжек и статей, но выводы из этого поведения, видимо, разобраны недостаточно. Строго говоря, в SQL есть т.н. SAVEPOINT, но 1С их не использует, да и вещь это достаточно специфичная.
Здесь и далее, специально для Воинов Истинной Веры, считающих, что код должен писаться только на английском, под спойлерами будет приведен аналог кода в англоязычном синтаксисе 1С.
На самом деле, нет. Мне совершенно не хочется дублировать примеры на английском только ради того, чтобы потешить любителей холиваров и священных войн.
Вы же наверняка пишете такой код, да? Приведенный пример кода содержит ошибки. Как минимум, три. Знаете какие? Про первую я скажу сразу, она связана с объектными блокировками и не имеет отношения непосредственно к транзакциям. Про вторую — чуть позже. Третья ошибка — это deadlock, который возникнет при параллельном исполнении этого кода, но это тема для отдельной статьи, ее рассматривать сейчас не будем, дабы не усложнять код. Ключевое слово для гугления: deadlock управляемые блокировки.
Обратите внимание, простой ведь код. Такого в ваших 1С-системах просто вагон. И он содержит сразу, как минимум, 3 ошибки. Задумайтесь на досуге, сколько ошибок есть в более сложных сценариях работы с транзакциями, написанных вашими программистами 1С 🙂
Объектные блокировки
Итак, первая ошибка. В 1С существуют объектные блокировки, так называемые «оптимистические» и «пессимистические». Кто придумал термин, не знаю, убил бы :). Совершенно невозможно запомнить, какая из них за что отвечает. Подробно про них написано здесь и здесь, а также в прочей IT-литературе общего назначения.
Суть проблемы в том, что в указанном примере кода изменяется объект базы данных, но в другом сеансе может сидеть интерактивный пользователь (или соседний фоновый поток), который тоже будет менять этот объект. Здесь один из вас может получить ошибку «запись была изменена или удалена». Если это произойдет в интерактивном сеансе, то пользователь почешет репу, ругнется и попробует переоткрыть форму. Если это произойдет в фоновом потоке, то вам придется искать это в логах. А журнал регистрации, как вы знаете, медленный, а ELK-стек для журналов 1С у нас в отрасли настраивают единицы… (мы, к слову, входим в число тех, кто настраивает и другим помогает настраивать :))
Короче говоря, это досадная ошибка и лучше, чтобы ее не было. Поэтому, в стандартах разработки четко написано, что перед изменением объектов необходимо ставить на них объектную блокировку методом «ОбъектСправочника.Заблокировать()«. Тогда параллельный сеанс (который тоже должен так поступить) не сможет начать операцию изменения и получит ожидаемый, управляемый отказ.
А теперь про транзакции
С первой ошибкой разобрались, давайте перейдем ко второй.
Если не предусмотреть проверку исключения в этом методе, то исключение (например, весьма вероятное на методе «Записать()») выбросит вас из данного метода без завершения транзакции. Исключение из метода «Записать» может быть выброшено по самым разным причинам, например, сработают какие-то прикладные проверки в бизнес-логике, или возникнет упомянутая выше объектная блокировка. Так или иначе, вторая ошибка гласит: код, начавший транзакцию, не несет ответственность за ее завершение.
Именно так я бы назвал эту проблему. В нашем статическом анализаторе кода 1С на базе SonarQube мы даже отдельно встроили такую диагностику. Сейчас я работаю над ее развитием, и фантазия программистов 1С, чей код попадает ко мне на анализ, порой приводит меня в шок и трепет…
Почему? Потому что выброшенное наверх исключение внутри транзакции в 90% случаев не даст эту транзакцию зафиксировать и приведет к ошибке. Следует понимать, что 1С автоматически откатывает незавершенную транзакцию только после возвращения из скриптового кода на уровень кода платформы. До тех пор, пока вы находитесь на уровне кода 1С, транзакция остается активной.
Поднимемся на уровень выше по стеку вызовов:
Смотрите, что получается. Наш проблемный метод вызывается откуда-то извне, выше по стеку. На уровне этого метода разработчик понятия не имеет — будут ли какие-то транзакции внутри метода ОченьПолезныйИВажныйКод или их не будет. А если будут — то будут ли они все завершены… Мы же все тут за мир и инкапсуляцию, верно? Автор метода «ВажныйКод» не должен думать про то, что именно происходит внутри вызываемого им метода. Того самого, в котором некорректно обрабатывается транзакция. В итоге, попытка поработать с базой данных после выброса исключения изнутри транзакции, с высокой вероятностью приведет к тому, что «В данной транзакции бла-бла…»
Размазывание транзакций по методам
Второе правило «транзакционно-безопасного» кода: счетчик ссылок транзакций в начале метода и в его конце должен иметь одно и то же значение. Нельзя начинать транзакцию в одном методе и завершать ее в другом. Из этого правила, наверное, можно найти исключения, но это будет какой-то низкоуровневый код, который пишут более компетентные люди. В общем случае так писать нельзя.
Выше — неприемлемый говнокод. Нельзя писать методы так, чтобы вызывающая сторона помнила и следила за возможными (или вероятными — как знать) транзакциями внутри других методов, которые она вызывает. Это нарушение инкапсуляции и разрастание спагетти-кода, который невозможно трассировать, сохраняя рассудок.
Особенно весело вспомнить, что реальный код намного больше синтетических примеров из 3-х строчек. Выискивать начинающиеся и завершающиеся транзакции по шести уровням вложенности — это прям мотивирует на задушевные беседы с авторами.
Пытаемся исправить код
Вернемся к исходному методу и попытаемся его починить. Сразу скажу, что объектную блокировку мы чинить пока не будем, просто, чтобы не усложнять код примера.
Первый подход типичного 1С-ника
Обычно программисты 1С знают, что при записи может быть выдано исключение. А еще они боятся исключений, поэтому стараются их все перехватывать. Например, вот так:
Ну как, стало лучше, да? Ведь теперь, возможные ошибки записи обрабатываются и даже логируются. Исключения больше не возникнут при записи объекта. И в логе даже видно — на каком объекте, не поленился, вывел в сообщение ссылку вместо лаконичного «Ошибка записи справочника», как это часто любят писать вечно торопящиеся разработчики. Иными словами, налицо забота о пользователе и рост компетенций.
Однако, опытный 1С-ник здесь скажет, что нет, лучше не стало. По сути ничего не поменялось, а может даже стало и хуже. В методе «Записать()» платформа 1С сама начнет транзакцию записи, и эта транзакция будет уже вложенной по отношению к нашей. И если в момент работы с базой данных 1С свою транзакцию откатит (например, будет выдано исключение бизнес-логики), то наша транзакция верхнего уровня все равно будет помечена как «испорченная» и ее нельзя будет зафиксировать. В итоге этот код так и останется проблемным, и при попытке фиксации выдаст «уже происходили ошибки».
А теперь представьте, что речь идет не о маленьком методе, а о глубоком стеке вызовов, где в самом низу кто-то взял и «выпустил» начатую транзакцию из своего метода. Верхнеуровневые процедуры могут и понятия не иметь, что кто-то там внизу начинал транзакции. В итоге, весь код валится с невнятной ошибкой, которую расследовать невозможно в принципе.
Код, который начинает транзакцию, обязан завершить или откатить ее. Не взирая ни на какие исключения. Каждая ветка кода должна быть исследована на предмет выхода из метода без фиксации или отмены транзакции.
Методы работы с транзакциями в 1С
Не будет лишним напомнить, что вообще 1С предоставляет нам для работы с транзакциями. Это всем известные методы:
- НачатьТранзакцию()
- ЗафиксироватьТранзакцию()
- ОтменитьТранзакцию()
- ТранзакцияАктивна()
Первые 3 метода очевидны и делают то, что написано в их названии. Последний метод — возвращает Истину, если счетчик транзакций больше нуля.
И есть интересная особенность. Методы выхода из транзакции (Зафиксировать и Отменить) выбрасывают исключения, если счетчик транзакций равен нулю. То есть, если вызвать один из них вне транзакции, то возникнет ошибка.
Как правильно пользоваться этими методами? Очень просто: надо прочитать сформулированное выше правило: код, начавший транзакцию, должен нести ответственность за ее завершение.
Как же соблюсти это правило? Давайте попробуем:
Выше мы уже поняли, что метод ДелаемЧтоТо — потенциально опасен. Он может выдать какое-то исключение, и транзакция «вылезет» наружу из нашего метода. Окей, добавим обработчик возможного исключения:
Отлично, мы поймали возникающую ошибку, но что с ней делать? Записать сообщение в лог? Ну, может быть, если код логирования ошибок должен быть именно на этом уровне и ошибку мы тут ждем. А если нет? Если мы не ожидали тут никаких ошибок? Тогда мы должны просто передать это исключение выше, пусть с ними разбирается другой слой архитектуры. Делается это оператором «ВызватьИсключение» без аргументов. В этих ваших джава-сиплюсплюсах это делается точно так же оператором throw.
Так, стоп… Если мы просто прокидываем исключение дальше, то зачем тут вообще нужна Попытка? А вот зачем: правило заставляет нас обеспечить завершение начатой нами транзакции.
Теперь, вроде бы, красиво. Однако, мы ведь помним, что не доверяем коду ДелаемЧтоТо(). Вдруг там внутри его автор не читал этой статьи, и не умеет работать с транзакциями? Вдруг он там взял, да и вызвал метод ОтменитьТранзакцию или наоборот, зафиксировал ее? Нам очень важно, чтобы обработчик исключения не породил нового исключения, иначе исходная ошибка будет потеряна и расследование проблем станет невозможным. А мы помним, что методы Зафиксировать и Отменить могут выдать исключение, если транзакция не существует. Здесь-то и пригождается метод ТранзакцияАктивна.
Финальный вариант
Наконец, мы можем написать правильный, «транзакционно-безопасный» вариант кода. Вот он:
**UPD: в комментариях предложен более безопасный вариант, когда ЗафиксироватьТранзакцию расположен внутри блока Попытка. Здесь приведен именно этот вариант, ранее Фиксация располагалась после блока Попытка-Исключение.
Постойте, но ведь не только «ОтменитьТранзакцию» может выдавать ошибки. Почему же тогда «ЗафиксироватьТранзакцию» не обернут в такое же условие с «ТранзакцияАктивна»? Опять же, по тому же самому правилу: код, начавший транзакцию, должен нести ответственность за ее завершение. Наша транзакция необязательно самая первая, она может быть вложенной. На нашем уровне абстракции мы обязаны заботиться только о нашей транзакции. Все прочие должны быть нам неинтересны. Они чужие, мы не должны нести за них ответственность. Именно НЕ ДОЛЖНЫ. Нельзя предпринимать попыток выяснения реального уровня счетчика транзакций. Это опять нарушит инкапсуляцию и приведет к «размазыванию» логики управления транзакциями. Мы проверили активность только в обработчике исключения и только для того, чтобы убедиться, что наш обработчик не породит нового исключения, «прячущего» старое.
Чек-лист рефакторинга
Давайте рассмотрим несколько наиболее распространенных ситуаций, требующих вмешательства в код.
Паттерн:
Обернуть в «безопасную» конструкцию с Попыткой, Проверкой активности и пробросом исключения.
Паттерн:
Анализ и Рефакторинг. Автор не понимал, что делает. Начинать вложенные транзакции можно безопасно. Не нужно проверять условие, нужно просто начать вложенную транзакцию. Ниже по модулю он наверняка еще там извращается с их фиксацией. Это гарантированный геморрой.
Примерно похожий вариант:
аналогично: фиксация транзакции по условию — это странно. Почему тут условие? Что, кто-то иной мог уже зафиксировать эту транзакцию? Повод для разбирательства.
Паттерн:
- ввести управляемую блокировку во избежание deadlock
- ввести вызов метода Заблокировать
- обернуть в «попытку», как показано выше
Паттерн:
Данная транзакция уже не завершится в случае исключения. Нет смысла продолжать цикл. Код требуется переписать, сверяясь с исходной задачей. Дополнительно обеспечить более информативное сообщение об ошибке.
В заключение
Я, как вы уже, наверное, догадались, отношусь к людям, любящим платформу 1С и разработку на ней. К платформе, разумеется, есть претензии, особенно в среде Highload, но в общем и целом, она позволяет недорого и быстро разрабатывать очень качественные корпоративные приложения. Давая из коробки и ORM, и GUI, и веб-интерфейс, и Reporting, и много чего еще. В комментариях на Хабре обычно пишут всякое высокомерное, так вот, ребята — основная проблема 1С, как экосистемы — это не платформа и не вендор. Это слишком низкий порог вхождения, который позволяет попадать в отрасль людям, не понимающим, что такое компьютер, база данных, клиент-сервер, сеть и всякое такое. 1С сделала разработку корпоративных приложений слишком легкой. Я за 20 минут могу написать на ней учетную систему для закупок/продаж с гибкими отчетами и веб-клиентом. После этого, мне несложно подумать о себе, что и на больших масштабах можно писать примерно так же. Как-то там 1С сама все внутри сделает, не знаю как, но наверное сделает. Напишу-ка я «НачатьТранзакцию()».
И знаете — самое главное, что это прекрасно. Простота разработки в 1С позволяет моментально реализовывать бизнес-идеи и встраивать их в процессы компании. Потом всегда можно отрефакторить, главное понимать как. И если вдруг вам нужна помощь в аудите вашей «медленной 1С» — обращайтесь к специалистам по оптимизации. Она совсем не медленная.
Источник