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

Программист IT и автоматизация бизнеса
← На главную

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

В этой статье мы разберем, почему так происходит, изучим механизмы работы платформы с ключами записей и найдем элегантное программное решение этой задачи.

Причина проблемы: отсутствие ключа записи

Для начала проанализируем ситуацию с точки зрения архитектуры платформы. В 1С любая форма записи объекта (будь то справочник, документ или регистр) инициализируется на основании Ключа записи. Для регистра сведений ключ формируется из значений его измерений (и периода, если регистр периодический).

Если у регистра сведений нет ни одного измерения, то уникальный идентификатор записи (ключ) фактически отсутствует или является пустым. Когда мы пытаемся открыть форму записи из списка, управляемая форма не может автоматически сопоставить строку в базе данных с объектом на форме, так как "связующее звено" в виде измерений отсутствует. В результате система считает, что мы хотим создать новую запись, и подсовывает нам пустые поля ресурсов.

Решение №1: Использование метода Прочитать() в форме записи

Самый эффективный и простой способ заставить форму "увидеть" существующие данные — это принудительно прочитать их из базы данных при создании формы на сервере. Рассмотрим подробнее, как это реализовать.

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

Разберем по шагам код реализации:


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

Важный нюанс: Этот метод работает безотказно, потому что в регистре без измерений может существовать только одна запись. Метод Прочитать() просто заполняет значения ресурсов из этой единственной строки таблицы БД.

Решение №2: Оптимизация интерфейса (Общая команда)

Зачастую для регистра настроек форма списка вообще не требуется, так как запись всего одна. В этом случае мы можем улучшить пользовательский опыт, запретив стандартные команды и создав прямую ссылку на редактирование настроек. Проанализируем этот подход:

  1. В свойствах регистра сведений установим параметр Использовать стандартные команды в значение Ложь. Это скроет регистр из интерфейса (панели навигации).
  2. Создадим новую Общую команду (или команду самого регистра) с заголовком "Настройки параметров".
  3. В модуле команды пропишем код для открытия формы записи напрямую, минуя список.

Пример кода для команды:


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

При таком подходе в сочетании с кодом из Решения №1 пользователь будет сразу попадать в форму редактирования констант, что значительно сокращает количество кликов и исключает путаницу со списком записей.

Альтернативные варианты архитектуры

Выясним причины, по которым иногда стоит отказаться от регистра без измерений в пользу других объектов:

Резюме

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

← На главную