Почему не отображается колонка в форме списка 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

Часто при работе или доработке конфигураций на платформе 1С:Предприятие (например, в «Бухгалтерия предприятия 3.0») мы можем столкнуться с загадочной ситуацией: у пользователя с полными правами в форме списка документа отображаются все колонки (например, колонка «Оплата» в списке счетов покупателю), а у обычного пользователя эта колонка бесследно исчезает. При этом поле нельзя найти даже через меню изменения формы. Давайте подробно разберем эту проблему, выясним причину такого поведения системы и по шагам решим задачу.

Проанализируем возможные причины скрытия колонки

На видимость любого поля в форме списка могут влиять несколько факторов. Проверим основные из них:

  1. Пользовательская видимость: галка видимости элемента формы в свойствах.
  2. Кэш настроек формы: пользователь мог случайно скрыть колонку сам.
  3. Функциональные опции: реквизит привязан к опции, которая отключена в базе.
  4. Программная установка видимости: код в модуле формы, например, в ПриСозданииНаСервере, скрывающий элемент для определенных ролей.
  5. Права доступа: отсутствие прав на сам реквизит или связанные с ним объекты данных.

Если мы убедились, что колонка типовая, программно она не скрывается (нет конструкций вроде Если РольДоступна("Полные права")), а в настройках «Изменить форму» в режиме Предприятия её вообще нет в списке доступных полей, значит проблема кроется глубже — на уровне формирования самого запроса динамического списка.

Разберем запрос динамического списка

Посмотрим на типовой запрос, который формирует данные для формы списка счетов на оплату:


ВЫБРАТЬ
    // ... другие поля ...
    ВЫРАЗИТЬ(ЕСТЬNULL(СтатусыДокументов.Статус, &СтатусОплатыПоУмолчанию) КАК Перечисление.СтатусОплатыСчета) КАК Оплата,
    ВЫРАЗИТЬ(ЕСТЬNULL(СтатусыДокументов.ДополнительныйСтатус, &СтатусОтгрузкиПоУмолчанию) КАК Перечисление.СтатусыОтгрузки) КАК Отгрузка
ИЗ
    Документ.СчетНаОплатуПокупателю КАК ДокументСчетНаОплатуПокупателю
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументов КАК СтатусыДокументов
        ПО ДокументСчетНаОплатуПокупателю.Организация = СтатусыДокументов.Организация
            И ДокументСчетНаОплатуПокупателю.Ссылка = СтатусыДокументов.Документ
        // ... другие соединения ...

Обратим внимание на интересную деталь: данные для колонки Оплата берутся не из реквизитов самого документа, а из левого соединения с независимым объектом — РегистрСведений.СтатусыДокументов.

Почему статусы вынесены в отдельный регистр?

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

Как динамические списки реагируют на нехватку прав

Теперь выясним главную причину исчезновения колонки. Динамические списки в 1С строятся на базе Системы компоновки данных (СКД). По умолчанию они исполняются с учетом прав доступа пользователя (это аналог конструкции РАЗРЕШЕННЫЕ в обычных запросах).

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

Решение проблемы: настройка прав доступа

Чтобы заставить колонку появиться, выполним настройку прав доступа. Нам необходимо дать проблемному пользователю права на чтение регистра СтатусыДокументов.

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

  1. Откроем базу в режиме Предприятия, перейдем в раздел администрирования пользователей.
  2. Проверим, есть ли в системе уже готовая типовая роль (например, «Чтение статусов документов» или аналогичная), и добавим профиль с этой ролью в группу доступа пользователя.
  3. Если подходящей типовой роли нет, создадим собственную роль через механизм Расширений конфигурации.
  4. В новой роли дадим права только на «Чтение» и «Просмотр» объекта РегистрСведений.СтатусыДокументов.
  5. Назначим эту новую роль нужному профилю групп доступа.

Сброс кэша пользовательских настроек

Часто бывает так, что после выдачи правильных прав колонка всё равно не появляется автоматически. Проанализируем, почему это происходит. Платформа 1С жестко кэширует настройки форм для каждого отдельного пользователя. Система «запомнила», что колонки там быть не должно.

Сделаем следующие действия для принудительного обновления интерфейса:

  1. Попросим пользователя зайти в базу под своей учетной записью.
  2. Откроем проблемную форму списка (Счета на оплату покупателям).
  3. В правом верхнем углу списка нажмем кнопку Еще и выберем пункт Изменить форму....
  4. В открывшемся окне настроек формы снова нажмем кнопку Еще (уже внутри этого окна) и выберем команду Установить стандартные настройки.
  5. Нажмем ОК и применим изменения.

После этих действий платформа перестроит интерфейс формы с чистого листа с учетом обновленных прав пользователя, прочитает запрос динамического списка, увидит доступный регистр сведений, и колонка «Оплата» благополучно появится на экране.

← На главную