Подскажите как программно получить структуру подчинённости ( по критериям отбора)
Приведите пожалуйста пример кода как программно получить структуру подчинённости ( по критериям отбора ).
Есть бизенес-процесс у него в есть реквизит заказ. при расоведении документа заказ нужно оповестить пользователя. Заказ не всегда относится к этому бизнес-процессу а нам нужен именно связанный с ним.
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
2. AnryMc 846 12.09.14 11:24 Сейчас в теме
Немного переписанная типовая обработка «Структура подчинённости». Отличается от типовой тем, что видит все подчинённые документы , а не только упомянутые в критерии отбора.
5. Alexey26 2 07.12.15 16:40 Сейчас в теме
(1) fierylions, РаботаСДиалогами.ПоказатьСтруктуруПодчиненностиДокумента(Ссылка);
vechiy; juraua; user1114234; + 3 – Ответить
3. ~ADm!t_@vd~ 30 12.09.14 11:27 Сейчас в теме
Это из типовой (может как наводка поможет)
Процедура ДействияФормыСтруктураПодчиненностиДокумента(Кнопка) РаботаСДиалогами.ПоказатьСтруктуруПодчиненностиДокумента(Ссылка); КонецПроцедуры
Это получение связанных документов
//Проверка на то что у реализации есть приходник Таблица = ПолныеПрава.ПолучитьСписокДокументовПоКритериюОтбора("СвязанныеДокументы", Документ); Для каждого Стр Из Таблица Цикл Если НЕ Стр.Ссылка.ПометкаУдаления Тогда ЕстьПКО =Истина КонецЕсли; КонецЦикла; Возврат ЕстьПКО;
Просмотр
Связь документов отображается в структуре подчиненности.
Для просмотра структуры подчиненности в карточке документа нажмите на кнопку «Прочие действия» → «Структура подчиненности».

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

Из структуры возможно перейти в карточку любого документа, который находится в ней. Для этого выберите документ и нажмите на кнопку «Открыть карточку документа».
Подчинённые документы в 1С
В данной статье будут рассмотрены подчинённый документы в 1С и взаимосвязь между ними. Функционалом платформы 1С предусмотрена связь документов между собой. Все последовательности по связям находятся в отдельном отчёте. Далее я расскажу о расположении структуры по подчинённостям документации в системе 1С, а также о практическом использование данной структуры. Для начала сделаем некоторое количество действий и операций внутри своей редакции 1С:Бухгалтерии 8, чтобы на примере отображать, как подчиняются документы. Первым станет создание счёта по оплате для клиента. Для этого кликаем на «Перейти к иерархическому списку связанных документов», как показано на скриншоте ниже. Нам отроется общий вид системы подчинения документации:
Рис. 1 Внешний вид подчиненных документов в 1С В открывшемся окне будет располагаться единственный объект – это «Счёт на оплату», что можно увидеть на скриншоте ниже:
Рис. 2 Счет на оплату при работе в 1С:Бухгалтерия 8 Далее следует добавить оплату от клиента, при этом сделаем в ней привязку к нашему счёту, а далее запустим иерархическое дерево:
Рис. 3 Иерархическое дерево при работе в 1С:Бухгалтерия 8 Далее можно наблюдать, что внутри перечня появился второй документ, который находится над предыдущим, так как он является главным, а документ об оплате ему подчиняется, как показано на скриншоте ниже:
Рис. 4 Главный и подчиненный документы при работе в 1С:Бухгалтерия 8 Далее делаем счета на оплату реализации продукции, после чего кликаем на сам отчёт. Внутри реализации в бухгалтерской программе 1С:Бухгалтерия содержится ссылка счёта, что значит, что продажа привязана к счёту, как показано ниже:
Рис. 5 Продажа привязана к счету при работе в 1С:Бухгалтерия 8 Внутри отчёта, если запускать его из самой реализации, будет содержаться документы «Реализация» и «Счёт». Получается, что оплата ещё не была проведена и не содержит привязки к документам:
Рис. 6 Как выглядит отсутствие привязки к документам при работе в 1С:Бухгалтерия 8 Из документа «Счёт на оплату», перейдем в систему иерархического дерева по подчинённостям документов – там в порядке структуры будут расположены следующие объекты: 1. Счёт; 2. Оплата; 3. Реализация.
Рис. 7 Структура иерархического дерева при работе в 1С:Бухгалтерия 8 Дальше при помощи реализации необходимо создать счёт-фактуру, после чего посмотреть структуру подчинённостей документов, как указано ниже:
Рис. 8 Распределение подчиненности при работе в 1С:Бухгалтерия 8 Далее наблюдаем, что теперь отображается и счёт-фактура, который имеет подчинение перед счётом и реализацией, как демонстрируется ниже:
Рис. 9 Документ с подчинением при работе в 1С:Бухгалтерия 8 Заведём новый документ – это будет акт по проверке взаимных расчётов и запустим его из акта со списком, как указано на скриншоте ниже:
Рис. 10 Акт по проверке взаимных расчетов при работе в 1С:Бухгалтерия 8 Видно, что в акте по сверке структура подчиненности документов в 1С имеет следующий вид: акт по сверке одновременно подчиняется и оплате, и реализации, а оплата также привязана к счёту на оплату, как видно на скриншоте ниже:
Рис. 11 Структура подчиненности документов при работе в 1С:Бухгалтерия 8 При открытии структуры из счёта по оплате внутри списка будет находится ещё счёт-фактура, так как он находится в подчинении лишь у реализации:
Рис. 12 Вид документа с одним подчинением при работе в 1С:Бухгалтерия 8
2. Практическое использование подчинённых документов в 1С

