Как на форме 1С выбрать тип документа (класс объектов) вместо конкретной ссылки и загрузить данные?

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

При разработке инструментов обработки данных часто возникает задача: предоставить пользователю возможность выбрать не конкретную накладную или акт, а весь вид документа (например, «Реализация товаров и услуг» или «Поступление товаров»). Типичная ошибка начинающего разработчика — использование реквизита с типом ДокументСсылка. В этом случае платформа ожидает выбора конкретной записи из базы данных, что не позволяет решить задачу массовой обработки.

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

Причина проблемы: Различие между ссылкой и типом метаданных

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

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

Способ 1. Использование Списка значений (простой вариант)

Этот метод подходит, когда нужно быстро создать выпадающий список со всеми доступными в системе видами документов. Мы создадим реквизит формы типа СписокЗначений и заполним его программно при открытии формы.

Разберем по шагам реализацию этого метода:

  1. Создадим на форме реквизит (например, ВыбранныйТипДокумента) с типом Строка.
  2. Настроим для этого реквизита режим выбора из списка.
  3. Напишем код заполнения списка при инициализации формы.

Рассмотрим пример кода на стороне сервера:


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

В данном примере в список выбора добавляется Имя документа (которое нужно для программного обращения) и Синоним (который видит пользователь). После того как пользователь выберет значение, в реквизите ВыбранныйТипДокумента будет храниться строка, например, "РеализацияТоваровУслуг".

Способ 2. Использование справочника «Идентификаторы объектов метаданных»

Если вы работаете в современной конфигурации на базе БСП (Библиотека стандартных подсистем), правильнее использовать стандартный справочник ИдентификаторыОбъектовМетаданных. Это более надежный способ, так как он позволяет хранить ссылки на типы объектов, которые не изменятся при переименовании объектов в конфигураторе.

Для этого выполните следующие действия:

  1. Добавьте реквизит формы с типом СправочникСсылка.ИдентификаторыОбъектовМетаданных.
  2. В параметрах выбора этого реквизита на форме установите отбор, чтобы пользователь видел только документы.

Выясним причину, почему это лучше: использование ссылок вместо строк предотвращает ошибки «магических строк», когда опечатка в одном символе имени документа приводит к краху программы.

Способ 3. Работа через «ОписаниеТипов»

Рассмотрим более сложный, но гибкий программный метод. Мы можем вызвать стандартное окно выбора типов, которое предоставляет сама платформа 1С. Для этого используется объект ОписаниеТипов.

Посмотрим на пример реализации вызова окна выбора:


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

Как программно заполнить таблицу документами выбранного типа?

После того как мы успешно выбрали тип (например, получили строку "РеализацияТоваровУслуг"), нам необходимо выбрать все документы этого вида из базы и поместить их в табличную часть формы. Проанализируем ситуацию: эффективнее всего сделать это через запрос.

Рассмотрим подробнее серверную процедуру заполнения:


&НаСервере
Процедура ЗаполнитьДокументыНаСервере()
    
    // Очищаем текущую таблицу на форме
    Объект.ТаблицаДокументов.Очистить();
    
    // Имя выбранного типа документа (полученное из Способа 1)
    ИмяДокумента = ВыбранныйТипДокумента; 
    
    Если ПустаяСтрока(ИмяДокумента) Тогда
        Возврат;
    КонецЕсли;
    
    // Формируем динамический запрос
    ТекстЗапроса = "ВЫБРАТЬ Ссылка, Дата, Номер ИЗ Документ." + ИмяДокумента;
    
    Запрос = Новый Запрос(ТекстЗапроса);
    Результат = Запрос.Выполнить();
    
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = Объект.ТаблицаДокументов.Добавить();
        НоваяСтрока.ДокументСсылка = Выборка.Ссылка;
        НоваяСтрока.Дата = Выборка.Дата;
        НоваяСтрока.Номер = Выборка.Номер;
    КонецЦикла;
    
КонецПроцедуры

Обратите внимание на использование конструкции "ВЫБРАТЬ ... ИЗ Документ." + ИмяДокумента. Это позволяет динамически менять таблицу запроса в зависимости от того, что выбрал пользователь.

Важные рекомендации по производительности

При реализации подобного функционала следует учитывать объем данных в базе. Если вы выберете тип документа «Чеки ККМ» в крупном ритейле, их может оказаться несколько миллионов. Попытка загрузить их все в табличную часть приведет к зависанию программы.

Проанализируем способы оптимизации:

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

← На главную