При разработке интерфейсов в среде 1С:Предприятие 8.3 на управляемых формах часто возникает задача отобразить в единой таблице документы разных типов — например, поступления и списания безналичных денежных средств. Разберем основные подходы к решению этой задачи, проанализируем ограничения платформы и рассмотрим правильные варианты реализации.
Если требуется вывести данные в произвольную форму без создания новых объектов метаданных, можно настроить динамический список через произвольный запрос. Для этого включим у динамического списка свойство ПроизвольныйЗапрос и напишем текст запроса, объединяющий нужные таблицы документов.
Посмотрим на пример текста запроса для объединения документов поступления и списания:
ВЫБРАТЬ
Поступление.Ссылка КАК Ссылка,
Поступление.Дата КАК Дата,
Поступление.Номер КАК Номер,
Поступление.Организация КАК Организация,
Поступление.Контрагент КАК Контрагент,
Поступление.СуммаДокумента КАК Сумма
ИЗ
Документ.ПоступлениеНаРасчетныйСчет КАК Поступление
ГДЕ
Поступление.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И Поступление.Организация = &Организация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Списание.Ссылка,
Списание.Дата,
Списание.Номер,
Списание.Организация,
Списание.Контрагент,
Списание.СуммаДокумента
ИЗ
Документ.СписаниеСРасчетногоСчета КАК Списание
ГДЕ
Списание.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И Списание.Организация = &Организация
Передачу значений параметров в динамический список реализуем в модуле формы, например, при изменении реквизитов отбора:
&НаСервере
Процедура УстановитьПараметрыСписка()
Список.Параметры.УстановитьЗначениеПараметра("ДатаНачала", НачалоДня(Период.ДатаНачала));
Список.Параметры.УстановитьЗначениеПараметра("ДатаОкончания", КонецДня(Период.ДатаОкончания));
Список.Параметры.УстановитьЗначениеПараметра("Организация", ВыбОрганизация);
КонецПроцедуры
Ограничения данного подхода:
ОБЪЕДИНИТЬ ВСЕ, свойство ОсновнаяТаблица остается пустым. В результате платформа автоматически отключает стандартные команды: создание, копирование, изменение, проведение, отмену проведения и пометку на удаление.Если мы выбрали вариант с произвольным запросом, нам потребуется вручную реализовать недостающие интерфейсные возможности.
Разберем по шагам, как вернуть привычное поведение формы:
&НаКлиенте
Процедура СоздатьПоступление(Команда)
ОткрытьФорму("Документ.ПоступлениеНаРасчетныйСчет.ФормаОбъекта");
КонецПроцедуры
&НаКлиенте
Процедура СоздатьСписание(Команда)
ОткрытьФорму("Документ.СписаниеСРасчетногоСчета.ФормаОбъекта");
КонецПроцедуры
Выбор, чтобы открывать форму соответствующего документа:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
ПоказатьЗначение(, ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
Элементы.Список.ВыделенныеСтроки, получают объекты по ссылке и вызывают методы Записать(РежимЗаписиДокумента.Проведение) или УстановитьПометкуУдаления(Истина).
С точки зрения архитектуры платформы 1С наиболее правильным и производительным решением для объединения нескольких видов документов является объект метаданных Журнал документов.
Журнал документов решает сразу все проблемы:
ОсновнойТаблицы в динамическом списке, благодаря чему сохраняются все стандартные кнопки (создание с выбором вида документа, проведение, пометка удаления, контекстное меню).Рассмотрим, как добавить журнал без изменения типовой конфигурации:
ПоступлениеНаРасчетныйСчет и СписаниеСРасчетногоСчета).Организация, Контрагент, Сумма), связав их с реквизитами соответствующих документов.Таким образом, основная конфигурация остается на полной поддержке поставщика, а пользователи получают полноценный функционал журнала со всеми стандартными сервисными возможностями платформы 1С.