Как в 1С открыть разные формы для создания, изменения и копирования записи регистра сведений?

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

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

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

Решение проблемы через обработчик «ОбработкаПолученияФормы»

Платформа «1С:Предприятие» предоставляет стандартный и очень мощный механизм для динамического переопределения открываемых форм. Этот механизм работает на уровне бизнес-логики в модуле менеджера объекта. Рассмотрим подробный алгоритм решения нашей задачи.

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

Разберем по шагам логику, которую нам необходимо реализовать:

  1. Перейдем в конфигуратор, найдем нужный регистр сведений и откроем его модуль менеджера.
  2. Добавим шаблон предопределенной процедуры ОбработкаПолученияФормы.
  3. Внутри обработчика проанализируем параметры, с которыми система пытается открыть форму.
  4. Если это форма записи, и при этом у нас отсутствуют признаки изменения существующей записи или копирования, мы подменим стандартную форму на нашу кастомную форму создания.

Проанализируем готовый пример программного кода, который решает эту задачу:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    
    // Проверяем, что запрашивается именно форма записи регистра
    Если ВидФормы = "ФормаЗаписи" 
        И НЕ Параметры.Свойство("Ключ") 
        И НЕ ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
        
        // Переопределяем путь к форме на нашу специализированную форму для создания
        ВыбраннаяФорма = "РегистрСведений.МойРегистр.Форма.МояФормаДляСоздания";
        
        // Отменяем стандартную обработку платформы, чтобы применилась наша форма
        СтандартнаяОбработка = Ложь;
        
    КонецЕсли;
    
КонецПроцедуры

Давайте подробно разберем, как работает это условие. Переменная ВидФормы указывает платформе, какую именно форму запрашивает система. Нас интересует значение "ФормаЗаписи".

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

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

Технические нюансы параметров «Ключ» и «ЗначениеКопирования» в регистрах сведений

При работе с регистрами сведений важно помнить об их ключевом отличии от ссылочных типов данных (таких как справочники или документы). У регистра сведений нет уникального идентификатора (ссылки). Уникальность записи в регистре определяется набором значений его измерений (и периодом для периодических регистров).

В связи с этим тип значения параметра Ключ для регистра сведений — это не просто ссылка, а объект типа РегистрСведенийКлючЗаписи. Этот ключ формируется платформой автоматически на основе комбинации измерений.

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

Ограничения использования обработчика «ОбработкаПолученияФормы»

Несмотря на простоту реализации, этот метод имеет несколько жестких ограничений, о которых разработчик должен знать заранее:

Альтернативные UI/UX решения (без создания нескольких форм)

Создание и поддержка двух и более разных форм для одного и того же объекта метаданных — это популярный, но зачастую избыточный подход. Он существенно усложняет дальнейшую поддержку конфигурации. При добавлении нового реквизита в регистр вам придется дублировать элементы формы, прописывать обработчики событий, проверки заполнения и бизнес-логику на обеих формах. Рассмотрим более элегантные и надежные архитектурные решения.

Вариант А. Динамическое управление элементами на одной форме

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

Выясним, как это реализовать. В модуле формы в обработчике события ПриСозданииНаСервере мы анализируем, является ли запись новой. В зависимости от этого мы управляем видимостью и доступностью элементов формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, новая ли это запись
    ЭтоНоваяЗапись = НЕ Параметры.Свойство("Ключ");
    
    // Управляем видимостью групп и элементов на форме
    Элементы.ГруппаИнструкцияДляСоздания.Видимость = ЭтоНоваяЗапись;
    Элементы.ГруппаШаблоныЗаполнения.Видимость = ЭтоНоваяЗапись;
    
    Если НЕ ЭтоНоваяЗапись Тогда
        // Если запись редактируется, запретим менять ключевые измерения
        Элементы.ИзмерениеОрганизация.Доступность = Ложь;
        Элементы.ИзмерениеНоменклатура.Доступность = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Этот подход гарантирует, что вся логика работы с данными сосредоточена в одном модуле, что значительно упрощает рефакторинг и сопровождение программного кода.

Вариант Б. Использование многостраничного интерфейса (Мастера)

Если процесс создания записи действительно сложный и требует пошагового ввода информации (так называемый «Мастер» или Wizard), то лучшим решением будет использование панели страниц на форме.

Проанализируем этот сценарий:

  1. На форме создается элемент управления типа «Панель страниц» (без отображения закладок).
  2. Первая страница содержит поля для первоначального создания и заполнения («Шаг 1», «Шаг 2»).
  3. Вторая страница отображает стандартные поля для последующего просмотра и редактирования.
  4. При создании на сервере форма активирует первую страницу. После того как пользователь успешно заполнил данные и нажал кнопку «Записать», в обработчике события ПослеЗаписиНаСервере мы программно переключаем активную страницу формы на вторую.

Таким образом, пользователь получает бесшовный и интуитивно понятный интерфейс, а разработчик избавляется от необходимости открывать новые окна и передавать между ними параметры.

Вариант В. Сценарий быстрого пакетного ввода «Записать и создать новую»

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

Решением может стать создание кастомной команды «Записать и создать новую» на форме записи регистра:

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

Вариант Г. Использование специализированной обработки

Если бизнес-логика требует сложного группового ввода записей (например, распределение суммы по нескольким аналитикам одновременно), стандартная форма записи регистра сведений вообще не подходит для решения этой задачи. По стандартам разработки фирмы «1С» для таких задач следует создавать специализированную обработку.

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

← На главную