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