Как добавить тип документа в структуру отбора и объект ОписаниеТипов в 1С

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

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

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

Постановка задачи и анализ исходной ситуации

Рассмотрим исходный фрагмент кода, с которым столкнулся автор темы:


СтруктураОтбора = Новый Структура("НачПериода, КонПериода, Организация, Контрагент, ДоговорКонтрагента, ТипыДокументов",
                                  НачалоПериода,
                                  КонецПериода,
                                  Организация,
                                  Контрагент,
                                  ДоговорКонтрагента,
                                  ТипыДокументов);
        
ТаблицаИсточник = ПолучитьДанныеСпискаПоРеквизитам(СтруктураОтбора);

Параметр ТипыДокументов здесь содержит объект ОписаниеТипов, который определяет, какие именно виды документов (например, "Реализация товаров и услуг", "Поступление товаров и услуг" и т.д.) будут доступны для выбора и анализа в процедуре ПолучитьДанныеСпискаПоРеквизитам. Если мы просто создадим новый документ в конфигураторе, система автоматически не добавит его в эту структуру. Нам нужно явно расширить этот набор типов.

Для решения этой задачи существует два принципиально разных подхода: программный (динамическое расширение состава типов в коде) и декларативный (изменение метаданных в конфигураторе). Рассмотрим каждый из них во всех деталях.

Способ 1. Программное расширение объекта ОписаниеТипов

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

Для этого используется специальный конструктор объекта ОписаниеТипов, который позволяет создавать новое описание типов на основании уже существующего, добавляя или исключая определенные типы данных. Синтаксис этого конструктора выглядит следующим образом:

Новый ОписаниеТипов(ИсходноеОписаниеТипов, ДобавляемыеТипы, ВычитаемыеТипы)

Разберем по шагам, как применить этот конструктор в нашей ситуации:

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

Реализуем это на практике:


// 1. Указываем имя типа нашего нового документа
ИмяНовогоТипа = "ДокументСсылка.Новый_ДокументРасчетовСКонтрагентом";

// 2. Создаем новое ОписаниеТипов на основании старого с добавлением нашего документа
НовыйСоставТипов = Новый ОписаниеТипов(ТипыДокументов, ИмяНовогоТипа);

// 3. Переопределяем переменную перед формированием структуры
ТипыДокументов = НовыйСоставТипов;

// 4. Формируем структуру отбора с обновленным типом
СтруктураОтбора = Новый Структура("НачПериода, КонПериода, Организация, Контрагент, ДоговорКонтрагента, ТипыДокументов",
                                  НачалоПериода,
                                  КонецПериода,
                                  Организация,
                                  Контрагент,
                                  ДоговорКонтрагента,
                                  ТипыДокументов);

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

Способ 2. Декларативное добавление типа через План видов характеристик (Конфигуратор)

Откуда изначально берется состав типов в переменной ТипыДокументов в типовых конфигурациях (таких как 1С:Бухгалтерия)? Платформа и прикладные решения часто используют для хранения информации о типах документов расчетов Планы видов характеристик (ПВХ).

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

Если мы добавим наш новый документ в состав типов этого ПВХ, он автоматически попадет во все связанные выборки, отчеты и структуры, включая наш параметр ТипыДокументов.

Выполним настройку в конфигураторе по шагам:

  1. Откроем дерево метаданных конфигурации.
  2. Перейдем в ветку Планы видов характеристик и найдем ПВХ ВидыСубконтоХозрасчетные.
  3. Откроем свойства этого ПВХ и перейдем на вкладку Прочие, затем нажмем кнопку Предопределенные.
  4. В открывшемся списке найдем элемент с именем (кодом) ДокументыРасчетовСКонтрагентами (или аналогичный по смыслу в вашей конфигурации).
  5. Дважды кликнем по колонке Тип для этого элемента. Откроется окно редактирования составного типа данных.
  6. Найдем в списке наш новый документ Новый_ДокументРасчетовСКонтрагентом, установим напротив него флажок и нажмем ОК.
  7. Обновим конфигурацию базы данных (клавиша F7).

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

Способ 3. Использование расширений конфигурации (Современный стандарт разработки)

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

Рассмотрим, как аккуратно решить задачу с помощью расширения:

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

Важное примечание: Изменение состава типов План видов характеристик в расширении меняет структуру таблиц базы данных. Убедитесь, что у вашего расширения снят флажок Безопасный режим, либо в профиле безопасности разрешены изменения структуры данных.

Влияние на производительность: использование оператора ВЫРАЗИТЬ в запросах

Добавление новых документов в составные типы данных (особенно в субконто) таит в себе скрытую угрозу для быстродействия системы. Когда СУБД (например, MS SQL Server или PostgreSQL) строит запрос к таблице с составным типом данных, при обращении к реквизитам через точку (например, Субконто3.Организация) она вынуждена выполнять неявное левое соединение (LEFT JOIN) со всеми таблицами документов, входящими в этот тип.

Если в вашем ПВХ выбрано 30 видов документов, СУБД выполнит 30 соединений. Добавление 31-го документа еще сильнее усложнит план запроса, что может привести к существенному замедлению формирования отчетов по взаиморасчетам.

Чтобы избежать падения производительности, при написании запросов, обращающихся к реквизитам документов расчетов, всегда явно ограничивайте тип с помощью оператора ВЫРАЗИТЬ. Посмотрим на пример правильного написания запроса:


// НЕПРАВИЛЬНО (вызывает соединение со всеми таблицами ПВХ):
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаДокумента
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки";

// ПРАВИЛЬНО (обращается только к таблице нашего нового документа):
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто3 КАК Документ.Новый_ДокументРасчетовСКонтрагентом).Дата КАК ДатаДокумента
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки";

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

← На главную