В процессе разработки универсальных обработок или настроек часто возникает задача: предоставить пользователю возможность выбрать не конкретный документ (ссылку), а именно тип документа. Например, это может потребоваться для массовой пометки на удаление, перепроведения всех документов определенного вида или формирования отчетов по заданному классу объектов. Давайте разберем, как реализовать этот функционал максимально эффективно.
Стандартный механизм реквизитов в 1С с типом ДокументСсылка всегда ожидает выбора конкретного экземпляра (например, «Реализация товаров №123 от 01.01.2023»). Чтобы изменить логику и работать с именами типов (например, «Реализация товаров и услуг»), мы пойдем по пути использования строкового реквизита с программным наполнением списка выбора. Такой подход обеспечивает гибкость и позволяет избежать привязки к конкретным объектам.
Для начала создадим на форме реквизит с типом Строка. Именно он будет хранить выбранное пользователем имя типа. Далее нам необходимо наполнить СписокВыбора этого элемента управления всеми доступными в конфигурации документами. Для этого воспользуемся коллекцией Метаданные.Документы.
Рассмотрим по шагам, как реализовать наполнение списка при открытии формы или инициализации элемента:
Документы по выбранному строковому имени.Пример программного кода для заполнения списка выбора:
// Предположим, что на форме есть элемент управления "ВыбранныйТипДокумента"
Для Каждого Док Из Метаданные.Документы Цикл
Элементы.ВыбранныйТипДокумента.СписокВыбора.Добавить(Док.Имя, Док.Синоним);
КонецЦикла;
Когда пользователь выберет значение из выпадающего списка, в нашем реквизите окажется системное имя документа (например, РеализацияТоваровУслуг). Чтобы совершить какие-либо действия с этим типом (например, получить все документы этого вида), мы используем обращение к менеджеру документа через коллекцию Документы:
// Получаем имя типа из реквизита
ИмяТипа = Объект.ВыбранныйТипДокумента;
// Получаем ссылку на менеджер документа
МенеджерДокумента = Документы[ИмяТипа];
// Пример выборки всех документов выбранного типа
Выборка = МенеджерДокумента.Выбрать();
Пока Выборка.Следующий() Цикл
// Выполняем необходимые действия, например, пометку на удаление
ОбъектДокумента = Выборка.ПолучитьОбъект();
ОбъектДокумента.УстановитьПометкуУдаления(Истина);
КонецЦикла;
Работая с таким подходом, важно учитывать несколько нюансов для обеспечения стабильности и удобства работы:
1. Использование Синонимов: Как показано в примере кода, в метод Добавить мы передаем вторым параметром Док.Синоним. Это критически важно для пользователей, так как они будут видеть «Реализация товаров и услуг» вместо технического идентификатора РеализацияТоваровУслуг.
2. Валидация данных: При использовании метода Документы[ИмяТипа] всегда помните о возможности того, что реквизит может быть пустым или содержать устаревшее имя, если конфигурация была изменена. Рекомендуем использовать проверку на существование:
Если Метаданные.Документы.Найти(ИмяТипа) <> Неопределено Тогда
Менеджер = Документы[ИмяТипа];
// Дальнейшая логика
КонецЕсли;
3. Фильтрация списка: Если конфигурация большая, нет необходимости показывать все документы. Вы можете добавить условия в цикл, например, проверять подсистему, к которой относится документ: Если Док.Подсистемы.Содержит(Метаданные.Подсистемы.Продажи) Тогда .... Это значительно упростит работу пользователя и снизит вероятность ошибки при выборе.
4. Альтернативы: Если задача усложняется (например, нужно выбрать несколько типов сразу), используйте СписокЗначений вместо обычного строкового реквизита. Это позволит реализовать механизм множественного выбора с отметками (checkboxes), что часто требуется в групповых обработках.
Использование строкового идентификатора для выбора типа — это классический и надежный прием в разработке на платформе 1С, который при правильной реализации (с использованием синонимов и проверок) делает ваш код гибким и удобным для поддержки.