Как в динамическом списке 1С объединить несколько видов документов?

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

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

Вариант 1. Использование произвольного запроса с конструкцией ОБЪЕДИНИТЬ ВСЕ

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

Посмотрим на пример текста запроса для объединения документов поступления и списания:


ВЫБРАТЬ
    Поступление.Ссылка КАК Ссылка,
    Поступление.Дата КАК Дата,
    Поступление.Номер КАК Номер,
    Поступление.Организация КАК Организация,
    Поступление.Контрагент КАК Контрагент,
    Поступление.СуммаДокумента КАК Сумма
ИЗ
    Документ.ПоступлениеНаРасчетныйСчет КАК Поступление
ГДЕ
    Поступление.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И Поступление.Организация = &Организация

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Списание.Ссылка,
    Списание.Дата,
    Списание.Номер,
    Списание.Организация,
    Списание.Контрагент,
    Списание.СуммаДокумента
ИЗ
    Документ.СписаниеСРасчетногоСчета КАК Списание
ГДЕ
    Списание.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И Списание.Организация = &Организация

Передачу значений параметров в динамический список реализуем в модуле формы, например, при изменении реквизитов отбора:


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

Ограничения данного подхода:

  1. Отсутствие основной таблицы: так как в запросе используется ОБЪЕДИНИТЬ ВСЕ, свойство ОсновнаяТаблица остается пустым. В результате платформа автоматически отключает стандартные команды: создание, копирование, изменение, проведение, отмену проведения и пометку на удаление.
  2. Производительность: объединение разнородных таблиц без основной таблицы усложняет оптимизацию запросов СУБД. При сортировке и динамическом считывании больших объемов данных возможны задержки при прокрутке списка.
  3. Совместимость типов: типы и псевдонимы полей во всех объединяемых ветках должны строго совпадать.

Восстановление командной панели при использовании произвольного запроса

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

Разберем по шагам, как вернуть привычное поведение формы:

  1. Кнопка создания документов: добавим в командную панель кнопку типа «Подменю» и разместим в ней команды создания для каждого типа документа:
    
    &НаКлиенте
    Процедура СоздатьПоступление(Команда)
        ОткрытьФорму("Документ.ПоступлениеНаРасчетныйСчет.ФормаОбъекта");
    КонецПроцедуры
    
    &НаКлиенте
    Процедура СоздатьСписание(Команда)
        ОткрытьФорму("Документ.СписаниеСРасчетногоСчета.ФормаОбъекта");
    КонецПроцедуры
    
  2. Открытие документа по двойному клику: переопределим событие таблицы Выбор, чтобы открывать форму соответствующего документа:
    
    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
        СтандартнаяОбработка = Ложь;
        ТекущиеДанные = Элементы.Список.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
            ПоказатьЗначение(, ТекущиеДанные.Ссылка);
        КонецЕсли;
    КонецПроцедуры
    
  3. Групповое проведение и удаление: создадим серверные процедуры, которые обходят коллекцию Элементы.Список.ВыделенныеСтроки, получают объекты по ссылке и вызывают методы Записать(РежимЗаписиДокумента.Проведение) или УстановитьПометкуУдаления(Истина).

Вариант 2. Создание объекта метаданных «Журнал документов»

С точки зрения архитектуры платформы 1С наиболее правильным и производительным решением для объединения нескольких видов документов является объект метаданных Журнал документов.

Журнал документов решает сразу все проблемы:

  1. Обеспечивает наличие ОсновнойТаблицы в динамическом списке, благодаря чему сохраняются все стандартные кнопки (создание с выбором вида документа, проведение, пометка удаления, контекстное меню).
  2. Формирует физическую таблицу на уровне СУБД с единым индексом по дате, что гарантирует высокую скорость динамического считывания и сортировки.

Рассмотрим, как добавить журнал без изменения типовой конфигурации:

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

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

← На главную