Как при открытии формы существующей записи 1С подставить новые значения?

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

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

Проанализируем типичную ситуацию. У нас есть регистр сведений, и мы хотим открыть форму конкретной записи, но при этом подставить в поля "Ресурс1" и "Реквизит1" новые значения. Интуитивно кажется, что для этого можно использовать параметр ЗначенияЗаполнения метода ОткрытьФорму, но на практике это не работает. Давайте выясним причину и рассмотрим правильное решение.

Почему параметр «ЗначенияЗаполнения» не работает для существующих объектов

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

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

Правильное решение: передача пользовательских параметров и их обработка в форме

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

Разберем этот процесс по шагам.

  1. Подготовка параметров и вызов формы

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

Важный момент: имя для нашей структуры с данными нужно выбрать такое, чтобы оно не пересекалось со стандартными параметрами платформы (такими как Ключ, Владелец, Основание и т.д.). Хорошей практикой является использование префиксов или осмысленных имен, например, ДанныеДляИзменения или НовыеЗначенияРеквизитов.

Посмотрим на пример кода для вызова формы:


// Предполагается, что переменная КлючЗаписи уже содержит
// ключ существующей записи регистра сведений.
// Например, его можно получить так:
// КлючЗаписи = Новый Структура("Измерение1", "НужноеЗначениеИзмерения");

// 1. Создаем основную структуру параметров для метода ОткрытьФорму()
ПараметрыФормы = Новый Структура;

// 2. Вставляем ключ записи, которую нужно открыть.
// Это говорит платформе, что мы открываем существующий объект, а не новый.
ПараметрыФормы.Вставить("Ключ", КлючЗаписи);

// 3. Создаем вложенную структуру с нашими новыми значениями.
// Имена свойств в этой структуре должны совпадать с именами реквизитов в 1С.
СтруктураНовыхЗначений = Новый Структура;
СтруктураНовыхЗначений.Вставить("Ресурс1", "Это новое значение для ресурса");
СтруктураНовыхЗначений.Вставить("Реквизит1", '20250315'); // Дату лучше передавать в универсальном формате

// 4. Вставляем нашу структуру в основные параметры под уникальным именем.
ПараметрыФормы.Вставить("ДанныеДляИзменения", СтруктураНовыхЗначений);

// 5. Открываем форму, передавая подготовленные параметры.
ОткрытьФорму("РегистрСведений.КИ.ФормаЗаписи", ПараметрыФормы);
  1. Обработка параметров в модуле формы

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

В этом обработчике мы получаем доступ к объекту Параметры, который содержит все, что мы передали при вызове ОткрытьФорму. Здесь мы должны проверить, была ли передана наша структура ДанныеДляИзменения, и если да, то применить ее значения к основному реквизиту формы — Запись.

Посмотрим, как будет выглядеть код в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Сначала выполняется стандартная логика платформы:
    // чтение данных записи из базы данных по переданному Ключу.
    // На этом этапе реквизит "Запись" уже заполнен старыми данными.

    // Теперь наша логика: проверяем, переданы ли нам параметры для изменения.
    // Используем метод Свойство() для безопасной проверки наличия параметра.
    Если Параметры.Свойство("ДанныеДляИзменения") Тогда
    
        // Если параметр есть, извлекаем его значение (нашу структуру)
        СтруктураНовыхЗначений = Параметры.ДанныеДляИзменения;
        
        // Используем стандартный метод для заполнения реквизитов объекта из структуры.
        // Этот метод автоматически сопоставит имена свойств структуры
        // с именами реквизитов объекта "Запись" и присвоит значения.
        // Это самый удобный и рекомендуемый способ.
        ЗаполнитьЗначенияСвойств(Запись, СтруктураНовыхЗначений);
        
        // Альтернативный вариант - ручное присваивание.
        // Он может понадобиться, если требуется дополнительная логика или преобразование типов.
        // Запись.Ресурс1 = СтруктураНовыхЗначений.Ресурс1;
        // Запись.Реквизит1 = СтруктураНовыхЗначений.Реквизит1;
        
    КонецЕсли;

КонецПроцедуры

После выполнения этого кода форма будет передана на клиент уже с новыми значениями в полях. Пользователь увидит "Это новое значение для ресурса" и дату "15.03.2025", сможет внести дальнейшие правки и нажать "Записать и закрыть", чтобы сохранить изменения в базе данных.

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

← На главную