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

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

При разработке в 1С часто возникает задача модифицировать отдельную запись регистра сведений непосредственно из формы списка — например, заполнить новый реквизит или пересчитать ресурс для выбранной строки. Рассмотрим подробно, как правильно получить текущую запись, прочитать ее данные в объект РегистрСведенийМенеджерЗаписи, изменить нужные реквизиты и сохранить результат в базе данных.

Использование менеджера записи в обычных формах

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

Разберем по шагам порядок действий:

  1. Создаем объект РегистрСведенийМенеджерЗаписи с помощью метода СоздатьМенеджерЗаписи() соответствующего регистра.
  2. Копируем ключевые поля из текущей строки списка в менеджер записи.
  3. Вызываем метод Прочитать() для загрузки текущих ресурсов и реквизитов из базы данных.
  4. Проверяем факт существования записи через свойство Выбран().
  5. Заполняем требуемые поля и вызываем метод Записать().

Посмотрим на пример программного кода:


// Создаем объект для точечной работы с записью
Запись = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();

// Заполняем измерения из текущей строки таблицы формы
ЗаполнитьЗначенияСвойств(Запись, ЭлементыФормы.РегистрСведенийСписок.ТекущаяСтрока);

// Считываем существующие данные записи из базы
Запись.Прочитать();

Если Запись.Выбран() Тогда
    // Заполняем или изменяем нужный реквизит / ресурс
    Запись.Комментарий = "Проверено";
    
    // Записываем изменения (по умолчанию Замещать = Истина)
    Запись.Записать();
КонецЕсли;

Особенности работы в управляемых формах (клиент-сервер)

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

Разберем реализацию с разделением контекста:


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

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

Важно: Если вы получаете данные не через свойство ТекущаяСтрока, а через Элементы.Список.ТекущиеДанные, убедитесь, что все измерения регистра сведений присутствуют в запросе динамического списка или для них установлено свойство Использовать всегда. Если хотя бы одно ключевое измерение пропущено, менеджер записи не сможет однозначно идентифицировать строку в базе данных.

Важные нюансы и ограничения платформы

Выясним причину возможных ошибок при программном изменении записей:

  1. Проверка существования записи: Всегда проверяйте результат метода Прочитать() свойством Выбран(). Если запись была параллельно удалена или передан неполный состав измерений, свойство вернет Ложь. Вызов Записать() без этой проверки может привести к созданию некорректной пустой записи.
  2. Изменение ключевых полей (измерений): Объект РегистрСведенийМенеджерЗаписи предназначен для модификации ресурсов и реквизитов. Если изменить значение измерения в уже прочитанном менеджере записи и вызвать Записать(), платформа создаст новую запись с новым ключом, а старая запись останется в регистре без изменений. Для смены измерений требуется удалять прежнюю запись и создавать новую, либо использовать РегистрСведенийНаборЗаписей.

Альтернативные способы изменения данных

Если требуется решить схожую задачу другими средствами, рассмотрим следующие альтернативы:

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