Добавление иерархии в типовой неиерархический справочник

16.01.17

Задачи пользователя - Адаптация типовых решений

Добавление произвольной иерархии в отчеты, не снимая с поддержки конфигурацию

Файлы

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

Наименование Скачано Купить файл
Архив с примером
.zip 107,19Kb
2 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

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

Код для загрузки подобной структуры в дерево значений представлен ниже:

	ТабДок = Новый ТабличныйДокумент;
	ТабДок.Прочитать(ИмяФайла);
	УдалитьФайлы(ИмяФайла);
	
	// Найти первую строку.
	Для Сч = 1 По ТабДок.ВысотаТаблицы Цикл
		Если ЗначениеЗаполнено(ТабДок.Область(Сч, НомерКолонкиВерхнегоУровня).Текст) Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	// Построение дерева иерархии.
	Для Сч = Сч По ТабДок.ВысотаТаблицы Цикл
		
		Найдено = Ложь;
		Для СчК = НомерКолонкиВерхнегоУровня По НомерКолонкиВерхнегоУровня + МаксимальнаяГлубина Цикл
			ТекПроект = ТабДок.Область(Сч, СчК).Текст;
			Если ЗначениеЗаполнено(ТекПроект) Тогда
				Найдено = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если Не Найдено Тогда
			Продолжить;
		КонецЕсли;
		
		Если СчК = НомерКолонкиВерхнегоУровня Тогда
			НС = ТекИерархияПроектов.Строки.Добавить();
		Иначе
			Маркер = ТекИерархияПроектов.Строки[ТекИерархияПроектов.Строки.Количество() - 1];
			
			Для СчК1 = НомерКолонкиВерхнегоУровня + 1 По СчК - 1 Цикл
				Если Маркер.Строки.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли;
				Маркер = Маркер.Строки[Маркер.Строки.Количество() - 1];
				
			КонецЦикла;
			НС = Маркер.Строки.Добавить();
			
		КонецЕсли;
		ТекЭлемент	= ТабДок.Область(Сч, СчК).Текст;
		НС.Элемент	= ?(Не ПустаяСтрока(ТекЭлемент) И ТекЭлемент <> "0", ТекЭлемент, ТекПроект);
		НС.Ключ = Сч;
		
	КонецЦикла;

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

	УстановитьПривилегированныйРежим(Истина);
	ХранилищеОбщихНастроек.Сохранить("ШаблонИерархии",,РеквизитФормыВЗначение("ИерархияПроектов"),,"ПТ");

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

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

Функция СоздатьТаблицуИерархии()
	
	// Загрузка иерархии из встроенного шаблона.
	УстановитьПривилегированныйРежим(Истина);
	ИерархияПроектов = ХранилищеОбщихНастроек.Загрузить("ШаблонИерархии",,,"ПТ");
	УстановитьПривилегированныйРежим(Ложь);
	Если ИерархияПроектов = Неопределено Или ИерархияПроектов.Строки.Количество() = 0 Тогда
		ВызватьИсключение НСтр("ru='Шаблон иерархии не загружен!!!!'");
	КонецЕсли;
	
	// Построить таблицу значений по дереву.
	ТаблицаИерархии = Новый ТаблицаЗначений;
	ТаблицаИерархии.Колонки.Добавить("Родитель", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,0)));
	Для Каждого Колонка Из ИерархияПроектов.Колонки Цикл
		ТаблицаИерархии.Колонки.Добавить(
			Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок, Колонка.Ширина);
	КонецЦикла;
	
	ПостроитьТаблицуИерархии(ТаблицаИерархии, ИерархияПроектов);
	ТаблицаИерархии.Сортировать("Ключ Убыв");
	Если ТаблицаИерархии.Количество() > 0 Тогда
		МаксКлюч = ТаблицаИерархии[0].Ключ;
	Иначе
		МаксКлюч = 0;
	КонецЕсли;
	// Сбросим всякий шлак в отдельную группу.
	НС = ТаблицаИерархии.Добавить();
	НС.Ключ = МаксКлюч + 1;
	НС.Элемент = "Прочее";
	
	Возврат ТаблицаИерархии;
	
КонецФункции

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

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

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

Теперь дело за малым - правильно настроить внешние источники данных в СКД и связи между ними. На инфостарте много публикаций на эту тему, поэтому ограничимся скриншотами:

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Разработка Адаптация типовых решений Производство готовой продукции (работ, услуг) Розничная торговля 1С:Управление торговлей 10 Россия Платные (руб)

Доработка для 1С:Управление торговлей 10.3 (релиз 10.3.88.3) добавляет поддержку маркировки новых категорий товаров согласно постановлениям Правительства РФ 2025–2026 гг. Конфигурация УТ 10.3 снята с поддержки — новые маркируемые категории в типовую поставку больше не попадают. Доработка закрывает этот пробел: новые виды номенклатуры, обмен с ГИС МТ «Честный Знак». Поставляется в виде файла .cf

14640 руб.

23.04.2026    1574    12    13    

16

Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)

Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С

25000 руб.

06.03.2026    1384    4    0    

3

Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

6000 руб.

07.02.2023    13627    120    25    

76

Адаптация типовых решений 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Расширение для вывода информации об остатках и ценах номенклатуры в форме списка и выбора номенклатуры. (УТ 11, КА 2, ERP). Позволяет получать информацию о ценах, остатках и доступности в разрезе складов и характеристик номенклатуры, информацию по документам резерва.

7930 руб.

16.10.2025    1550    2    0    

2

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Расширение для УНФ, чтобы автоматически отменять старые резервы и не мешалть эффективно продавать.

9150 руб.

02.08.2023    8442    26    5    

41

Адаптация типовых решений 1С 8.3 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Беларусь Россия Платные (руб)

Расширение "Дополнительные документы" предназначено для создания дополнительных документов различного назначения, как форм для внесения данных так и печатных форм в расширяемой конфигурации пользовательскими средствами, без работы в конфигураторе и внесения изменений в структуру данных. Тестировалось для "1С:БП", "1С:УНФ","1С:КА"

21859 руб.

29.12.2025    1594    1    8    

2
Для отправки сообщения требуется регистрация/авторизация