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