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

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

В процессе работы с конфигурацией 1С:Документооборот 3.0 (релиз 3.0.16.30) на платформе 8.3.25 многие пользователи и администраторы столкнулись с критической ошибкой. Проблема проявляется при попытке выполнить задачи «Согласовать» (с результатом «Не согласовано») или «Утвердить» (с результатом «Не утверждено»). Вместо штатного завершения задачи система выдает сообщение об ошибке в методе ЗагрузитьКолонку.

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

Разбор технической причины ошибки

Проанализируем стек вызовов, представленный в сообщении об ошибке. Мы видим, что сбой происходит в общем модуле ДокументооборотПраваДоступа в строке 73. Код в этом месте пытается выполнить следующую операцию:

ТаблицаПрав.ЗагрузитьКолонку(СотрудникиОтбор, "Сотрудник");

Ошибка «Несоответствие типов (параметр номер '1')» возникает из-за того, что метод ЗагрузитьКолонку объекта ТаблицаЗначений в языке 1С жестко требует, чтобы первым параметром передавался объект типа Массив. Однако, в версии 3.0.16.30 функция Сотрудники.ВсеСотрудникиТекущегоПользователя(Ложь) возвращает объект типа ФиксированныйМассив.

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

Способ 1. Изменение настроек прав доступа

Разберем самый быстрый способ «лечения» системы без программирования. Ошибка проявляется преимущественно в тех информационных базах, где отключено ограничение прав доступа на уровне записей (RLS). Когда RLS выключен, система использует упрощенные алгоритмы проверки прав, и именно в этом «облегченном» блоке кода допущена ошибка типизации.

Для временного решения проблемы можно выполнить следующие действия:

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

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

Способ 2. Программное исправление через расширение

Если нам необходимо сохранить настройки прав доступа в прежнем виде, рассмотрим вариант внесения правок в код. Мы можем создать расширение и перехватить вызов проблемной функции. Суть исправления заключается в принудительном преобразовании ФиксированногоМассива в обычный Массив.

Выясним, где именно происходит вызов. В модуле объекта задачи (Задача.ЗадачаИсполнителя.МодульОбъекта) вызывается процедура получения прав:


Права = ДокументооборотПраваДоступа.ПраваСотрудниковПоОбъекту(
    Ссылка, 
    Истина, 
    Сотрудники.ВсеСотрудникиТекущегоПользователя(Ложь)
);

Рассмотрим, как можно изменить код в общем модуле ДокументооборотПраваДоступа. Нам нужно убедиться, что в ЗагрузитьКолонку попадает правильный тип данных. Пример кода для расширения (метод Перед или Вместо для процедуры, где вызывается ЗагрузитьКолонку):


// В месте, где СотрудникиОтбор может быть фиксированным массивом
Если ТипЗнч(СотрудникиОтбор) = Тип("ФиксированныйМассив") Тогда
    СотрудникиОтборОбычный = Новый Массив(СотрудникиОтбор);
Иначе
    СотрудникиОтборОбычный = СотрудникиОтбор;
КонецЕсли;

ТаблицаПрав.ЗагрузитьКолонку(СотрудникиОтборОбычный, "Сотрудник");

Этот подход является наиболее надежным, так как он устраняет первопричину — несовместимость типов, не меняя при этом бизнес-логику прав доступа.

Способ 3. Изменение параметров вызова функции

Проанализируем еще одну интересную особенность, замеченную в ходе отладки. Проблема кроется в функции Сотрудники.ВсеСотрудникиТекущегоПользователя(Параметр).

Как показывают тесты:

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

Способ 4. Обновление конфигурации и патчи

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

  1. Зайдем в раздел Администрирование — Обслуживание.
  2. Выберем Обновление программы — Установка обновлений и исправлений (патчей).
  3. Если база подключена к интернет-поддержке, найдем патч, в описании которого упоминается ошибка ЗагрузитьКолонку или проблемы с правами доступа в версии 3.0.16.30.

Также отметим, что в релизе 3.0.16.35 и последующих эта ошибка уже исправлена на уровне основного кода конфигурации. Если есть возможность, наиболее правильным долгосрочным решением будет обновление конфигурации до актуального релиза.

Резюме

Мы рассмотрели техническую природу ошибки типизации в 1С:Документооборот 3.0.16.30. Подведем итоги:

  1. Причина — попытка загрузить ФиксированныйМассив в колонку таблицы значений.
  2. Быстрое решение — включить Ограничение прав доступа (RLS) в настройках программы.
  3. Программное решение — преобразование коллекции в тип Массив через конструктор Новый Массив(ФиксированныйМассив) в расширении.
  4. Официальное решение — установка патча EF_... или обновление до версии 3.0.16.35.

Используя эти методы, вы сможете восстановить работоспособность процессов согласования в вашей организации.

← На главную