Как в управляемых формах 1С реализовать создание и редактирование элементов непосредственно в списке?

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

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

Анализ стандартных возможностей метаданных

Прежде чем приступать к сложному программированию, проанализируем стандартные настройки объекта в конфигураторе. У каждого справочника существует свойство «Способ редактирования». Оно может принимать значения:

  1. В диалоге — стандартное открытие формы элемента.
  2. В списке — попытка платформы разрешить ввод данных прямо в ячейки таблицы.
  3. Обоими способами — сочетание вариантов.

Важно понимать, что в управляемых формах выбор варианта В списке работает не так прямолинейно, как в старых версиях. Если основной таблицей формы является ДинамическийСписок, полноценного «Excel-подобного» ввода данных может не получиться из-за архитектурных особенностей работы с базой данных. Однако установку этого свойства следует считать первым шагом.

Решение 1: Использование Таблицы значений вместо Динамического списка

Разберем ситуацию, когда нам принципиально важно редактировать данные в строках. Основная проблема в том, что ДинамическийСписок предназначен для быстрого отображения данных через SQL-запросы, но он не хранит данные в оперативной памяти формы для редактирования. Чтобы обойти это ограничение, мы можем заменить тип данных основной таблицы формы.

Выясним алгоритм действий:

  1. Вместо стандартного динамического списка создадим реквизит формы с типом ТаблицаЗначений.
  2. Добавим в эту таблицу колонки, соответствующие реквизитам справочника.
  3. При открытии формы программно заполним эту таблицу данными из базы.
  4. Для таблицы на форме установим свойство РазрешитьВводСтрок.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура.Ссылка КАК Ссылка,
        |   Номенклатура.Наименование КАК Наименование,
        |   Номенклатура.Код КАК Код
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура";
    
    Результат = Запрос.Выполнить().Выгрузить();
    ЗначениеВРеквизитФормы(Результат, "МояТаблицаДанных");
КонецПроцедуры

При таком подходе при нажатии кнопки «Создать» будет просто добавляться новая строка в таблицу. Нам останется только прописать логику записи данных в базу при событии ПриОкончанииРедактирования строки.

Решение 2: Паттерн Master-Detail (Форма в форме)

Если нам нужно видеть список и одновременно иметь возможность быстрого ввода без открытия модальных окон, проанализируем вариант создания комбинированного интерфейса. Это наиболее современный и удобный для пользователя подход в среде 1С:Предприятие 8.3.

Разберем, как это реализовать:

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

Посмотрим на пример обработки выбора строки:


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

При нажатии кнопки «Создать» в таком интерфейсе мы можем просто очищать поля в правой части и устанавливать флаг «НовыйОбъект». При нажатии кнопки «Записать» данные будут программно сохраняться в справочник, а список слева — обновляться. Это создает иллюзию работы в одном окне, что и требуется пользователю.

Решение 3: Программное управление окном формы элемента

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

Рассмотрим программный перехват нажатия кнопки создания:


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

Важный момент: Чтобы стандартная кнопка «Создать» не срабатывала по-старому, необходимо в свойствах таблицы Список отключить стандартную команду или создать свою собственную кнопку, скрыв типовую.

Подведение итогов

Мы выяснили, что прямого аналога функции «Редактировать в списке» из обычных форм в управляемом интерфейсе нет, так как архитектура клиент-серверного взаимодействия накладывает свои ограничения. Однако, используя Таблицы значений для небольших списков или паттерн Master-Detail для сложных объектов, мы можем обеспечить пользователю высокую скорость ввода данных без лишних кликов и переключений между окнами.

Выбор конкретного метода зависит от объема данных: если в справочнике тысячи позиций — используйте Master-Detail с динамическим списком. Если это небольшая настроечная таблица — смело переходите на использование Таблицы значений.

← На главную