В процессе работы с конфигурацией 1С:Документооборот 3.0 (релиз 3.0.16.30) на платформе 8.3.25 многие пользователи и администраторы столкнулись с критической ошибкой. Проблема проявляется при попытке выполнить задачи «Согласовать» (с результатом «Не согласовано») или «Утвердить» (с результатом «Не утверждено»). Вместо штатного завершения задачи система выдает сообщение об ошибке в методе ЗагрузитьКолонку.
В данной статье мы подробно проанализируем ситуацию, выясним техническую причину сбоя и рассмотрим несколько способов решения этой проблемы: от изменения настроек системы до внесения правок в программный код через расширение.
Проанализируем стек вызовов, представленный в сообщении об ошибке. Мы видим, что сбой происходит в общем модуле ДокументооборотПраваДоступа в строке 73. Код в этом месте пытается выполнить следующую операцию:
ТаблицаПрав.ЗагрузитьКолонку(СотрудникиОтбор, "Сотрудник");
Ошибка «Несоответствие типов (параметр номер '1')» возникает из-за того, что метод ЗагрузитьКолонку объекта ТаблицаЗначений в языке 1С жестко требует, чтобы первым параметром передавался объект типа Массив. Однако, в версии 3.0.16.30 функция Сотрудники.ВсеСотрудникиТекущегоПользователя(Ложь) возвращает объект типа ФиксированныйМассив.
Фиксированный массив — это объект, который нельзя изменять после создания. Несмотря на внешнюю схожесть с обычным массивом, с точки зрения платформы 1С это разные типы данных. В новых версиях платформы (8.3.24 и выше) типизация стала более строгой, и автоматическое приведение типов в данном методе перестало работать, что и привело к регрессии в коде типовой конфигурации.
Разберем самый быстрый способ «лечения» системы без программирования. Ошибка проявляется преимущественно в тех информационных базах, где отключено ограничение прав доступа на уровне записей (RLS). Когда RLS выключен, система использует упрощенные алгоритмы проверки прав, и именно в этом «облегченном» блоке кода допущена ошибка типизации.
Для временного решения проблемы можно выполнить следующие действия:
После включения этой опции система начнет использовать другой путь исполнения кода при записи задачи, где формирование массива сотрудников происходит корректно (возвращается обычный Массив), и ошибка исчезнет. Однако стоит помнить, что включение RLS может повлиять на общую производительность системы в крупных базах.
Если нам необходимо сохранить настройки прав доступа в прежнем виде, рассмотрим вариант внесения правок в код. Мы можем создать расширение и перехватить вызов проблемной функции. Суть исправления заключается в принудительном преобразовании ФиксированногоМассива в обычный Массив.
Выясним, где именно происходит вызов. В модуле объекта задачи (Задача.ЗадачаИсполнителя.МодульОбъекта) вызывается процедура получения прав:
Права = ДокументооборотПраваДоступа.ПраваСотрудниковПоОбъекту(
Ссылка,
Истина,
Сотрудники.ВсеСотрудникиТекущегоПользователя(Ложь)
);
Рассмотрим, как можно изменить код в общем модуле ДокументооборотПраваДоступа. Нам нужно убедиться, что в ЗагрузитьКолонку попадает правильный тип данных. Пример кода для расширения (метод Перед или Вместо для процедуры, где вызывается ЗагрузитьКолонку):
// В месте, где СотрудникиОтбор может быть фиксированным массивом
Если ТипЗнч(СотрудникиОтбор) = Тип("ФиксированныйМассив") Тогда
СотрудникиОтборОбычный = Новый Массив(СотрудникиОтбор);
Иначе
СотрудникиОтборОбычный = СотрудникиОтбор;
КонецЕсли;
ТаблицаПрав.ЗагрузитьКолонку(СотрудникиОтборОбычный, "Сотрудник");
Этот подход является наиболее надежным, так как он устраняет первопричину — несовместимость типов, не меняя при этом бизнес-логику прав доступа.
Проанализируем еще одну интересную особенность, замеченную в ходе отладки. Проблема кроется в функции Сотрудники.ВсеСотрудникиТекущегоПользователя(Параметр).
Как показывают тесты:
Ложь, функция возвращает ФиксированныйМассив.Истина, функция возвращает обычный Массив.Следовательно, если найти в коде вызов этой функции перед сохранением задачи и заменить аргумент, ошибка пропадет. Однако мы рекомендуем использовать Способ 2, так как он более универсален и защищает систему от аналогичных ошибок в других местах, где может использоваться этот же модуль прав доступа.
Поскольку данная ошибка официально признана разработчиками 1С как регрессионная, для неё был выпущен оперативный патч. Проверим наличие обновлений:
ЗагрузитьКолонку или проблемы с правами доступа в версии 3.0.16.30.Также отметим, что в релизе 3.0.16.35 и последующих эта ошибка уже исправлена на уровне основного кода конфигурации. Если есть возможность, наиболее правильным долгосрочным решением будет обновление конфигурации до актуального релиза.
Мы рассмотрели техническую природу ошибки типизации в 1С:Документооборот 3.0.16.30. Подведем итоги:
ФиксированныйМассив в колонку таблицы значений.Массив через конструктор Новый Массив(ФиксированныйМассив) в расширении.EF_... или обновление до версии 3.0.16.35.Используя эти методы, вы сможете восстановить работоспособность процессов согласования в вашей организации.