Как исправить ошибку «Несоответствие типов» при отклонении заявки в 1С:Документооборот 3.0

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

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

Анализируем причину возникновения ошибки

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


{ОбщийМодуль.ДокументооборотПраваДоступа.Модуль(73)}:ТаблицаПрав.ЗагрузитьКолонку(СотрудникиОтбор, "Сотрудник");
...
по причине:
Ошибка при вызове метода контекста (ЗагрузитьКолонку)
по причине:
Несоответствие типов (параметр номер '1')

Выясним причину такого поведения. Метод ЗагрузитьКолонку объекта ТаблицаЗначений ожидает в качестве первого параметра объект типа Массив. Однако, в последних релизах (начиная с 3.0.16) разработчики изменили механизмы работы с правами и кэшированием сотрудников. Теперь, если в настройках программы отключено ограничение прав доступа на уровне записей (RLS), функция Сотрудники.ВсеСотрудникиТекущегоПользователя(Ложь) возвращает объект типа ФиксированныйМассив.

Важно понимать различие: ФиксированныйМассив — это неизменяемая коллекция, и современные версии платформы (включая 8.3.25) крайне строго относятся к передаче таких типов данных в методы, которые жестко ожидают стандартный динамический Массив. Именно этот конфликт типов и приводит к аварийному завершению процесса записи задачи.

Вариант 1: Использование функциональных опций

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

  1. Перейдем в раздел Настройка — Настройки программы.
  2. Выберем пункт Права доступа.
  3. Установим флаг Ограничивать права доступа.

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

Вариант 2: Применение официальных исправлений (Патчей)

Фирма «1С» оперативно выпускает исправления для критических ошибок в виде патчей. Разберем, как проверить наличие нужного исправления. Для версии 3.0.16.30 стоит обратить внимание на патчи с префиксами EF_00_..., относящиеся к правам доступа и задачам.

Выполним следующие шаги:

  1. Зайдем в раздел Администрирование — Обслуживание.
  2. Развернем подраздел Обновление программы.
  3. Нажмем на ссылку Установленные исправления (патчи).
  4. Нажмем кнопку Поиск и установка исправлений (требуется доступ в интернет и подписка ИТС).

Особое внимание обратите на патч EF_60014283 или аналогичные, в описании которых фигурирует «Ошибка при выполнении задачи». Установка патча — самый безопасный метод, так как он не снимает конфигурацию с поддержки.

Вариант 3: Исправление кода через расширение (для программистов)

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

Нам необходимо принудительно преобразовать ФиксированныйМассив в обычный Массив перед тем, как передать его методу ЗагрузитьКолонку. Посмотрим на пример кода, который решает проблему:


// В расширении, метод ПраваСотрудниковПоОбъекту (или аналогичный, где падает ошибка)
// Вместо:
// ТаблицаПрав.ЗагрузитьКолонку(СотрудникиОтбор, "Сотрудник");

// Используем конструктор нового массива для приведения типа:
МассивДляЗагрузки = Новый Массив(СотрудникиОтбор);
ТаблицаПрав.ЗагрузитьКолонку(МассивДляЗагрузки, "Сотрудник");

Почему это работает? Конструктор Новый Массив(), принимая на вход другой массив (даже фиксированный), создает его полную копию в виде стандартного массива. После такого преобразования метод ЗагрузитьКолонку отрабатывает без ошибок, так как типы данных теперь полностью соответствуют ожиданиям платформы.

Резюме и рекомендации

Мы проанализировали ситуацию и выяснили, что ошибка носит чисто технический характер и связана с развитием платформы 1С:Предприятие 8.3 в части типизации данных. При использовании последних версий платформы (8.3.24, 8.3.25) подобные несоответствия становятся критичными.

Подведем итог действий, которые помогут восстановить работоспособность:

Помните, что внесение изменений в программный код через расширения требует осторожности. Всегда проверяйте работоспособность на копии базы данных перед применением в рабочей среде. Мы надеемся, что в будущих релизах (например, в анонсированном 3.0.17) эта ошибка будет исправлена разработчиками штатно, и необходимость в ручных правках отпадет.

← На главную