Как открыть запись регистра сведений в 1С:Предприятие 8.3 без модальных окон?

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

В современной архитектуре 1С:Предприятия 8.3, особенно при работе с управляемыми формами и в веб-клиенте, использование модальных окон является устаревшим подходом и часто не рекомендуется или даже запрещено. Мы, как разработчики, регулярно сталкиваемся с задачей открытия формы записи регистра сведений для просмотра, редактирования или создания новой записи. Важно выполнить это корректно, используя немодальные механизмы платформы, чтобы обеспечить наилучший пользовательский опыт и совместимость с различными типами клиентов.

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

Основные подходы к открытию формы записи регистра сведений

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

  1. Открытие стандартной формы записи для существующей записи

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

    Шаг 1: Формирование КлючаЗаписи

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

    Рассмотрим пример формирования КлючаЗаписи:

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

    Если мы уже имеем объект РегистрСведенийЗапись (например, как результат выборки из запроса или из таблицы значений), мы можем получить его ключ значительно проще:

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

    Шаг 2: Открытие формы с передачей КлючаЗаписи

    После того как мы успешно сформировали КлючЗаписи, мы можем использовать его в качестве параметра для метода ОткрытьФорму(). Этот метод является основным инструментом для немодального открытия форм в управляемом приложении.

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

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

  2. Открытие формы для создания новой записи

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

    Открытие совершенно пустой формы

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

    
    // Открываем стандартную форму записи без параметров.
    // Система автоматически поймет, что нужно создать новую запись.
    ОткрытьФорму("РегистрСведений.ИзменениеСтатусовДокументов.ФормаЗаписи");
    

    Открытие формы для новой записи с предварительно заполненными полями

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

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

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

  3. Универсальные методы ОткрытьЗначение() и ПоказатьЗначение()

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

    Мы можем использовать их, если у нас уже есть ссылка на объект РегистрСведенийЗапись или РегистрСведенийКлючЗаписи:

    
    // Допустим, переменная ЗаписьРегистра содержит объект ЗаписьРегистраСведений.<ИмяРегистра>
    // Например, мы получили его из выборки или функции.
    ПоказатьЗначение(ЗаписьРегистра);
    
    // Или, если у нас есть только КлючЗаписи:
    ПоказатьЗначение(КлючЗаписи);
    

    Хотя эти методы удобны своей универсальностью, они предоставляют меньше контроля над процессом открытия формы и передачей специфических параметров по сравнению с прямым вызовом ОткрытьФорму(). Однако в простых сценариях, когда требуется просто показать объект, они являются эффективным решением.

Работа с "внешней формой" регистра сведений

Термин "внешняя форма" в контексте 1С может иметь несколько толкований. Мы проанализируем основные сценарии, чтобы внести ясность.

  1. Внешняя форма, как пользовательская форма внутри конфигурации

    Если под "внешней формой" мы подразумеваем форму, которую мы разработали специально для нашего регистра сведений непосредственно в конфигурации (то есть это не стандартная ФормаЗаписи, а форма с пользовательским именем, например, Форма.МояСпециализированнаяФормаЗаписи), то ее открытие происходит аналогично описанным выше методам. Мы используем метод ОткрытьФорму(), указывая полное имя нашей пользовательской формы.

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

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

  2. Внешняя форма, как форма внешней обработки или отчета

    Если же речь идёт о форме, которая является частью внешней обработки (файл .epf) или внешнего отчета (файл .erf) и предназначена для работы с регистром сведений, то эта внешняя обработка или отчет должна быть предварительно зарегистрирована и доступна в системе (например, через справочник "Дополнительные отчеты и обработки").

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

    Пример сценария из внешней обработки:

    Представим, что у нас есть внешняя обработка, которая анализирует список документов. Для каждой строки в списке документов мы хотим предоставить пользователю возможность изменить статус, который хранится в регистре сведений. При нажатии на кнопку "Изменить статус" в таблице внешней обработки, мы можем:

    1. Получить ссылку на документ из текущей строки таблицы внешней обработки.

    2. Найти соответствующую запись в регистре сведений "ИзменениеСтатусовДокументов" по ссылке на документ и, возможно, по дате.

    3. Сформировать КлючЗаписи для найденной записи (или для создания новой, если запись не найдена).

    4. Открыть стандартную или пользовательскую форму записи регистра сведений, передав ей сформированный КлючЗаписи или предварительно заполнив поля.

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

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

Ключевые моменты и рекомендации

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

  1. Избегайте модальных окон. Это критически важно. В управляемом приложении 1С:Предприятие 8.3 мы должны всегда отдавать предпочтение методу ОткрытьФорму() вместо ОткрытьФормуМодально(). Модальные окна блокируют взаимодействие пользователя с остальным интерфейсом приложения и абсолютно несовместимы с веб-клиентом, что является серьезным ограничением для кроссплатформенных решений.

  2. Используйте РегистрСведенийКлючЗаписи. Этот объект является краеугольным камнем для идентификации и работы с конкретными записями регистров сведений. Правильное его формирование – залог успешного открытия нужной записи.

  3. Учитывайте все измерения. При формировании КлючаЗаписи или при поиске записи по измерениям, мы должны обязательно указывать значения для всех измерений регистра. Регистр сведений уникально идентифицируется по комбинации значений всех его измерений. Неполный ключ приведет к некорректному поведению или ошибкам, так как платформа не сможет однозначно найти или определить запись.

  4. Обработка ошибок и сценарии "запись не найдена". Мы всегда должны предусматривать ситуации, когда запись не найдена по переданному ключу. В таких случаях можно улучшить пользовательский опыт, предложив открыть форму для создания новой записи, автоматически заполнив ее данными из того же ключа, который не был найден. Это минимизирует ручной ввод для пользователя и делает приложение более "интеллектуальным".

  5. Передача дополнительных параметров. Помимо КлючаЗаписи, мы можем передавать в открываемую форму и другие полезные параметры. Например, режим открытия формы (только просмотр или редактирование), флаг, указывающий на источник открытия, или любые другие данные, которые наша форма может использовать для своей инициализации и логики. Для этого достаточно добавить нужные пары "ИмяПараметра" - "Значение" в структуру параметров, передаваемую в ОткрытьФорму().

  6. Автоматические формы и команды. Платформа 1С:Предприятие автоматически генерирует стандартные формы и команды для работы с регистрами сведений (например, команды для создания, открытия, копирования записей). Мы можем использовать эти автоматические формы "как есть", что значительно ускоряет разработку, или создавать собственные, более функциональные и специализированные формы, когда стандартных возможностей недостаточно.

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

← На главную