Как вывести свои кнопки и изменить форму подбора Списка Значений в 1С?

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

Часто при разработке прикладных решений на платформе 1С:Предприятие возникает задача кастомизации стандартных интерфейсных механизмов. Одной из таких задач является изменение формы редактирования или подбора объекта СписокЗначений. Стандартное окно, которое открывается платформой при интерактивном редактировании списка, содержит базовый набор кнопок: «Добавить», «Подбор», «Изменить», «Удалить» и кнопки сортировки.

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

Почему мы не можем найти стандартную форму в конфигураторе?

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

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

Существует теоретический способ «взлома» ресурсов платформы (файлы с расширением .res или, в старых версиях, библиотеки mngbase), о котором иногда упоминают на форумах. Мы категорически не рекомендуем использовать этот метод по следующим причинам:

  1. Это нарушает лицензионное соглашение.
  2. Любое обновление платформы 1С вернет файлы в исходное состояние, и ваши доработки исчезнут.
  3. Изменение внутренней структуры ресурсов может привести к критическим ошибкам и аварийному завершению работы клиента («вылетам»).

Поэтому мы рассмотрим единственный легальный и надежный способ — создание собственной формы.

Создание собственной формы для редактирования списка

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

Разберем этот процесс по шагам.

1. Создание Общей формы

В дереве метаданных перейдем в ветку Общие — Общие формы и добавим новую форму. Назовем её, например, ФормаРедактированияСписка. Тип формы выберем «Произвольная форма».

2. Настройка реквизитов формы

На вкладке «Реквизиты» создадим основной реквизит, с которым будет работать пользователь. Назовем его РедактируемыйСписок. Установим тип данных: СписокЗначений.

3. Настройка элементов формы

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

Управление кнопками командной панели

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

Чтобы добавить свои кнопки, выполним следующие действия:

  1. Перейдем на вкладку «Команды» в редакторе формы.
  2. Создадим новую команду, например, ЗаполнитьПоУмолчанию.
  3. Назначим этой команде действие (процедуру на клиенте и, при необходимости, на сервере).
  4. Перетащим эту команду в командную панель нашей таблицы РедактируемыйСписок.

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

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

Изменение логики кнопки «Подбор»

Частый запрос — изменить логику кнопки «Подбор». В стандартной форме кнопка «Подбор» работает по жесткому алгоритму: она открывает форму выбора того типа данных, который определен для списка значений. Если тип значения списка составной или не определен, кнопка может быть недоступна.

В нашей собственной форме мы можем реализовать любую логику:

  1. Отключаем видимость стандартной кнопки «Подбор» (через состав команд или снятием автозаполнения).
  2. Создаем свою команду ПодборТоваров.
  3. В обработчике команды пишем код открытия нужной нам формы выбора с отборами или параметрами.

Пример кода обработчика вашей кнопки подбора:


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

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

КонецПроцедуры

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

Так как мы создали произвольную форму, она "не знает", что мы хотим редактировать какой-то внешний список. Нам нужно организовать передачу данных.

Способ 1. Использование параметров формы

При создании формы (на вкладке "Параметры") добавим параметр ВходящийСписок произвольного типа.

В модуле нашей формы в событии ПриСозданииНаСервере напишем код заполнения реквизита:


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

Теперь нам нужно вернуть измененный список обратно в то место, откуда вызвали форму. Для этого используем событие ПередЗакрытием или команду "ОК".

Если мы хотим, чтобы форма вела себя как диалог выбора, то при закрытии (по кнопке "ОК" или "Готово") мы должны оповестить вызывающий код о выборе.


&НаКлиенте
Процедура КомандаОК(Команда)
    
    // Возвращаем отредактированный список как результат выбора
    ЭтаФорма.Закрыть(РедактируемыйСписок);
    
КонецПроцедуры

Вызов нашей формы из кода

Теперь посмотрим, как вызвать нашу новую форму вместо стандартной в коде обработки или документа:


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

КонецПроцедуры

&НаКлиенте
Процедура ПослеРедактированияСписка(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат <> Неопределено Тогда
        // Результат содержит наш измененный список значений
        Объект.СписокСотрудников = Результат;
    КонецЕсли;
    
КонецПроцедуры

Вариант с «Составом команд» (для Управляемых форм)

В некоторых случаях, если вы используете стандартные механизмы компоновки данных или динамические списки, у вас может быть доступ к свойству Состав команд (Command Set) в свойствах элемента формы. Однако, для объекта СписокЗначений, размещенного на форме, возможности настройки через это свойство ограничены стандартными действиями.

Вы не сможете добавить туда новую произвольную кнопку без создания Команды формы и перетаскивания её в командную панель, как мы описывали выше. Поэтому метод «создать команду и перетащить» является универсальным.

Резюме

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

  1. Не пытайтесь искать и редактировать стандартную форму платформы.
  2. Не используйте редакторы ресурсов (это ненадежно).
  3. Создайте Общую форму или отдельную форму обработки.
  4. Разместите на ней реквизит типа СписокЗначений.
  5. Настройте командную панель, отключив автозаполнение или добавив свои команды.
  6. Организуйте передачу данных через параметры при открытии и возврат результата через ОписаниеОповещения.

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

← На главную