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

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

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

Введение: Понимание проблемы с типовыми кнопками на динамическом списке

Представим ситуацию: мы создали динамический список для отображения данных, например, из какого-либо регистра. Нам нужно, чтобы на этом списке появились типовые кнопки "Создать", "Копировать", "Изменить", "Удалить" и т.д., как это принято в стандартных журналах документов. Мы выясняем, что для их появления достаточно указать основную таблицу для динамического списка. Но после этого обнаруживается, что кнопка "Создать" открывает не форму выбора типа документа или форму конкретного документа, а форму элемента регистра. Это явно не то поведение, которое мы ожидаем от полноценного журнала документов.

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

Шаг 1: Отображение типовых кнопок на динамическом списке

Первый шаг, как правило, интуитивно понятен и достаточно прост. Чтобы типовые кнопки для работы с элементами (такие как "Создать", "Изменить", "Копировать", "Пометить на удаление/Снять пометку", "Удалить") появились на командной панели динамического списка, нам необходимо правильно настроить его свойства. Основное требование здесь — указать основную таблицу или основной объект для динамического списка.

  1. Перейдите в конфигураторе к форме, на которой размещен ваш динамический список.
  2. Выберите элемент формы "Динамический список".
  3. В окне "Свойства" найдите свойство ОсновнаяТаблица или ОсновнойОбъект (в зависимости от версии платформы и типа списка).
  4. Укажите в этом свойстве ссылку на таблицу базы данных, которая является основным источником данных для вашего списка. Например, если список выводит документы, то это будет Документ.ИмяДокумента или ЖурналДокументов.ИмяЖурнала. Если это регистр, то РегистрСведений.ИмяРегистра.

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

Шаг 2: Анализ некорректной работы кнопки "Создать"

Теперь мы сталкиваемся с основной проблемой: кнопки появились, но кнопка "Создать" отрабатывает не так, как в типовых журналах документов. Вместо того чтобы предложить нам выбор из нескольких видов документов (например, "Приходный кассовый ордер" или "Расходный кассовый ордер" для кассового журнала) или открыть сразу форму нового документа конкретного типа, она открывает форму записи регистра. Почему так происходит?

Проанализируем ситуацию: это происходит потому, что наш динамический список, скорее всего, привязан напрямую к регистру, а не к специальному объекту метаданных "Журнал документов". Платформа 1С очень умна и старается действовать логично: если вы указали в качестве основного объекта регистр, то она предполагает, что при создании нового элемента вы хотите создать новую запись именно этого регистра. Форма, которая открывается в этом случае, является формой элемента регистра, предназначенной для ввода данных регистра.

Этот нюанс очень важен. В то время как РегистрСведений (или РегистрНакопления, РегистрБухгалтерии) служит для хранения структурированных данных, документы представляют собой события хозяйственной деятельности и обладают своей собственной логикой поведения и представления. Типовой функционал создания документов с выбором типа реализуется через другой механизм.

Шаг 3: Корректное решение — использование объекта "Журнал документов"

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

Рассмотрим по шагам, как правильно использовать ЖурналДокументов:

  1. Создание объекта ЖурналДокументов в конфигураторе:

    Откройте конфигуратор, перейдите в ветку "Журналы документов" в дереве объектов конфигурации и создайте новый журнал (или используйте существующий, если он подходит по смыслу). Дайте ему осмысленное имя, например, ЖурналКассовыхДокументов или ЖурналРеестрДокументов, если это реестр документов.

  2. Указание видов документов, входящих в журнал:

    После создания журнала перейдите на вкладку "Данные" в его свойствах. Здесь вы увидите список, куда можно добавить все виды документов, которые должны входить в этот журнал и отображаться в едином списке. Для каждого вида документа, который вы хотите видеть в этом журнале, добавьте новую строку и выберите соответствующий объект метаданных Документ.ИмяДокумента.

    Например, если вы создаете журнал для кассовых документов, вы добавите сюда Документ.ПриходныйКассовыйОрдер и Документ.РасходныйКассовыйОрдер.

  3. Связывание динамического списка с ЖурналомДокументов:

    Теперь вернитесь к вашей форме с динамическим списком. В свойствах динамического списка в качестве ОсновнойТаблицы (или ОсновногоОбъекта) укажите не регистр, а только что созданный или настроенный ЖурналДокументов.

    Например, если ваш динамический список называется Список, а журнал документов ЖурналРеестрДокументов, то в свойстве ОсновнаяТаблица списка Список укажите ЖурналДокументов.ЖурналРеестрДокументов.

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