Рассмотрим, как на практике будут вести себя подчиненный документы, и где мы можем их использовать. · Операция по проведению В системе 1С Бухгалтерия, редакция 8.3, перейдя в структуру подчиненности документов, можно переходить и в саму документацию внутри структуры, а также проводить с ней изменения. Как пример, если открыть структуру в реализации, то можно будет проверить проводки по счёту-фактуре для продаж. Для этого заходим в окно с документацией и реализацией, выделяем необходимый файл и кликаем на кнопку (№2 на скрине ниже):
Рис. 13 Выбор документа для проверки подчинения при работе в 1С:Бухгалтерия 8 Далее внутри структуры подчиненностей документов можно увидеть счёт-фактуру, около которого нет отметки, то есть он ещё не был проведён. Открываем документ:

Рис. 14 Счет фактура внутри структуры с подчиненными документами при работе в 1С:Бухгалтерия 8 Далее внутри формы кликаем на «Записать и закрыть», после чего проводка будет осуществлена:
Рис. 15 Осуществление проводки при работе в 1С:Бухгалтерия 8 Далее кликаем на «Обновить», после чего появляется актуальная информация:

Рис. 16 Актуальная информация о документах при работе в 1С:Бухгалтерия 8 Около счёта-фактуры появится зелёная отметка. Это значит, проводка была осуществлена успешно. · Удаление документов В случае, когда нужно удалить документ из системы 1С, обязательно удаляются и все подчиненные ему объекты. Это можно осуществить, если воспользоваться системой иерархического дерева. Чтобы это сделать, кликаем на иерархический список:
Рис 17 Выбор иерархического списка при работе в 1С:Бухгалтерия 8 Внутри отчёта можно увидеть, что ниже реализации находятся два документа в подчинении: «Акт сверки счетов» и «Счёт-фактура». Кликаем на счёт-фактуру, чтобы открыть его форму, как показано на скриншоте ниже:
Рис. 18 Выбор документа в иерархическом списке при работе в 1С:Бухгалтерия 8 В открывшейся карточке кликаем на «Ещё» и выбираем «Пометить на удаление». Появится всплывающее окно с сообщением, в котором нужно кликнуть «Да», после чего жмем «Esc» и выходим из счёта:
Рис. 19 Пометка на удаление После этого переходим в акт о сверке и повторяем вышеописанные действия:
Рис. 20 Удаление акта о сверке После этого все объекты в подчинении были удалены, теперь можно провести удаление самой реализации обычным способом.
Специалист компании «Кодерлайн» Айдар Фархутдинов
Получение списка родительских и подчиненных документов из структуры подчиненности
Достаточно часто стали появляться задачи, требующие получения данных по структуре подчиненности документов. Каждый раз писать все заново надоело. Решил добавить в общий модуль пару экспортных функций.
Структуру подчиненности документа можно увидеть, запустив из документа общую форму «ФормаСтруктурыПодчиненности». Но как получить связанные документы для обработки данных? Я взял процедуры из модуля этой формы, немного поколдовал, и превратил их в пару функций, возвращающих список документов из структуры подчиненности нужного документа. Нужно отметить, что иерархии подчиненности в результатах работы функций нет, в отличие от процедур, работающих с деревом значений в форме. Вот хочу поделиться результатом со всеми, так как мне самому бывает приятно заполучить иногда кусочек готового кода, который впоследствие можно использовать для решения своих задач.
Функция ПолучитьРодительскиеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт Если СписокСвязанныхДокументов = Неопределено Тогда СписокСвязанныхДокументов = Новый СписокЗначений; КонецЕсли; Если мУжеВСписке = Неопределено Тогда мУжеВСписке = Новый Соответствие; КонецЕсли; МетаданныеДокумента = ДокументСсылка.Метаданные(); СписокРеквизитов = Новый СписокЗначений; Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл ТипыРеквизита = Реквизит.Тип.Типы(); Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип); Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита) И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда Попытка ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя]; Исключение Прервать; КонецПопытки; ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда Попытка СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс")); Исключение ОтладкаТекстОшибки = ОписаниеОшибки(); КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл СтрРеквизитов = ""; Попытка СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить(); Исключение Прервать; КонецПопытки; Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл ТипыРеквизита = Реквизит.Тип.Типы(); Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип); Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита) И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя; Прервать; КонецЕсли; КонецЦикла; КонецЦикла; СодержимоеТЧ.Свернуть(СтрРеквизитов); Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл Попытка ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя]; Исключение Продолжить; КонецПопытки; МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита)); Если МетаданныеЗначения = Неопределено Тогда // базовый тип Продолжить; КонецЕсли; ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И Метаданные.Документы.Содержит(МетаданныеЗначения) И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда Попытка СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс")); Исключение ОтладкаТекстОшибки = ОписаниеОшибки(); КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; мУжеВСписке.Вставить(ДокументСсылка, Истина); Для Каждого СтрСЗ Из СписокРеквизитов Цикл СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(СтрСЗ.Значение, СписокСвязанныхДокументов, мУжеВСписке); КонецЦикла; Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", ДокументСсылка); Выборка = Запрос.Выполнить().Выбрать(); ЕСли Выборка.Следующий() Тогда СписокСвязанныхДокументов.Добавить(Выборка.Ссылка); Иначе СписокСвязанныхДокументов.Добавить(ДокументСсылка); КонецЕсли; Возврат СписокСвязанныхДокументов; КонецФункции Функция ПолучитьПодчиненныеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт Если СписокСвязанныхДокументов = Неопределено Тогда СписокСвязанныхДокументов = Новый СписокЗначений; КонецЕсли; Если мУжеВСписке = Неопределено Тогда мУжеВСписке = Новый Соответствие; КонецЕсли; Таблица = ПолныеПрава.ПолучитьВыборкуПоКритериюОтбора("СвязанныеДокументы", ДокументСсылка); КэшПоТипамДокументов = Новый Соответствие; Для Каждого СтрокаТаблицы ИЗ Таблица Цикл МетаданныеДокумента = СтрокаТаблицы.Ссылка.Метаданные(); Если Не ПравоДоступа("Чтение", МетаданныеДокумента) Тогда Продолжить; КонецЕсли; ИмяДокумента = МетаданныеДокумента.Имя; СинонимДокумента = МетаданныеДокумента.Синоним; СтруктураТипа = КэшПоТипамДокументов[ИмяДокумента]; Если СтруктураТипа = Неопределено Тогда СтруктураТипа = Новый Структура("Синоним, МассивСсылок", СинонимДокумента, Новый Массив); КэшПоТипамДокументов.Вставить(ИмяДокумента, СтруктураТипа); КонецЕсли; СтруктураТипа.МассивСсылок.Добавить(СтрокаТаблицы.Ссылка); КонецЦикла; ЕСли КэшПоТипамДокументов.Количество() = 0 Тогда Возврат СписокСвязанныхДокументов; КонецЕсли; ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ ("; ТекстЗапросаКонец = ") КАК ПодчиненныеДокументы "; Запрос = Новый Запрос; Для Каждого КлючИЗначение ИЗ КэшПоТипамДокументов Цикл Запрос.Текст = Запрос.Текст + ?(Запрос.Текст = "", " |ВЫБРАТЬ ", " |ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ") + " |Ссылка |ИЗ Документ." + КлючИЗначение.Ключ + " |ГДЕ Ссылка В (&" + КлючИЗначение.Ключ + ")"; Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение.МассивСсылок); КонецЦикла; Запрос.Текст = ТекстЗапросаНачало + Запрос.Текст + ТекстЗапросаКонец; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда СписокСвязанныхДокументов.Добавить(Выборка.Ссылка); мУжеВСписке.Вставить(Выборка.Ссылка, Истина); СписокСвязанныхДокументов = ПолучитьПодчиненныеДокументы(Выборка.Ссылка, СписокСвязанныхДокументов, мУжеВСписке); КонецЕсли; КонецЦикла; Возврат СписокСвязанныхДокументов; КонецФункции
Основной параметр функций «ДокументСсылка» — обязательный. Это ссылка на документ, для которого будем получать родительские (подчиненные) документы. Также может быть полезен в работе параметр «СписокСвязанныхДокументов». Он не является обязательным, и используется для хранения списка документов из структуры подчиненности. Его можно задать, если, например, нужен общий список и родительских, и подчиненных документов. Примеры: 1. Получение общего списка родительских документов двух и более документов.
СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(ДокументСсылка1);
СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(ДокументСсылка2, СписокСвязанныхДокументов);
2. Получение общего списка и родительских, и подчиненных документов.
СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(ДокументСсылка);
СписокСвязанныхДокументов = ПолучитьПодчиненныеДокументы(ДокументСсылка, СписокСвязанныхДокументов);
Дополнение:
Функция ПолучитьВыборкуПоКритериюОтбора(ИмяКритерияОтбора, ЗначениеКритерия) Экспорт Запрос = Новый Запрос; ТекстЗапроса = ""; Для Каждого ЭлементСостава ИЗ Метаданные.КритерииОтбора[ИмяКритерияОтбора].Состав Цикл Если Не ЭлементСостава.Тип.СодержитТип(ТипЗнч(ЗначениеКритерия)) Тогда Продолжить; КонецЕсли; ПутьКДанным = ЭлементСостава.ПолноеИмя(); СтруктураПутьКДанным = ОбщегоНазначения.РазобратьПутьКОбъектуМетаданных(ПутьКДанным, ЭлементСостава.Родитель()); ЕСли НЕ ПравоДоступа("Чтение", СтруктураПутьКДанным.Метаданные) Тогда Продолжить; КонецЕсли; ИмяОбъекта = СтруктураПутьКДанным.ТипОбъекта + "." + СтруктураПутьКДанным.ВидОбъекта; ПсевдонимТаблицы = СтруктураПутьКДанным.ТипОбъекта + "_" + СтруктураПутьКДанным.ВидОбъекта + "_" + СтруктураПутьКДанным.ИмяТаблЧасти; ТекущаяСтрокаГДЕ = "ГДЕ " + ПсевдонимТаблицы + "." +СтруктураПутьКДанным.ИмяРеквизита + " = &ЗначениеКритерияОтбора"; ИмяТЧ = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1); ИмяРеквизита = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1); ТекстЗапроса = ТекстЗапроса + (?(ТекстЗапроса = "", "ВЫБРАТЬ", "ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ") + " |" + ПсевдонимТаблицы + ".Ссылка ИЗ " + ИмяОбъекта + "." + СтруктураПутьКДанным.ИмяТаблЧасти + " КАК " + ПсевдонимТаблицы + " |" + СтрЗаменить(ТекущаяСтрокаГДЕ, "..", ".") + " |"); КонецЦикла; Если ТекстЗапроса = "" Тогда Возврат Новый ТаблицаЗначений; КонецЕсли; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерия); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции
Функция РазобратьПутьКОбъектуМетаданных(ПутьКДанным, МетаданныеОбъекта = Неопределено) Экспорт Структура = Новый Структура; СоответствиеИмен = Новый Массив(); СоответствиеИмен.Добавить("ТипОбъекта"); СоответствиеИмен.Добавить("ВидОбъекта"); СоответствиеИмен.Добавить("ПутьКДанным"); СоответствиеИмен.Добавить("ИмяТаблЧасти"); СоответствиеИмен.Добавить("ИмяРеквизита"); Для индекс = 1 по 3 Цикл Точка = Найти(ПутьКДанным, "."); ТекущееЗначение = Лев(ПутьКДанным, Точка-1); Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение); ПутьКДанным = Сред(ПутьКДанным, Точка+1); КонецЦикла; ПутьКДанным = СтрЗаменить(ПутьКДанным, "Реквизит.", ""); Если Структура.ПутьКДанным = "ТабличнаяЧасть" Тогда Для индекс = 4 по 5 Цикл Точка = Найти(ПутьКДанным, "."); Если Точка = 0 Тогда ТекущееЗначение = ПутьКДанным; Иначе ТекущееЗначение = Лев(ПутьКДанным, Точка-1); КонецЕсли; Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение); ПутьКДанным = Сред(ПутьКДанным, Точка+1); КонецЦикла; Иначе Структура.Вставить(СоответствиеИмен[3], ""); Структура.Вставить(СоответствиеИмен[4], ПутьКДанным); КонецЕсли; Если МетаданныеОбъекта <> Неопределено Тогда Структура.Вставить("Метаданные", МетаданныеОбъекта); Иначе Если Структура.ТипОбъекта = "Документ" Тогда Структура.Вставить("Метаданные", Метаданные.Документы[Структура.ВидОбъекта]); Иначе Структура.Вставить("Метаданные", Метаданные.Справочники[Структура.ВидОбъекта]); КонецЕсли; КонецЕсли; Возврат Структура; КонецФункции