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