Как вывести журнал документов с пиктограммами состояния на форму обработки в 1С

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

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

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

Разбор архитектурного решения

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

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

Способ 1. Использование динамического списка с произвольным запросом

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

  1. Создание реквизита формы: Добавим на форму обработки новый реквизит (например, ВсеВедомости) и укажем ему тип ДинамическийСписок.

  2. Настройка источника данных: В свойствах динамического списка установим флаг Произвольный запрос. В качестве основной таблицы укажем нужный журнал документов или документ (например, ЖурналДокументов.ВедомостиНаВыплатуЗарплаты).

  3. Редактирование текста запроса: Напишем запрос с ограничением по входящему массиву ссылок:

    
    ВЫБРАТЬ
        Журнал.Ссылка КАК Ссылка,
        Журнал.Дата КАК Дата,
        Журнал.Номер КАК Номер,
        Журнал.Проведен КАК Проведен,
        Журнал.ПометкаУдаления КАК ПометкаУдаления
    ИЗ
        ЖурналДокументов.ВедомостиНаВыплатуЗарплаты КАК Журнал
    ГДЕ
        Журнал.Ссылка В (&СписокДокументов)
    
  4. Инициализация при открытии формы: Чтобы динамический список при открытии обработки не выдавал ошибку отсутствия параметра, инициализируем его на сервере при создании формы:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        ЭтаФорма.ВсеВедомости.Параметры.УстановитьЗначениеПараметра("СписокДокументов", Новый Массив);
    КонецПроцедуры
    
  5. Передача ссылок после генерации документов: Когда обработка сформирует документы на сервере, выгрузим их ссылки в массив и установим значение параметра динамического списка:

    
    &НаСервере
    Процедура ОбновитьЖурналНаСервере(МассивСозданныхДокументов)
        ЭтаФорма.ВсеВедомости.Параметры.УстановитьЗначениеПараметра("СписокДокументов", МассивСозданныхДокументов);
    КонецПроцедуры
    

Способ 2. Установка отбора через Компоновку Данных (Рекомендуемый)

Использование параметра в секции ГДЕ произвольного запроса имеет свои ограничения, особенно при передаче больших массивов данных. Более технологичным подходом является установка отбора в динамическом списке без изменения текста запроса.

Рассмотрим, как наложить отбор на динамический список программно:


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

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

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

Как вывести пиктограммы состояния (проведен, помечен на удаление)

Частый вопрос при работе с динамическими списками — почему в первой колонке таблицы не отображается галочка проведения или крестик удаления.

Выясним причину: платформа 1С автоматически подтягивает пиктограммы состояния только в том случае, если у динамического списка корректно задано свойство ОсновнаяТаблица (например, ЖурналДокументов.ВедомостиНаВыплатуЗарплаты), а элемент формы типа Таблица настроен на отображение картинки строки.

Если пиктограммы не появились автоматически, их можно настроить вручную двумя способами:

  1. Через свойства элемента формы Таблица:

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

  2. Формирование индекса картинки в запросе динамического списка:

    Проанализируем пример запроса, создающего специальное числовое поле для вывода иконки:

    
    ВЫБРАТЬ
        Журнал.Ссылка КАК Ссылка,
        Журнал.Дата КАК Дата,
        Журнал.Номер КАК Номер,
        ВЫБОР
            КОГДА Журнал.ПометкаУдаления ТОГДА 2
            КОГДА Журнал.Проведен ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ КАК ИндексСостояния
    ИЗ
        ЖурналДокументов.ВедомостиНаВыплатуЗарплаты КАК Журнал
    

    После этого в свойстве элемента формы ПутьКДаннымКартинкиСтроки укажите ВсеВедомости.ИндексСостояния.

Обновление интерфейса на клиенте

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


&НаКлиенте
Процедура ПослеСозданияДокументов()
    // Оповещаем систему об изменении документов конкретного типа
    ОповеститьОбИзменении(Тип("ДокументСсылка.ВедомостьНаВыплатуЧерезКассу"));
    
    // Обновляем элемент формы с динамическим списком
    Элементы.ТаблицаВсеВедомости.Обновить();
КонецПроцедуры

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

← На главную