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

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

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

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

Разберем по шагам, как построить надежный и профессиональный цикл «Чтение — Отображение — Запись» для работы с менеджером записи регистра сведений на управляемой форме справочника.

Шаг 1. Настройка реквизитов формы

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

  1. Откроем редактор управляемой формы элемента справочника и перейдем на вкладку Реквизиты (в правой части экрана).
  2. Добавим новый реквизит формы. Назовем его, например, ЗаписьРегистра.
  3. В свойствах созданного реквизита в поле Тип укажем: РегистрСведенийМенеджерЗаписи.[ИмяВашегоРегистра].
  4. Развернем созданный реквизит ЗаписьРегистра (нажав на плюс рядом с ним), выделим его измерения, ресурсы или реквизиты и перетащим их мышкой в левую часть редактора — на саму форму. Платформа автоматически создаст необходимые поля ввода.

Шаг 2. Реализация чтения данных при открытии формы

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

Рассмотрим подробнее, почему это важно. Обработчик ПриСозданииНаСервере срабатывает ровно один раз при инициализации формы. Если пользователь в процессе работы нажмет кнопку «Перечитать» на панели формы, данные самого справочника обновятся из базы данных, а вот связанные поля регистра останутся старыми или очистятся. Событие ПриЧтенииНаСервере вызывается каждый раз, когда форма считывает или перечитывает данные основного объекта из базы данных. Это обеспечивает актуальность информации на экране.

Посмотрим на пример реализации процедуры чтения данных:


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

Шаг 3. Реализация безопасной записи при сохранении элемента справочника

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

Идеальным местом для сохранения данных регистра является обработчик события формы ПриЗаписиНаСервере. Рассмотрим преимущества этого подхода:

Разберем пример кода для сохранения данных:


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

Альтернативное решение без программирования (для конфигураций на БСП)

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

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

← На главную