При переходе с «обычных форм» (1С 7.7 или 8.2) на «управляемые формы» разработчики и пользователи часто сталкиваются с изменением привычного поведения интерфейса. Одним из таких камней преткновения является режим «Редактировать в списке». В управляемом интерфейсе по умолчанию создание нового элемента всегда открывает отдельное диалоговое окно. Рассмотрим подробнее, почему так происходит и какими способами мы можем добиться поведения, максимально приближенного к редактированию в таблице.
Прежде чем приступать к сложному программированию, проанализируем стандартные настройки объекта в конфигураторе. У каждого справочника существует свойство «Способ редактирования». Оно может принимать значения:
Важно понимать, что в управляемых формах выбор варианта В списке работает не так прямолинейно, как в старых версиях. Если основной таблицей формы является ДинамическийСписок, полноценного «Excel-подобного» ввода данных может не получиться из-за архитектурных особенностей работы с базой данных. Однако установку этого свойства следует считать первым шагом.
Разберем ситуацию, когда нам принципиально важно редактировать данные в строках. Основная проблема в том, что ДинамическийСписок предназначен для быстрого отображения данных через SQL-запросы, но он не хранит данные в оперативной памяти формы для редактирования. Чтобы обойти это ограничение, мы можем заменить тип данных основной таблицы формы.
Выясним алгоритм действий:
ТаблицаЗначений.РазрешитьВводСтрок.Рассмотрим пример кода для загрузки данных:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить().Выгрузить();
ЗначениеВРеквизитФормы(Результат, "МояТаблицаДанных");
КонецПроцедуры
При таком подходе при нажатии кнопки «Создать» будет просто добавляться новая строка в таблицу. Нам останется только прописать логику записи данных в базу при событии ПриОкончанииРедактирования строки.
Если нам нужно видеть список и одновременно иметь возможность быстрого ввода без открытия модальных окон, проанализируем вариант создания комбинированного интерфейса. Это наиболее современный и удобный для пользователя подход в среде 1С:Предприятие 8.3.
Разберем, как это реализовать:
ДинамическийСписок.ПриАктивизацииСтроки.Посмотрим на пример обработки выбора строки:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Передаем данные на сервер для заполнения полей редактирования
ОбновитьПоляРедактирования(ТекущиеДанные.Ссылка);
КонецПроцедуры
При нажатии кнопки «Создать» в таком интерфейсе мы можем просто очищать поля в правой части и устанавливать флаг «НовыйОбъект». При нажатии кнопки «Записать» данные будут программно сохраняться в справочник, а список слева — обновляться. Это создает иллюзию работы в одном окне, что и требуется пользователю.
Выясним причину, по которой стандартное окно «Создать» кажется неудобным — оно часто блокирует основной список. В платформе 8.3 мы можем управлять режимом открытия окна. Если мы хотим, чтобы форма создания не выскакивала «поверх» всего, а была прикреплена, используем параметр ВариантОткрытияОкна.
Рассмотрим программный перехват нажатия кнопки создания:
&НаКлиенте
Процедура КомандаСоздать(Команда)
ПараметрыФормы = Новый Структура;
// Указываем, что форму нужно открыть внутри текущего интерфейса
ДопПараметры = Новый Структура;
ДопПараметры.Вставить("ВариантОткрытияОкна", ВариантОткрытияОкна.Прикрепленное);
ОткрытьФорму("Справочник.Товары.ФормаОбъекта", ПараметрыФормы, Элементы.Список, , ДопПараметры);
КонецПроцедуры
Важный момент: Чтобы стандартная кнопка «Создать» не срабатывала по-старому, необходимо в свойствах таблицы Список отключить стандартную команду или создать свою собственную кнопку, скрыв типовую.
Мы выяснили, что прямого аналога функции «Редактировать в списке» из обычных форм в управляемом интерфейсе нет, так как архитектура клиент-серверного взаимодействия накладывает свои ограничения. Однако, используя Таблицы значений для небольших списков или паттерн Master-Detail для сложных объектов, мы можем обеспечить пользователю высокую скорость ввода данных без лишних кликов и переключений между окнами.
Выбор конкретного метода зависит от объема данных: если в справочнике тысячи позиций — используйте Master-Detail с динамическим списком. Если это небольшая настроечная таблица — смело переходите на использование Таблицы значений.