При разработке внешних обработок в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда решение идеально работает как внешний файл (через меню «Файл» — «Открыть»), но после интеграции в состав конфигурации (в дерево метаданных) или при регистрации в справочнике «Дополнительные отчеты и обработки» интерфейс начинает вести себя иначе. Одна из самых типичных проблем — блокировка колонок табличной части (особенно булевских флажков «Отметка») и появление ошибок при программном изменении данных.
В этой статье мы подробно разберем, почему под полными правами всё работает, а у обычного пользователя колонки становятся «только для просмотра», проанализируем ошибку Поле объекта недоступно для записи и выясним, как правильно настроить права и программный код для работы с таблицами на управляемых формах.
Первым делом проанализируем ситуацию с правами доступа. В системе 1С права (роли) имеют иерархическую и гранулярную структуру. Когда мы даем пользователю роль для работы с новой обработкой, часто мы ограничиваемся флажками «Просмотр» и «Использование» для самого объекта Обработка. Однако этого недостаточно для полноценной интерактивной работы с данными внутри неё.
Рассмотрим подробнее механизм работы прав:
Отметка) в конфигураторе в окне настройки роли должен быть установлен флаг «Редактирование».ТолькоПросмотр может быть выключен, но системное ограничение прав окажется приоритетнее.Выясним, как это исправить. Нам необходимо зайти в конфигуратор, открыть нужную роль, найти в дереве объектов нашу обработку, развернуть ветку Табличные части, затем Реквизиты и убедиться, что для каждого значимого поля (особенно для флажков) установлены галочки в колонках «Просмотр» и «Редактирование».
Разберем ситуацию, когда при попытке программно «проставить все флажки» возникает ошибка Поле объекта недоступно для записи (Отметка). Часто это происходит из-за некорректного использования методов работы с таблицей формы. Посмотрим на типичный ошибочный код:
&НаКлиенте
Процедура ОтметитьСтрокиНаКлиенте(ЗначениеОтметки)
Для Каждого ТекСтрока Из Объект.ТаблицаДокументов Цикл
ИдентификаторТекущейСтроки = ТекСтрока.ПолучитьИдентификатор();
// Ошибка: метод ПроверитьСтроку ожидает саму строку или её индекс (в зависимости от контекста),
// но здесь часто путают типы данных
Если Элементы.ТаблицаДокументов.ПроверитьСтроку(ИдентификаторТекущейСтроки) = Истина Тогда
ТекСтрока.Отметка = ЗначениеОтметки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В данном примере, если у пользователя нет прав на редактирование реквизита Отметка, любая попытка присвоить ему значение (даже программно на клиенте) вызовет исключение. Однако здесь кроется и техническая ошибка использования метода ПроверитьСтроку.
Проанализируем правильный подход. Метод ПроверитьСтроку у элемента формы Таблица используется для определения того, попадает ли строка под текущие установленные пользователем фильтры (отборы) в интерфейсе. В этот метод нужно передавать именно объект строки коллекции данных формы.
Рассмотрим исправленный и оптимизированный пример кода:
&НаКлиенте
Процедура ОтметитьСтрокиПравильно(ЗначениеОтметки)
// Перебираем коллекцию данных формы
Для Каждого СтрТЧ Из Объект.ТаблицаДокументов Цикл
// Проверяем, видна ли строка пользователю в данный момент (с учетом фильтров)
// Метод возвращает Истина, если строка удовлетворяет условиям отбора
Если Элементы.ТаблицаДокументов.ПроверитьСтроку(СтрТЧ) Тогда
// Если права настроены верно, запись будет успешной
Попытка
СтрТЧ.Отметка = ЗначениеОтметки;
Исключение
Сообщить("Не удалось изменить строку: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Многих смущает тот факт, что запуск обработки через Файл - Открыть не вызывал проблем. Выясним причину этого различия. Когда обработка открывается как внешний файл, она работает в особом контексте. Часто (в зависимости от настроек безопасности) внешние файлы запускаются с более лояльными проверками прав метаданных, так как они не являются частью основной конфигурации. Как только вы добавляете объект в дерево метаданных (в состав конфигурации), он становится полноправным участником системы безопасности, и 1С начинает жестко проверять права на каждую ветку: Обработка -> Табличная часть -> Реквизит.
В конфигурациях на базе УТ 11.5 (ERP, КА) также стоит учитывать влияние Библиотеки стандартных подсистем (БСП). Если вы регистрируете обработку через «Дополнительные отчеты и обработки», обратите внимание на следующие моменты:
/UpdateConfigДополнительныеСведения для обновления внутренних справочников БСП.Если вы столкнулись с недоступностью поля, пройдите по следующим шагам вместе с нами:
ПравоДоступа("Редактирование", Метаданные.Обработки.ИмяВашейОбработки.ТабличныеЧасти.ИмяТЧ.Реквизиты.Отметка)
Ложь — проблема в конфигураторе, в настройках роли.
ТолькоПросмотр и у колонки Отметка свойство Доступность установлено в значение Истина, а ТолькоПросмотр — в Ложь.Состав функциональных опций в метаданных.Резюме: В большинстве случаев проблема «некликабельного» флажка во встроенной обработке решается простым включением права «Редактирование» для реквизитов табличной части в используемой роли. Всегда проверяйте права на самом нижнем уровне метаданных — уровне реквизитов.