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