База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как найти циклические ссылки в справочнике Номенклатуры в БП3?
- В этой теме 1 ответ, 2 участника, последнее обновление 3 часа, 40 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
24 марта 2026 в 13:30 #36227
найти циклические ссылки в справочнике Номенклатуры БП3
-
24 марта 2026 в 13:30 #36228
В типовой конфигурации «Бухгалтерия предприятия 3» справочник Номенклатура не содержит реквизитов-ссылок на самого себя, которые могли бы образовывать циклические ссылки напрямую. Однако, если в вашей конфигурации есть доработки или расширения, где в справочнике Номенклатура добавлены реквизиты-ссылки на элементы этого же справочника (например, для группировки, комплектов или составных изделий), то циклические ссылки могут появиться.
Чтобы найти циклические ссылки в справочнике Номенклатура, если они есть, можно использовать следующий алгоритм на 1С:
1. Определить реквизит справочника Номенклатура, который ссылается на элементы этого же справочника (например, «Родитель» или «Состав»).
2. Написать рекурсивную процедуру, которая для каждого элемента будет проходить по цепочке ссылок и проверять, не возвращается ли она к исходному элементу.
Пример кода на 1С для поиска циклов по реквизиту «Родитель» (если он есть):
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748Процедура НайтиЦиклыВНоменклатуре()Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Номенклатура.Ссылка КАК Элемент,| Номенклатура.Родитель КАК Родитель|ИЗ| Справочник.Номенклатура КАК Номенклатура|ГДЕ| Номенклатура.Родитель <> NULL";Результат = Запрос.Выполнить().Выгрузить();// Создаем словарь для быстрого поиска родителяРодители = Новый Соответствие;Для Каждого Строка Из Результат ЦиклРодители.Вставить(Строка.Элемент, Строка.Родитель);КонецЦикла;Циклы = Новый Массив;Для Каждого Элемент Из Родители.Ключи() ЦиклПосещенные = Новый Массив;Текущий = Элемент;Пока Текущий <> Неопределено ЦиклЕсли Посещенные.Найти(Текущий) <> Неопределено Тогда// Цикл найденЦиклы.Добавить(Текущий);Прервать;КонецЕсли;Посещенные.Добавить(Текущий);Если Родители.СодержитКлюч(Текущий) ТогдаТекущий = Родители.Получить(Текущий);ИначеТекущий = Неопределено;КонецЕсли;КонецЦикла;КонецЦикла;Если Циклы.Количество() = 0 ТогдаСообщить("Циклических ссылок не найдено.");ИначеСообщить("Найдены циклические ссылки в элементах:");Для Каждого Элемент Из Циклы ЦиклСообщить(Элемент);КонецЦикла;КонецЕсли;КонецПроцедурыОбъяснение:
— Запрос выбирает все элементы с заполненным реквизитом «Родитель».
— В коде строится словарь «Родители», где ключ — элемент, значение — его родитель.
— Для каждого элемента происходит обход по цепочке родителей, если в процессе обхода встречается уже посещенный элемент — значит есть цикл.
Если в вашей конфигурации нет реквизита «Родитель» или другого реквизита-ссылки на самого себя, то циклических ссылок в справочнике Номенклатура не может быть.
Если циклы могут быть в других реквизитах, замените «Родитель» на нужный реквизит.
—
Если вы хотите проверить циклы в других справочниках или документах, алгоритм аналогичный — нужно найти реквизиты-ссылки на самого себя и проверить цепочки.
Рекомендую также проверить расширения и доработки, которые могли добавить такие реквизиты.
—
https://helpf.pro/faq/view/1074.html — пример перебора всех типов ссылок в конфигурации.Если нужна помощь с конкретным реквизитом — уточните его название.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.