Почему 1С:ERP после обновления ошибочно определяет внутреннего пользователя как внешнего и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием
← На главную

При работе с системой 1С:ERP, особенно в условиях использования нетиповых конфигураций или расширений, разработчики и администраторы часто сталкиваются с неожиданными изменениями в поведении системы после очередного обновления. Одной из таких проблем, способной вызвать затруднения и остановку работы, является ошибочное определение системой внутреннего пользователя как "внешнего". В данном материале мы подробно разберем, почему это происходит, как обнаружить такую проблему и какие шаги предпринять для ее решения, опираясь на опыт коллег и рекомендации экспертов.

Анализ исходной проблемы и причины возникновения ошибки

Предположим, у нас есть нетиповая конфигурация 1С:ERP, в которой активно используются расширения. В одном из модулей приложения присутствует код, который проверяет текущего пользователя, например, на наличие определенной строки в его имени. В нашем случае это выглядит так:


Если СтрНайти(ПользователиКлиентСервер.ТекущийПользователь,"Сканер")<>0 Тогда
    // ... дальнейшая логика ...
КонецЕсли;

После обновления конфигурации на один релиз выше (например, с одной версии 2.4.хх на другую или с 2.4.хх на 2.5.хх), этот, казалось бы, безобидный код начинает падать с ошибкой, указывающей на то, что АвторизованныйПользователь = Неопределено или что текущий пользователь вдруг стал внешним. При этом важно отметить, что сам код в расширении после обновления не меняется, и без него система запускается и работает стабильно. Это указывает на то, что проблема кроется не в самом коде, а в изменении поведения базовых механизмов платформы или библиотеки стандартных подсистем (БСП).

Давайте выясним, почему такое может происходить:

  1. Изменения в работе с пользователями в новой версии платформы или БСП: При переходе между версиями 1С, особенно с 2.4 на 2.5, могут меняться механизмы определения текущего пользователя. Версия 2.5 обладает расширенными возможностями и улучшенным функционалом по сравнению с 2.4, и это может включать пересмотр способов идентификации пользователей. Если ранее ПользователиКлиентСервер.ТекущийПользователь надежно возвращал объект внутреннего пользователя, то в новой версии он может начать возвращать Неопределено, если система не смогла однозначно определить тип пользователя, или же ссылка теперь указывает на внешний справочник пользователей.
  2. Особенности работы расширений: Нетиповая конфигурация и расширения могут быть несовместимы с изменениями в обновленной версии платформы. Расширения, которые работают с областями памяти или механизмами, подвергшимися изменениям, могут перестать работать корректно, требуя доработки. В нашем случае, расширение использует функцию, которая теперь возвращает другой результат, что приводит к ошибке.
  3. Некорректная синхронизация списков пользователей: В редких случаях после обновления может произойти рассинхронизация между списками пользователей в режиме 1С:Предприятие и в конфигураторе. Это может привести к тому, что система не сможет найти нужного пользователя по его внутреннему идентификатору или типу.
  4. Настройки прав доступа: Иногда у пользователя, для которого настраивается подключение к информационной базе, не хватает прав на запуск определенных операций, что косвенно может влиять на механизмы определения пользователя, особенно при использовании внешних соединений (например, COM-соединения).

Основное решение проблемы: Использование ПараметрыСеанса

Как показали практические наблюдения и опыт коллег, наиболее эффективным и быстрым решением данной проблемы является получение объекта текущего пользователя через ПараметрыСеанса. Этот механизм зачастую оказывается более стабильным при изменениях в базовых подсистемах, так как ПараметрыСеанса инициализируются на старте сеанса и хранят информацию, которая уже была определена и проверена системой.

Давайте рассмотрим, как мы можем модифицировать наш проблемный код:

  1. Исходный код, вызывающий ошибку:
  2. 
    Если СтрНайти(ПользователиКлиентСервер.ТекущийПользователь,"Сканер")<>0 Тогда
        // ...
    КонецЕсли;
    

    Здесь ПользователиКлиентСервер.ТекущийПользователь может стать Неопределено или вернуть некорректную ссылку.

  3. Модифицированный код с использованием ПараметрыСеанса:
  4. 
    // Получаем текущего пользователя из ПараметровСеанса
    ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
        
    Если ТекущийПользователь <> Неопределено Тогда
        Если СтрНайти(ТекущийПользователь.Наименование,"Сканер")<>0 Тогда
            // ... ваша логика ...
        КонецЕсли;
    КонецЕсли;
    

    В этом примере мы сначала получаем объект текущего пользователя из ПараметрыСеанса. Важно также проверить, что полученный объект не Неопределено, прежде чем обращаться к его свойствам, таким как Наименование. Это повышает отказоустойчивость кода.

