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