Как отобразить движения документа на динамической форме в 1С?

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

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

Штатные механизмы платформы и где искать «заветную галку»

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

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

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

Способ 1. Открытие формы списка регистра с отбором по документу

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

Посмотрим на пример клиентского кода:


ПараметрыОтбора = Новый Структура("Регистратор", ДокументСсылка);
ПараметрыОткрытия = Новый Структура("Отбор", ПараметрыОтбора);

ОткрытьФорму("РегистрНакопления.ТоварыНаСкладах.ФормаСписка", ПараметрыОткрытия, ЭтотОбъект);

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

Способ 2. Программное внедрение движений в тело формы через динамический список

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

Разберем по шагам создание динамического списка движений:

  1. Создаем реквизит формы типа ДинамическийСписок с помощью метода ИзменитьРеквизиты().
  2. Задаем произвольный запрос списка, выбирающий данные из реальной таблицы регистра с условием ГДЕ Регистратор = &ТекущийДокумент.
  3. Добавляем элемент управления ТаблицаФормы в коллекцию Элементы и настраиваем колонки.

Рассмотрим пример реализации:


&НаСервере
Процедура ДобавитьТаблицуДвиженийНаСервере(ИмяРегистра, ЗаголовокТаблицы)

    // 1. Создаем реквизит формы с типом ДинамическийСписок
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("СписокДвижений", Новый ОписаниеТипов("ДинамическийСписок")));
    ИзменитьРеквизиты(НовыеРеквизиты);

    // 2. Настраиваем свойства списка и текст запроса
    ЭтотОбъект.СписокДвижений.ПроизвольныйЗапрос = Истина;
    ЭтотОбъект.СписокДвижений.ТекстЗапроса = 
        "ВЫБРАТЬ
        |	Номенклатура,
        |	Склад,
        |	Количество,
        |	Период
        |ИЗ
        |	РегистрНакопления." + ИмяРегистра + " КАК Движения
        |ГДЕ
        |	Движения.Регистратор = &Регистратор";

    ЭтотОбъект.СписокДвижений.Параметры.УстановитьЗначениеПараметра("Регистратор", Объект.Ссылка);

    // 3. Создаем таблицу на форме
    ЭлементТаблица = Элементы.Добавить("ТаблицаДвижений", Тип("ТаблицаФормы"));
    ЭлементТаблица.ПутьКДанным = "СписокДвижений";
    ЭлементТаблица.Заголовок = ЗаголовокТаблицы;

    // 4. Добавляем колонку
    КолонкаНоменклатура = Элементы.Добавить("ДвиженияНоменклатура", Тип("ПолеФормы"), ЭлементТаблица);
    КолонкаНоменклатура.Вид = ВидПоляФормы.ПолеНадписи;
    КолонкаНоменклатура.ПутьКДанным = "СписокДвижений.Номенклатура";

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

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

Способ 3. Модель документа «Корректировка регистров» (просмотр и ручное редактирование)

В типовых конфигурациях (таких как «1С:ERP Управление предприятием» или «1С:Управление торговлей») реализован специализированный механизм отображения и редактирования произвольных наборов движений — документ КорректировкаРегистров. Рассмотрим, как работает этот архитектурный паттерн:

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

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

Типовой отчет «Движения документа» (БСП)

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

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

← На главную