Преимущества использования ПараметрыСеанса.ТекущийПользователь:

Альтернативные и рекомендуемые функции для работы с пользователями в 1С

Помимо использования ПараметрыСеанса.ТекущийПользователь, в системе 1С существуют и другие функции для работы с пользователями, каждая из которых имеет свою специфику и область применения. Давайте разберем их, чтобы вы могли выбрать наиболее подходящий вариант для вашей задачи:

1. Функция Пользователи.АвторизованныйПользователь()

Для определения текущего пользователя, который может быть как внутренним (из справочника Пользователи), так и внешним (из справочника ВнешниеПользователи), рекомендуется использовать функцию Пользователи.АвторизованныйПользователь(). Эта функция возвращает ссылку на один из этих справочников в зависимости от того, кто выполнил вход в сеанс. Если вашему коду необходимо различать внутренних и внешних пользователей, это хороший выбор.


ТекущийАвторизованныйПользователь = Пользователи.АвторизованныйПользователь();
Если ТипЗнч(ТекущийАвторизованныйПользователь) = Тип("СправочникСсылка.Пользователи") Тогда
    // Работаем с внутренним пользователем
ИначеЕсли ТипЗнч(ТекущийАвторизованныйПользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда
    // Работаем с внешним пользователем
КонецЕсли;

2. Функция Пользователи.Текущий()

В общем случае, для программного определения текущего пользователя в 1С используется функция Пользователи.Текущий(). Она возвращает объект типа "Пользователь". Если пользователь не зарегистрирован или является анонимным, функция вернет Неопределено. Однако, как упомянуто в контексте нашей проблемы, эта функция может некорректно определять пользователя как внешнего или вовсе возвращать Неопределено после обновления, поэтому к ее использованию следует относиться с осторожностью в проблемных местах.


ТекущийПользовательИнформационнойБазы = Пользователи.Текущий();
Если ТекущийПользовательИнформационнойБазы <> Неопределено Тогда
    // Получили объект пользователя информационной базы
КонецЕсли;

3. Функция ПользователиИнформационнойБазы.ТекущийПользователь()

Данная функция также предназначена для получения объекта пользователя информационной базы. Она аналогична Пользователи.Текущий(), но может быть использована в других контекстах или модулях БСП. Ее поведение также может быть изменено после обновлений.

4. Функции для работы с внешними пользователями: Пользователи.ТекущийПользователь() (в БСП) и ПользователиСлужебныйКлиентСервер.ТекущийВнешнийПользователь()

Возможные причины ошибочного определения пользователя как внешнего (детальный разбор)

Давайте подробнее проанализируем факторы, которые могут привести к тому, что внутренний пользователь ошибочно определяется как внешний:

  1. Изменения в БСП и механизмах аутентификации:
    • Обновление с 2.4 на 2.5: Переход между крупными версиями 1С:ERP, особенно с 2.4 на 2.5, часто сопровождается значительными изменениями в базовой функциональности и БСП. В версии 2.5 введены новые концепции и механизмы работы с пользователями, их правами и ролями. Если ваш код полагался на определенное внутреннее представление пользователя, которое изменилось в новой версии, это может привести к ошибкам.
    • Прекращение поддержки 2.4: Важно помнить, что поддержка 1С:ERP 2.4 прекращена с апреля 2022 года. Это означает, что новые функциональные возможности и исправления ошибок будут реализовываться только в версии 2.5. Если вы продолжаете использовать 2.4, вы подвергаетесь риску столкнуться с несовместимостью и отсутствием исправлений для новых ошибок.
  2. Влияние расширений и нетиповых доработок:
    • Несовместимость расширений: Расширения, разработанные для одной версии платформы или конфигурации, могут стать несовместимыми после обновления. Это особенно актуально, если расширения переопределяют или изменяют стандартные механизмы работы с пользователями. Если расширение не адаптировано к новой версии, оно может некорректно работать с данными пользователя, что приводит к ошибкам.
    • Некорректный перенос доработок: При обновлении нетиповых конфигураций необходимо тщательно переносить все доработки. Ошибки при переносе или неполное понимание изменений в типовом функционале могут привести к проблемам с идентификацией пользователей.
  3. Настройки прав доступа и синхронизация:
    • Флажок "Разрешить доступ внешним пользователям": Убедитесь, что флажок "Разрешить доступ внешним пользователям" в разделе "НСИ и администрирование" – "Администрирование" – "Настройки пользователей и прав" установлен корректно. Если система внезапно стала считать внутренних пользователей внешними, это может быть связано с каким-то неочевидным конфликтом прав или настроек.
    • Права "Внешнее соединение": Если ошибка возникает при использовании внешних соединений (например, COM-соединения), обязательно проверьте, установлено ли у пользователя 1С право "Внешнее соединение" в конфигураторе. Отсутствие этого права может быть причиной ошибки "Внешнее соединение не разрешено для указанного пользователя 1С:Предприятие".
    • Рассинхронизация: В редких случаях после обновления может произойти временная или постоянная рассинхронизация между списками пользователей в базе данных и кэше приложения. Очистка кэша или пересоздание настроек пользователя может помочь в таких ситуациях.

Рекомендации по обновлению и поддержке 1С:ERP

Для минимизации подобных проблем в будущем и обеспечения стабильной работы системы, мы рекомендуем придерживаться следующих практических советов:

  1. Переход на актуальные версии:
    • Своевременное обновление: Критически важно своевременно переходить на актуальные версии 1С:ERP. Как уже упоминалось, версия 2.4 не поддерживается, и все новые возможности, а также исправления ошибок, реализуются только в 2.5. Откладывание перехода может привести к накоплению проблем и увеличению сложности миграции в будущем.
    • Планирование перехода на 2.5: Если вы все еще на 2.4, начните планировать переход на 2.5. По мнению экспертов, лучше перейти сейчас, пока есть время отловить возможные ошибки до сдачи годовой отчетности. Например, функциональность по ФСБУ в 1С реализуется только в 2.5.
  2. Поэтапное обновление:
    • Выбор промежуточных релизов: Если вы обновляетесь с очень старой версии, не пытайтесь "перепрыгнуть" сразу на самый последний релиз. Иногда полезно выбрать ряд промежуточных стабильных релизов (например, сначала на 2.4.14.64, а затем на более актуальные версии 2.5), чтобы обеспечить более плавный переход и выявить проблемы на каждом этапе.
    • Тестирование: Всегда проводите тщательное тестирование системы после каждого обновления, особенно если у вас есть нетиповые доработки и расширения. Идеально — сначала провести обновление и тестирование на тестовой базе.
  3. Адаптация расширений и нетипового кода:
    • Проверка расширений: После обновления обязательно проверяйте работу всех расширений. Как показывает практика, часть функциональности расширений может перестать работать или вызвать ошибки, требуя переработки под новую версию платформы и БСП.
    • Сравнение свойств модулей: Всегда сравнивайте свойства модулей (например, "где разрешено использовать" - клиент, сервер, внешнее соединение и т.д.) между старой и новой версиями, особенно для тех модулей, которые затрагиваются вашими доработками. Изменения в этих свойствах могут влиять на поведение кода.
  4. Ведение регламентированного и управленческого учета:
    • Если в ERP ведется регламентный учет и расчет заработной платы, переход на новую версию является особенно важным из-за законодательных изменений и требований к отчетности (например, по ФСБУ). Это позволит вовремя адаптироваться к новым стандартам и избежать проблем при сдаче отчетности.
    • Если же ведется только управленческий учет, вопрос срочности может быть менее критичным, но все равно рекомендуется поддерживать актуальность системы для получения новых функций и исправлений.

В заключение, проблема ошибочного определения внутреннего пользователя как внешнего после обновления 1С:ERP является типичным следствием эволюции платформы и БСП. Своевременное выявление и исправление таких ошибок, в частности, через использование ПараметрыСеанса, а также стратегическое планирование обновлений и адаптация нетипового кода, позволит обеспечить стабильную и эффективную работу вашей информационной системы.

← На главную