Почему форма записи регистра сведений без измерений открывается пустой и как это исправить?

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

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

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

Более того, если в открывшейся пустой форме ввести данные и нажать кнопку сохранения, платформа выдаст ошибку: «Запись с такими ключевыми полями уже существует». Когда же пользователь нажимает стандартную командную кнопку «Перечитать», вызывается метод Прочитать() основного реквизита формы Запись (тип РегистрСведенийМенеджерЗаписи). Поскольку отборов нет, менеджер записи считывает единственную имеющуюся в таблице строку и переводит форму в режим редактирования.

Рассмотрим подробнее способы решения этой проблемы.

Способ 1. Принудительное чтение данных при создании формы на сервере

Это наиболее прямое и надежное программное решение. Создадим явную форму записи в конфигураторе для данного регистра сведений и перейдем в ее модуль. Нам необходимо принудительно инициализировать менеджер записи данными из базы при формировании формы.

Разберем по шагам реализацию обработчика события ПриСозданииНаСервере:

  1. Откроем модуль формы записи регистра сведений.
  2. Найдем или добавим процедуру-обработчик ПриСозданииНаСервере.
  3. Вызовем метод Прочитать() у основного реквизита формы Запись.

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


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

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

Способ 2. Редактирование данных непосредственно в списке

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

Установим значение свойства Редактирование в В списке. Теперь при двойном щелчке или нажатии клавиши F2 в динамическом списке курсор активирует редактирование полей прямо в строке таблицы. Отдельная форма записи вызываться не будет, что полностью исключает описанную проблему с ключом записи.

Способ 3. Программное открытие формы с передачей пустого ключа записи

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

Посмотрим на пример вызова:


ПараметрыФормы = Новый Структура("Ключ", РегистрыСведений[ИмяРегистра].СоздатьКлючЗаписи(Новый Структура));
ОткрытьФорму("РегистрСведений." + ИмяРегистра + ".ФормаЗаписи", ПараметрыФормы);

Явная передача структуры ключа сообщает платформе, что требуется открыть существующую строку с пустым набором измерений, а не инициировать ввод новой записи.

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

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

  1. Использование объектов метаданных типа «Константа»: если в регистре хранится несколько настроек программы, логичнее вынести их в отдельные константы и расположить на общей форме настроек.
  2. Добавление технического измерения: если таблица в будущем будет хранить параметры в разрезе организаций, пользователей или типов настроек, имеет смысл добавить хотя бы одно измерение (например, КлючНастройки), что автоматически вернет стандартное поведение механизма ключей записей платформы 1С.
  3. Использование набора записей: для чтения и записи единственной строки можно использовать РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей() в рамках произвольной формы обработки, перезаписывая данные целиком без создания формы записи.
← На главную