Альтернативная иерархия справочника

30.08.22

Разработка - Механизмы типовых конфигураций

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Альтернативная иерархия справочника БСП, БП 3.0:
.erf 6,59Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.
Альтернативная иерархия справочника:
.cf 83,86Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.

Способ 1

Подходит для типовых конфигураций последних версий, в которых используется БСП (Библиотека стандартных подсистем). Преимущество способа в том, что не требуется доработка конфигурации. Для решения задачи используется подсистема "Свойства" (Дополнительные реквизиты и сведения). Продемонстрирую на примере конфигурации Бухгалтерия предприятия, редакция 3.0 (3.0.115.15). Использовалась версия платформы 1С:Предприятие 8.3 (8.3.17.1851).

 
 К примеру, справочник "Контрагенты" имеет следующую структуру:

 

 
 Отчет, в который выводится этот справочник с иерархией, будет иметь такую-же структуру:

 

 
 А нам нужна другая иерархия в отчете, к примеру такая:

 

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

Для реализации необходимо добавить для справочника "Контрагенты" дополнительный реквизит (или дополнительное свойство) с типом значения "Дополнительное значение (иерархия)". В качестве значений создать элементы нашей "Альтернативной" иерархии, и затем присвоить эти значения нужным элементам справочника контрагенты.

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

Далее будем использовать дополнительный реквизит.

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

 
 Пример создания "альтернативной" иерархии:
 
 Пример запроса к базе данных и настройки СКД:

 

Нужно иметь в виду, что в выборку попадут только те контрагенты, у которых дополнительный реквизит заполнен. Что делать с остальными контрагентами? Возможны 2 варианта.

1. Заполнить значения для всех контрагентов, установить признак "Заполнять обязательно" в форме редактирования дополнительного реквизита. Тогда при добавлении нового контрагента (по крайне мере) в пользовательском режиме система будет контролировать заполнение реквизита.

2. Дописать запрос таким образом, чтобы контрагенты  с незаполненным значением реквизита попадали в одну из "Групп" альтернативной иерархии.

 
 Пример запроса, в который попадут все контрагенты:

 

Как связать получившуюся таблицу альтернативной иерархии с таблицей регистра в котором содержаться показатели для вывода в отчет? Очень просто: левым или внутренним соединением. Левым - в случае если нужно вывести всех контрагентов, даже без показателей. Внутренним - если в отчет должны попасть только те контрагенты, по которым есть показатели.

 
 Пример запроса, в котором происходит соединение альтернативной иерархии с таблицей регистра

 

 
 Дополнительная информация:

Пример отчета прилагается.

 

Способ 2

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

Решение: создаем новый справочник, в котором будет описана иерархия, назовём его например "АльтернативнаяИерархия". 

 
 Пример структуры нового справочника:

В справочник "Контрагенты" добавляем новый реквизит "АльтернативнаяИерархия" с типом значения "СправочникСсылка.АльтернативнаяИерархия". В качестве значений реквизита будут выступать ЭЛЕМЕНТЫ нижних уровней справочника "АльтернативнаяИерархия". 

Запрос в таком решении может быть довольно простым. Достаточно выбрать подходящую виртуальную таблицу регистра, выбрать поле контрагент, новый реквизит контрагента "АльтернативнаяИерархия" и необходимые ресурсы.

 
 Пример текста запроса:

В настройках отчета первой группировкой будет наш новый реквизит "АльтернативнаяИерархия", второй - контрагент. Ну и про ресурсы нужно не забыть.

 
 Настройки отчета и выходная форма:

Пример отчета в составе простой конфигурации прилагается.

 

иерархия справочник Дополнительное значение реквизит НаборыДополнительныхРеквизитовИСведений ДополнительныеРеквизитыИСведения ЗначенияСвойствОбъектовИерархия ДополнительныеРеквизиты Контрагенты

См. также

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    1915    PROSTO-1C    0    

18

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:Комплексная автоматизация 2.х Россия Бесплатно (free)

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    1967    Vidz    0    

11

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1191    olja-ljaaa    0    

3

Механизмы типовых конфигураций Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Проблемы при создании ресурсной спецификации. Связь настроек спецификации и настроек структуры заказа в ЕРП 2.5.

06.05.2024    1323    It-digit    1    

2

Механизмы типовых конфигураций Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

Продолжение темы вынесения кусков повторно-используемого кода в запрос. В прошлый раз мы сделали это с вычислением пользовательских формул. Здесь замахнулись на формулы, задаваемые пользователем запросами.

1 стартмани

11.04.2024    1143    tango    5    

3
Отзывы
1. MonteCriZto 114 14.12.23 08:20 Сейчас в теме
Делал раньше чуть проще
Добавлял в запрос поле текстового типа - "Тип отчета"
в самом запросе, его заполнял в зависимости от пакета..
Например: "1_Управленческие"
Однако, поступила заявка на отчет, с расшифровкой до Регистратора) и мой метод, начал давать сбои ).
Воспользовался вашим методом, все отлично работает - Спасибо!
з.ы.
Не совсем понял зачем вы по ГДЕ.. фильтруете
Я собрал все необходимые данные, выкинул в отдельный пакет (ГотОтчБезИерархии)
Затем левым соединением добавил в гот. отчет поля иерархии

ВЫБРАТЬ
	ГотОтчБезИерархии.Подразделения КАК Подразделения,
	ГотОтчБезИерархии.СтатьиЗатрат КАК СтатьиЗатрат,
	ГотОтчБезИерархии.Сумма КАК Сумма,
	ГотОтчБезИерархии.Регистратор КАК Регистратор,
	ПодразделенияОрганизацийДополнительныеРеквизиты.Значение КАК АльтернативнаяИерархия
ИЗ
	ГотОтчБезИерархии КАК ГотОтчБезИерархии
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций.ДополнительныеРеквизиты КАК ПодразделенияОрганизацийДополнительныеРеквизиты
		ПО ГотОтчБезИерархии.Подразделения = ПодразделенияОрганизацийДополнительныеРеквизиты.Ссылка
			И (ПодразделенияОрганизацийДополнительныеРеквизиты.Свойство.Наименование = "АльтернативнаяИерархия")
Показать
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. MonteCriZto 114 14.12.23 08:20 Сейчас в теме
Делал раньше чуть проще
Добавлял в запрос поле текстового типа - "Тип отчета"
в самом запросе, его заполнял в зависимости от пакета..
Например: "1_Управленческие"
Однако, поступила заявка на отчет, с расшифровкой до Регистратора) и мой метод, начал давать сбои ).
Воспользовался вашим методом, все отлично работает - Спасибо!
з.ы.
Не совсем понял зачем вы по ГДЕ.. фильтруете
Я собрал все необходимые данные, выкинул в отдельный пакет (ГотОтчБезИерархии)
Затем левым соединением добавил в гот. отчет поля иерархии

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