Шаг 4: Альтернативное решение — программная реализация (для списков на регистрах)

В некоторых случаях, возможно, мы не можем (или не хотим) использовать объект ЖурналДокументов, например, если наш динамический список жестко привязан к регистру и менять эту привязку нецелесообразно по каким-либо архитектурным причинам. В таком сценарии для реализации выбора различных видов документов при нажатии кнопки "Создать" потребуется программная доработка.

Выясним, как это можно реализовать:

  1. Создание собственной кнопки на форме:

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

  2. Реализация обработчика события Нажатие для кнопки:

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

    Примерная логика действий в обработчике будет следующей:

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

Посмотрим на примерный код для обработчика кнопки "Создать":


&НаКлиенте
Процедура СоздатьДокументНажатие(Кнопка)

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

    // 2. Вызов формы выбора
    ВыбранныйДокументМетаданные = Неопределено;
    Если СписокДокументовДляВыбора.Количество() = 1 Тогда
        // Если только один тип документа, сразу его выбираем
        ВыбранныйДокументМетаданные = СписокДокументовДляВыбора[0].Значение;
    Иначе
        // Иначе открываем диалог выбора
        ВыбранноеЗначение = ВыбратьИзСписка(СписокДокументовДляВыбора, "Выберите тип документа");
        Если ВыбранноеЗначение <> Неопределено Тогда
            ВыбранныйДокументМетаданные = ВыбранноеЗначение;
        КонецЕсли;
    КонецЕсли;

    Если ВыбранныйДокументМетаданные <> Неопределено Тогда
        // 3. Создание и открытие формы нового документа
        НовыйДокумент = Документы[ВыбранныйДокументМетаданные.Имя].СоздатьДокумент();
        ФормаНовогоДокумента = НовыйДокумент.ПолучитьФорму();
        ФормаНовогоДокумента.Открыть();
    КонецЕсли;

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

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

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

Важно отметить, что такой подход требует большего объема кода и поддержки, а также может быть менее гибким по сравнению с использованием стандартного объекта ЖурналДокументов. Поэтому, по возможности, всегда предпочтительнее использовать типовые механизмы платформы.

Шаг 5: Дополнительная функциональность "Журналов документов"

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

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

  2. Пометка на удаление и удаление: Стандартные механизмы для управления жизненным циклом документов, включая их пометку на удаление и окончательное удаление.

  3. Открытие формы документа для редактирования: Простое и интуитивно понятное открытие выбранного документа для просмотра или редактирования.

  4. Проведение и отмена проведения документов: Для документов, которые имеют движения по регистрам, ЖурналыДокументов предоставляют стандартные кнопки для их проведения и отмены проведения, что является критически важной функцией для многих учетных систем.

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

Заключение

Мы выяснили, что для корректного отображения и функционирования типовых кнопок на динамическом списке, особенно кнопки "Создать" с возможностью выбора типа документа, крайне важно правильно выбрать источник данных для этого списка. Если наша цель — создать полноценный журнал документов, лучшим и наиболее типовым решением будет использование объекта метаданных ЖурналДокументов, который предоставляет всю необходимую функциональность "из коробки". В случаях, когда это невозможно, мы всегда можем прибегнуть к программной реализации, но это потребует больше усилий и поддержки. Выбирая правильный подход, мы обеспечиваем не только корректную работу системы, но и удобство для конечных пользователей.

← На главную