Как скрыть кнопки Создать и Скопировать в динамическом списке 1С, сохранив возможность редактирования данных?

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

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

Простое использование свойства ТолькоПросмотр здесь не подходит, так как оно полностью блокирует взаимодействие с данными. В данной статье мы подробно разберем, как программно и интерактивно управлять составом команд динамического списка, чтобы добиться нужного поведения интерфейса — для этого есть инструмент настройки видимости элементов форм.

Способ 1. Использование свойства ИзменятьСоставСтрок

Проанализируем наиболее эффективное решение, к которому пришел автор темы. У элемента формы типа ТаблицаФормы, данные которой подтянуты из ДинамическогоСписка, существует специфическое свойство — ИзменятьСоставСтрок. Это свойство отвечает за возможность интерактивного добавления, копирования или удаления строк пользователем.

Разберем, как это работает. Если мы установим это свойство в значение Ложь, платформа автоматически уберет кнопки Создать, Скопировать и Удалить из командной панели, при этом сами ячейки таблицы (если они настроены на редактирование) или возможность открытия формы записи сохранятся.

Установить это свойство можно двумя способами:

  1. В конфигураторе: Выделите элемент формы (таблицу), перейдите в палитру свойств (или используйте редактор форм в режиме предприятия) и в разделе "Использование" снимите галочку с пункта Изменять состав строк.
  2. Программно: В модуле формы, например, в процедуре ПриСозданииНаСервере, добавьте следующий код (также возможно добавление реквизитов и элементов формы программно):

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Укажите имя вашего элемента таблицы формы
    Элементы.ИмяВашейТаблицы.ИзменятьСоставСтрок = Ложь;
КонецПроцедуры

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

Способ 2. Управление Основной таблицей динамического списка

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

Рассмотрим вариант, когда нам нужно избавиться от кнопок путем изменения настроек самого списка (это также позволит добавить дополнительную информацию в динамический список):

  1. Откройте свойства реквизита формы (вашего динамического списка).
  2. Установите флаг Произвольный запрос.
  3. Очистите поле Основная таблица.

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


&НаКлиенте
Процедура ИмяВашейТаблицыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Отменяем стандартную обработку, так как основная таблица не задана
    СтандартнаяОбработка = Ложь;
    
    // Пишем логику открытия формы записи или изменения данных
    // Например:
    ПараметрыКлюча = Новый Структура("Ключ", ВыбраннаяСтрока);
    ОткрытьФорму("РегистрСведений.ВашРегистр.ФормаЗаписи", ПараметрыКлюча);
КонецПроцедуры

Способ 3. Отключение автозаполнения командной панели

Если вам требуется оставить возможность добавления строк, но вы хотите полностью перерисовать командную панель под свои нужды, проанализируем механизм автозаполнения. По умолчанию у командной таблицы стоит свойство Автозаполнение.

Посмотрим, как настроить панель вручную:

  1. В дереве элементов формы найдите командную панель вашей таблицы.
  2. В свойствах снимите флаг Автозаполнение. После этого все кнопки (включая «Поиск», отборы динамического списка, «Настройка списка» и т.д.) исчезнут.
  3. Теперь вручную перетащите из раздела Команды -> Стандартные команды вашей таблицы только те действия, которые вам нужны (например, Изменить, Обновить, Вывести список).

Такой подход дает 100% контроль над тем, что видит пользователь, и исключает появление «лишних» системных кнопок — для этого подойдёт конструктор кастомных панелей кнопок в списках.

Способ 4. Программное обращение к кнопкам по имени

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

Хотя в конфигураторе эти кнопки не видны как отдельные элементы, в режиме выполнения они имеют системные имена. Обычно имя строится по шаблону: ИмяТаблицы + ИмяКоманды.

Пример кода для скрытия кнопок:


&НаКлиенте
Процедура СкрытьКнопкиПриУсловии()
    // Если таблица на форме называется "Список"
    Элементы.СписокСоздать.Видимость = Ложь;
    Элементы.СписокСкопировать.Видимость = Ложь;
КонецПроцедуры

Обратите внимание: Этот способ может быть нестабильным на разных версиях платформы или при смене режима отрисовки форм, поэтому рекомендуется использовать ИзменятьСоставСтрок как более надежную альтернативу.

Особенности редактирования данных в Динамическом списке

В ходе обсуждения на форуме был поднят важный вопрос: как редактировать данные в ДС? По своей природе динамический список предназначен только для отображения данных. Напрямую изменить значение в ячейке, как в ТаблицеЗначений, нельзя.

Разберем, как реализовать «псевдо-редактирование»:

  1. Через форму записи: Пользователь делает двойной клик, открывается форма записи регистра, он меняет данные, нажимает «Записать», и ДС обновляется.
  2. Программное изменение: Можно назначить обработчик события Выбор или ПриАктивизацииЯчейки. При взаимодействии с полем вызывать программную запись в регистр сведений через МенеджерЗаписи или НаборЗаписей, после чего вызывать метод Элементы.ИмяТаблицы.Обновить().

Рассмотрим пример программного изменения статуса прямо из списка:


&НаСервереБезКонтекста
Процедура ИзменитьСтатусНаСервере(КлючЗаписи, НовыйСтатус)
    Менеджер = РегистрыСведений.ВашРегистр.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(Менеджер, КлючЗаписи);
    Менеджер.Прочитать();
    Если Менеджер.Выбран() Тогда
        Менеджер.Статус = НовыйСтатус;
        Менеджер.Записать();
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    Если Поле.Имя = "Статус" Тогда
        СтандартнаяОбработка = Ложь;
        // Логика выбора нового статуса и вызов сервера
        ИзменитьСтатусНаСервере(ВыбраннаяСтрока, "Завершено");
        Элементы.Список.Обновить();
    КонецЕсли;
КонецПроцедуры

Подведем итог. Для простого скрытия кнопок создания используйте ИзменятьСоставСтрок = Ложь — в этом поможет модуль управления логикой поведения реквизитов формы. Если требуется более сложная логика — отключайте Автозаполнение командной панели и формируйте состав кнопок вручную. Это обеспечит надежную работу интерфейса и предсказуемое поведение программы для пользователя.

← На главную