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

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

В процессе разработки на платформе 1С часто возникает задача ускорить ввод данных. Стандартное поведение системы при работе с регистрами сведений предполагает открытие отдельного окна (формы записи) для каждого нового элемента. Однако для операторов, работающих с большими массивами информации, такой подход может быть неудобным. Для автоматизации рутинных операций и переноса данных между окнами без программирования можно настроить программного робота OneRPA для заполнения данных. В этой статье мы подробно разберем, как организовать ввод данных непосредственно в строках таблицы формы списка, имитируя работу в Excel.

Способ 1: Использование штатного свойства «Способ редактирования»

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

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

  1. Откройте конфигуратор и найдите нужный вам Регистр сведений.
  2. Перейдите на вкладку Основные.
  3. Найдите поле Способ редактирования. По умолчанию там установлено значение «В отдельном окне».
  4. Измените это значение на В списке.

Что это дает? Теперь при нажатии кнопки «Создать» в форме списка платформа не будет вызывать диалоговое окно. Вместо этого в таблице динамического списка появится пустая строка, где пользователь сможет сразу заполнить измерения и ресурсы. Это самый простой и эффективный способ, который работает для большинства независимых регистров. Если вместо ручного ввода данных планируется масштабная миграция, стоит изучить подбор решений для переноса данных 1С по тарифу PRO.

Способ 2: Замена Динамического списка на Таблицу значений

Иногда штатного механизма недостаточно. Например, если вам требуется сложная валидация данных «на лету» или вы хотите позволить пользователю сначала заполнить десять строк, а затем одним нажатием кнопки «Записать» сохранить их все. ДинамическийСписок не предназначен для массового редактирования, так как он напрямую связан с базой данных через запросы.

В такой ситуации мы применим архитектурный прием: заменим основной реквизит формы с ДинамическийСписок на ТаблицаЗначений. Рассмотрим, как это реализовать программно.

Сначала нам нужно загрузить данные при открытии формы. Проанализируем пример кода в обработчике ПриСозданииНаСервере:


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

Теперь пользователь может свободно редактировать ТаблицаДанных на форме. Чтобы сохранить изменения, нам потребуется создать команду (кнопку) «Записать» и прописать логику работы с набором записей.

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


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

Способ 3: Интерактивное управление через события Динамического списка

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

Выясним, как перехватить процесс добавления. У таблицы есть событие ПередНачаломДобавления. Мы можем программно вызвать МенеджерЗаписи, создать пустую запись с ключевыми полями и обновить список. Это заставит систему думать, что запись уже существует, и позволит редактировать её в строке.

Рассмотрим пример реализации:


&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметры)
    
    // Отменяем стандартное открытие формы записи
    Отказ = Истина;
    
    // Вызываем серверный метод для создания пустой «болванки» записи
    СоздатьПустуюЗаписьНаСервере();
    
    // Обновляем динамический список, чтобы увидеть новую строку
    Элементы.Список.Обновить();
    
КонецПроцедуры

В серверном методе СоздатьПустуюЗаписьНаСервере необходимо инициализировать минимальный набор измерений, чтобы запись могла существовать в базе данных (так как в регистре нельзя создать запись с абсолютно пустыми ключевыми полями, если их несколько).

Важные ограничения и особенности

Проанализируем ситуации, когда ввод в списке может быть затруднен:

Подведем итог: Для реализации быстрого ввода данных в управляемых формах 1С 8.3 наиболее предпочтительным является штатный метод изменения свойства Способ редактирования на «В списке». Если же логика требует предварительного накопления данных перед записью, следует использовать программную выгрузку в ТаблицаЗначений с последующим использованием объекта РегистрСведенийНаборЗаписей.

← На главную