Почему в списках 1С отсутствует кнопка «Удалить» и как это исправить?

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

Каждый разработчик или администратор системы «1С:Предприятие» хотя бы раз сталкивался с ситуацией, когда в режиме Предприятия в форме списка какого-либо справочника или регистра внезапно исчезает стандартная кнопка «Удалить» (или кнопка пометки на удаление). На панели инструментов её нет, в контекстном меню строки она отсутствует, и даже в меню «Еще» нужная команда бесследно пропала.

Особенно часто с этим сталкиваются при работе с периодическими регистрами сведений в типовых конфигурациях (например, в «1С:Зарплата и управление персоналом 3» или «1С:ERP»). Выясним причины такого поведения платформы, рассмотрим влияние режима совместимости и разберем по шагам, как устроен этот механизм изнутри.

Почему при изменении режима совместимости на «8.3.10» кнопка появляется?

Рассмотрим интересную техническую особенность платформы. При установке режима совместимости конфигурации в значение «8.3.10» и ниже кнопка удаления может неожиданно вернуться на форму, но при переключении на актуальный режим совместимости (например, «8.3.11», «8.3.12» и выше) она снова исчезает. Это связано с изменением логики отрисовки интерфейса платформой «1С:Предприятие»:

Важное предупреждение: Крайне не рекомендуется понижать режим совместимости рабочей базы данных ради возвращения кнопки удаления! Это отключит современные механизмы оптимизации работы платформы с СУБД, заблокирует использование новых возможностей (например, современных расширений конфигурации) и может вызвать критические ошибки в коде типовых решений.

Зачем разработчики типовых решений намеренно отключают удаление?

Проанализируем ситуацию на примере регистра сведений ИсторияРегистрацийВНалоговомОргане в программе «1С:ЗУП 3». Этот регистр хранит сведения о регистрациях в налоговых органах в разрезе организаций и подразделений с привязкой к конкретным датам (периодичность — в пределах дня).

Если бы у пользователя была возможность напрямую удалять или добавлять записи в этот регистр из общего списка, это неизбежно привело бы к следующим проблемам:

  1. Нарушение хронологической последовательности и появление «дыр» в истории налогового учета.
  2. Возникновение логических ошибок при расчете и отправке отчетности по НДФЛ.
  3. Обход встроенных бизнес-проверок, которые контролируют корректность дат и связей между подразделениями и инспекциями.

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

Пять основных причин исчезновения кнопки «Удалить» в динамических списках

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

1. Свойство «Изменять состав строк» у таблицы формы

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

2. Флаг «Использовать стандартные команды» у объекта метаданных

В дереве метаданных конфигурации откройте свойства самого объекта (справочника, документа или регистра). На вкладке «Основные» найдите свойство ИспользоватьСтандартныеКоманды. Если флаг снят, стандартные команды этого объекта не будут генерироваться платформой автоматически, что приведет к скрытию кнопок создания и удаления в связанных списках.

3. Свойство «Основная таблица» динамического списка

Очень частая ошибка при создании списков на основе произвольного запроса. Если динамический список выбирает данные сложным запросом (например, объединяет несколько таблиц или использует левое соединение), платформа не может самостоятельно определить, к какому именно объекту метаданных относятся команды удаления или создания. Чтобы исправить это, откройте свойства динамического списка (свойство НастройкаСписка -> Запрос) и обязательно заполните поле ОсновнаяТаблица, указав там конкретную таблицу базы данных.

4. Ограничения прав доступа на уровне СУБД (RLS) и Ролей

Если у текущего пользователя базы данных в его ролях отсутствует право на «Удаление» или «Интерактивную пометку удаления» для данного объекта метаданных, платформа на уровне платформенного механизма безопасности скроет эти кнопки из интерфейса. Проверьте права пользователя в конфигураторе.

5. Ручное исключение команд в свойстве «Состав команд»

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

Как безопасно удалить данные, если интерфейс заблокирован?

Если вам как администратору или разработчику действительно крайне необходимо точечно очистить или скорректировать записи регистра в обход стандартного интерфейса, используйте программные методы или стандартные административные инструменты.

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

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


// Создаем набор записей регистра сведений
НаборЗаписей = РегистрыСведений.ИсторияРегистрацийВНалоговомОргане.СоздатьНаборЗаписей();

// Устанавливаем отбор по организации, для которой нужно удалить данные
НаборЗаписей.Отбор.Организация.Установить(ВыбОрганизация);

// Записываем пустой набор записей, что приведет к удалению всех записей,
// соответствующих установленному отбору
НаборЗаписей.Записать(Истина);

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

← На главную