Разработка и Конфигурация · 11 мин
Как открыть форму записи регистра сведений в 1С 8.3
Способы открыть форму записи регистра сведений в 1С 8.3: через ОткрытьФорму, ОткрытьФормуМодально, ключ записи и отборы. Примеры кода, ошибки и FAQ.
Регистр сведений в 1С 8.3 хранит данные в виде набора записей, и у каждой записи есть собственная форма. Открыть её можно несколькими способами: интерактивно из списка регистра, программно через метод ОткрытьФорму с ключом записи или с отбором, а также через создание новой записи без ключа. Выбор способа зависит от того, подчинён ли регистр регистратору, есть ли у него периодичность и какая задача стоит — редактирование существующей записи или добавление новой.
Главная сложность для начинающих разработчиков — правильно сформировать ключ записи. Ключ записи регистра сведений строится по измерениям (и периоду, если регистр периодический), и если передать неполный или неверный набор значений, форма либо не откроется, либо откроется пустой. Ниже разобраны рабочие варианты кода для управляемых форм, типичные ошибки и способы проверки результата.
Все примеры приведены для управляемого приложения (такой режим используется в большинстве современных конфигураций). Для обычного приложения синтаксис отличается, и об этом сказано отдельно.
Как устроена форма записи регистра сведений
У регистра сведений есть два основных вида форм: форма списка (таблица всех записей) и форма записи (карточка одной записи с полями измерений, ресурсов и реквизитов). Форма записи существует только для независимых регистров сведений — тех, что не подчинены регистратору. Если регистр подчинён регистратору, его записи создаются и редактируются только через документ-регистратор, и отдельной формы записи у такого регистра нет.
Проверить режим записи можно в конфигураторе: откройте свойства регистра сведений и посмотрите поле «Режим записи». Значение «Независимый» означает, что программное и интерактивное открытие формы записи доступно. Значение «Подчинение регистратору» закрывает эту возможность — попытка открыть форму записи приведёт к ошибке.
Ещё одно важное свойство — «Периодичность». Для периодического регистра в ключ записи обязательно входит поле «Период», для непериодического — только измерения. Это напрямую влияет на формирование ключа записи в коде.
Интерактивное открытие формы записи
Самый простой способ — без программирования. В пользовательском режиме откройте список регистра сведений через раздел, куда его вывел разработчик, либо через «Все функции» (меню с пиктограммой в левом верхнем углу → «Все функции» → «Регистры сведений» → нужный регистр). Двойной щелчок по строке списка или кнопка «Изменить» откроет форму записи выбранной строки.
Кнопка «Создать» в форме списка открывает пустую форму новой записи. Если пункт «Все функции» недоступен, значит, у пользователя нет соответствующих прав или администратор скрыл этот пункт — в этом случае обратитесь к администратору базы, а не пытайтесь обойти ограничение.
Интерактивный способ подходит для разового просмотра и ручного редактирования. Для автоматизации — например, чтобы по кнопке в документе открывалась связанная запись регистра — нужен программный вызов.
Программное открытие формы существующей записи
Для открытия формы конкретной записи используется метод ОткрытьФорму с параметром «Ключ». Ключ формируется через менеджер регистра: сначала создаётся структура отбора по измерениям (и периоду), затем вызывается метод СоздатьКлючЗаписи.
&НаКлиенте
Процедура ОткрытьЗапись(Команда)
Отбор = Новый Структура;
Отбор.Вставить("Период", Дата(2026, 1, 15));
Отбор.Вставить("Номенклатура", ТекущаяНоменклатура);
КлючЗаписи = ПолучитьКлючЗаписи(Отбор);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", КлючЗаписи);
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи", ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКлючЗаписи(Отбор)
Возврат РегистрыСведений.ЦеныНоменклатуры.СоздатьКлючЗаписи(Отбор);
КонецФункции
Обратите внимание: создание ключа записи — серверная операция, поэтому в клиент-серверном режиме её выносят в серверную функцию. Вызов СоздатьКлючЗаписи напрямую в клиентском коде недоступен в тонком и веб-клиенте.
Если запись с переданным ключом существует, форма откроется с её данными. Если записи нет, платформа откроет форму новой записи с заполненными измерениями из ключа — это штатное поведение, а не ошибка, и его нужно учитывать в логике.
Отбор = Новый Структура("Номенклатура", СсылкаНаНоменклатуру);
Ключ = РегистрыСведений.Штрихкоды.СоздатьКлючЗаписи(Отбор);
ПараметрыФормы = Новый Структура("Ключ", Ключ);
ОткрытьФорму("РегистрСведений.Штрихкоды.ФормаЗаписи", ПараметрыФормы);Открытие формы новой записи
Чтобы открыть форму для создания записи, параметр «Ключ» не передают вовсе. Достаточно указать имя формы:
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи");
Часто новую запись нужно открыть с уже заполненными полями — например, подставить текущего контрагента или дату. Для этого служит параметр «ЗначенияЗаполнения», принимающий структуру:
Значения = Новый Структура;
Значения.Вставить("Номенклатура", ТекущаяНоменклатура);
Значения.Вставить("Период", ТекущаяДатаСеанса());
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", Значения);
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи", ПараметрыФормы);
Записи в базе при этом ещё не существует — она появится только после нажатия пользователем кнопки «Записать» или «Записать и закрыть». Это безопасный способ: до явного сохранения данные регистра не меняются.
Открытие формы с отбором и модальное открытие
Если нужно открыть не одну запись, а список с отбором (например, все цены по конкретной номенклатуре), используется форма списка с параметром «Отбор»:
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ТекущаяНоменклатура);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Отбор);
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаСписка", ПараметрыФормы);
Из такого списка пользователь сам откроет нужную запись двойным щелчком. Это удобно, когда заранее неизвестно, какая именно запись нужна, или когда их несколько.
Для сценариев, где дальнейшая работа должна продолжиться только после закрытия формы записи, применяют ОткрытьФормуМодально либо асинхронный вариант с описанием оповещения. В современных версиях платформы модальный режим ограничен, поэтому рекомендуется передавать описание оповещения в ОткрытьФорму:
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияЗаписи", ЭтотОбъект);
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи", ПараметрыФормы,
ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Сравнение способов открытия
Открывает конкретную существующую запись. Требует точного отбора по всем измерениям и периоду.
Открывает форму новой записи. Измерения можно предзаполнить через ЗначенияЗаполнения.
Подходит, когда записей несколько и пользователь должен выбрать нужную вручную.
Блокирует работу до закрытия формы. В новых версиях платформы заменяется описанием оповещения.
Особенности для обычного приложения и внешних обработок
В обычном приложении (толстый клиент, режим обычных форм) используется другой подход: получение формы через ПолучитьФорму с последующим вызовом Открыть() или ОткрытьМодально():
Отбор = Новый Структура("Номенклатура", ТекущаяНоменклатура);
Ключ = РегистрыСведений.Штрихкоды.СоздатьКлючЗаписи(Отбор);
ФормаЗаписи = РегистрыСведений.Штрихкоды.ПолучитьФорму("ФормаЗаписи");
ФормаЗаписи.КлючЗаписи = Ключ;
ФормаЗаписи.Открыть();
Во внешних обработках и отчётах, открываемых через «Файл → Открыть», программный вызов формы записи работает так же, как и внутри конфигурации, — ограничений со стороны платформы нет. Убедитесь только, что обработка запускается в том же режиме (управляемое или обычное приложение), под который написан код.
Если регистр сведений входит в план обмена или на него действуют ограничения доступа на уровне записей (RLS), форма может открыться с неполными данными или не открыться вовсе. Это не ошибка кода, а следствие настроек прав — проверяйте роли пользователя.
Проверка результата и типичные ошибки
После открытия формы убедитесь, что она показывает именно те данные, которые ожидались. Для существующей записи поля ресурсов должны быть заполнены значениями из базы; для новой — пустыми, кроме предзаполненных измерений.
Как проверить результат
Поля измерений совпадают с переданным отбором, ресурсы заполнены данными существующей записи
Форма пустая или измерения не совпадают — ключ сформирован неверно
После «Записать и закрыть» в списке регистра появилась/изменилась одна строка
Появилась дублирующая запись — значит, открывалась новая запись вместо существующей
Дата записи точно равна переданной, включая время
Запись не находится — даты различаются на секунды
Частая ситуация: разработчик передаёт в отбор дату функцией ТекущаяДата(), а запись в базе создана с другим временем. Из-за расхождения в секундах ключ не совпадает, и вместо редактирования открывается форма новой записи. Если затем пользователь нажмёт «Записать», в регистре появится дубль. Для поиска существующей записи берите период из самих данных — запросом или через менеджер записи.
FAQ
Как открыть форму записи, если регистр подчинён регистратору?
Напрямую — никак: у таких регистров нет самостоятельной формы записи. Записи создаются и меняются только через документ-регистратор. Откройте форму соответствующего документа либо форму списка регистра с отбором по регистратору для просмотра.
Можно ли открыть форму записи без ключа, если запись уже существует?
Можно, но форма откроется в режиме создания новой записи. При попытке записать с теми же значениями измерений (и периода) платформа выдаст ошибку нарушения уникальности. Для редактирования всегда передавайте ключ существующей записи.
Почему СоздатьКлючЗаписи вызывает ошибку в тонком клиенте?
Этот метод выполняется только на сервере. Вынесите создание ключа в серверную функцию общего модуля или в серверную процедуру формы, а на клиент передавайте уже готовый ключ.
Как открыть форму записи и сразу записать её без участия пользователя?
Для записи без интерактивного действия форма не нужна: используйте менеджер записи — РегистрыСведений.Имя.СоздатьМенеджерЗаписи(), заполните поля и вызовите метод Записать(). Форму открывают только когда требуется ввод или подтверждение пользователем.
Как открыть форму записи по нажатию кнопки в списке регистра?
В форме списка добавьте команду, в её обработчике получите данные текущей строки (Элементы.Список.ТекущиеДанные), сформируйте структуру отбора по измерениям и вызовите ОткрытьФорму с ключом, как в примерах выше. Стандартная кнопка «Изменить» уже делает это без программирования.
Что важно запомнить
Форма записи существует только у независимых регистров сведений. Существующую запись открывают через ОткрытьФорму с параметром «Ключ», сформированным методом СоздатьКлючЗаписи на сервере по всем измерениям и периоду. Новую запись открывают без ключа, предзаполняя поля через ЗначенияЗаполнения. Проверяйте точность отбора, особенно дату периодического регистра, чтобы не создать дубли.