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