В практике разработчика 1С иногда возникают ситуации, которые кажутся магическими или абсолютно нелогичными. Вы пишете стандартный код, проверяете его, и вдруг программа начинает «падать» с ошибкой «Аварийное завершение работы». Причем это происходит не только при выполнении вашего кода, но и просто при запуске базы. Рассмотрим подобную ситуацию, проанализируем возможные причины и разберем способы решения этой критической проблемы.
Представим ситуацию: в расширении для конфигурации «1С:Комплексная автоматизация 2» (или аналогичной на управляемых формах) создается обработчик события ПриСозданииНаСервере. Код предназначен для проверки соответствия назначений в «Заказе поставщику» и «Заказе клиента» при создании документа «Заявка на расходование ДС».
Разберем фрагмент кода, который вызвал подозрения у автора:
&НаСервере
Процедура ДААПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверяем тип документа-основания
ДокументТип = ТипЗнч(Объект.ДокументОснование);
Если ДокументТип = Тип("ДокументСсылка.ЗаказПоставщику") Тогда
// Обращаемся к табличной части документа-основания
Таб = Объект.ДокументОснование.Товары;
Для Каждого Товар Из Таб Цикл
НомерСтр = Товар.НомерСтроки;
// Сравниваем реквизиты "Назначение"
Если НомерСтр = 1 И
Товар.Назначение <> Объект.ДокументОснование.ДокументОснование.Назначение Тогда
Сообщить("НАЗНАЧЕНИЕ в заказе клиента и заказе поставщику различается!!!");
КонецЕсли;
// Прерываем цикл после первой итерации для оптимизации
Прервать;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
На первый взгляд, код выглядит корректным для учебной или простой проверочной задачи. Однако, как отмечают опытные участники обсуждения, при написании такого кода важно учитывать следующие моменты:
Объект.ДокументОснование.Товары) необходимо убедиться, что ссылка не является пустой. Проверка типа ТипЗнч(Объект.ДокументОснование) вернет Истина даже для пустой ссылки конкретного типа, но обращение к ее данным может вызвать замедление или ошибки.Объект.ДокументОснование.ДокументОснование.Назначение — это так называемое «обращение через две точки». В клиент-серверном варианте это приводит к неявному получению объектов из базы данных, что может негативно сказаться на производительности, но само по себе не должно приводить к «крашу» платформы.Проанализируем ситуацию дальше: автор утверждает, что даже после комментирования всего кода программа продолжает закрываться аварийно. Это явный признак того, что проблема кроется глубже, чем в синтаксисе или логике конкретной процедуры.
Прежде чем переходить к глобальным причинам, разберем стандартные шаги, которые должен предпринять администратор или разработчик при возникновении «Аварийного отказа»:
%AppData%\Local\1C\1cv8.1cv8.exe запись может не успеть сформироваться.Рассмотрим ключевой момент обсуждения: проблема возникла массово у разных пользователей на разных конфигурациях и версиях платформы (8.3.16.1876, 8.3.17.1851, 8.3.18.1334). Это указывает на внешнюю причину, не связанную с локальным кодом.
Выясним причину: в платформу 1С встроен механизм проверки правомерности использования. Этот механизм периодически связывается с серверами компании «1С» через интернет. В середине мая 2022 года на стороне этих серверов (или в логике обработки их ответов платформой) произошел сбой. Когда программа пыталась отправить запрос на проверку лицензии и получала некорректный ответ (или не получала его вовсе в определенном формате), срабатывал защитный триггер, который мгновенно завершал работу приложения без объяснения причин.
Именно поэтому «краш» происходил «через раз» или сразу при запуске — программа просто пыталась выполнить фоновую проверку в момент обращения к интернет-ресурсам.
Если вы столкнулись с подобным поведением системы, когда вчера всё работало, а сегодня база «падает» при запуске на разных рабочих местах, выполните следующие действия:
Фирма «1С» оперативно выпустила исправления для всех актуальных веток платформы. Для устранения ошибки необходимо обновить 1С:Предприятие до версий не ниже указанных:
Если оперативно обновить платформу на всех серверах и рабочих станциях невозможно, можно применить «обходной маневр». Суть метода заключается в том, чтобы запретить программе обращаться к серверам проверки лицензии. Без ответа от сервера (при полной невозможности соединения) платформа в некоторых режимах может продолжать работу, считая, что интернета просто нет.
Проанализируем техническую реализацию: в файле hosts (находится в C:\Windows\System32\drivers\etc\hosts) на стороне клиента или терминального сервера можно прописать перенаправление запросов на локальный адрес 127.0.0.1 для доменов, отвечающих за проверку. Обычно это 1c-pro.ru и verify.1c.ru.
Для некоторых типовых конфигураций фирма «1С» выпускала специальные расширения-патчи, которые отключали проблемные вызовы функций проверки в коде конфигурации (если они были инициированы прикладным решением, а не только ядром платформы).
Проанализировав ситуацию, мы видим, что не всегда ошибка в работе программы вызвана действиями программиста. В данном случае написание кода в ПриСозданииНаСервере просто совпало по времени с активацией ошибки в механизме защиты платформы.
Основные выводы для будущего:
1cv8.exe.