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