Как программно открыть журнал документов для выбора в 1С 8.3?

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

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

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


Выясняем причину: особенности работы управляемых форм в 1С 8.3

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

Если для справочника или документа в конфигураторе создана явная форма выбора, вызов метода ОткрытьФорму с указанием пути к ней отрабатывает без нареканий. Платформа сама понимает, что интерфейс должен работать в режиме подбора. Но с журналами документов ситуация обстоит иначе. Очень часто для журналов создают одну-единственную форму — форму списка, а отдельную форму выбора не делают. Платформа при попытке открыть форму выбора для такого журнала автоматически подставляет форму списка. Но эта форма списка по умолчанию "не знает", что ее открыли для выбора, поэтому двойной клик приводит к открытию документа.

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

Разберем детально несколько способов решения этой задачи.


Решение 1. Создание отдельной формы выбора в конфигураторе (Рекомендуемый стандарт)

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

Выполним следующие шаги:

  1. Откроем конфигуратор и найдем нужный журнал документов.
  2. Перейдем на вкладку "Формы" и нажмем кнопку добавления формы.
  3. В открывшемся конструкторе выберем тип формы — "Форма выбора".
  4. Нажмем "Готово". Платформа автоматически настроит основную таблицу формы (динамический список) и установит для нее свойство РежимВыбора в значение Истина, а также добавит кнопку "Выбрать" на командную панель.

После создания формы вызов из вашего кода (например, из события начала выбора реквизита табличной части) будет выглядеть следующим образом:


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

Решение 2. Использование универсальной формы списка (Настройка на сервере)

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

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

Рассмотрим по шагам логику работы кода:

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

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


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

Шаг 2. Обработка параметров на сервере в форме журнала

В модуле открываемой формы списка журнала документов (в обработчике ПриСозданииНаСервере) считываем переданный параметр и переводим элемент интерфейса "Список" (который связан с динамическим списком журнала) в режим выбора.


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

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


Решение 3. Использование БСП и кэширование настроек (Продвинутый уровень)

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

Для того чтобы разделить кэш настроек обычной формы и формы выбора, используется свойство КлючНазначенияИспользования. Если вы используете Библиотеку стандартных подсистем (БСП), рекомендуется дополнить серверную процедуру инициализации следующим кодом:


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

Если конфигурация разработана "с нуля" без БСП, вы можете задать этот ключ вручную обычной строкой:

КлючНазначенияИспользования = "РежимВыбора";


Решение 4. Современный асинхронный вызов формы выбора через оповещение

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

Для решения таких задач разберем современный асинхронный подход с использованием объекта ОписаниеОповещения.

Проанализируем пример кода:


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

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

Преимущества асинхронного подхода:

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

← На главную