Имя: Пароль:
1C
1С v8
Связанные документы (Переполнение стека)
0 Юлианна_Н
 
26.04.23
10:23
Всем привет.
Помогите добрым советом.

Суть проблемы:

Есть УТ 11.4.13.85, в которой пользователи загружают банк, разносят денежку по РТУ (в договорах Расчет стоит как "По накладным"), иногда бывает, что появляется нераспределенный остаток, который в этом же документе (Поступление безналичных) отображаетсяя отдельной строкой и в объекте расчетов кладет сам себя. После какого то времени формируется документ Взаимозачета, в котором в Авансах указывается документ Поступления безнала и сумма аванса (+ еще какие то рандомные суммы, которые как по мне не влияют на проблему)... и дальше происходит самое интересное, все документы РТУ из поступления безнала не могут открыть связанные документы из-за ошибки переполнения стека, при отладке нашла зацикливание документов Взаимозачет и Поступление безнала. При этом Если выводить связанные по Взаимозачету - норм, во всех остальных случаях - ошибка.
Ах да, механизм вывода связанных документов типовой, руками там никто не лазил, смотрела по сравнению конфы с конфой поставщика, все четко.

Вопросов собсна несколько:
1. Правильное ли это оформление аванса? Я думаю, что да, но есть сомнения... может аванс нужно или можно на договор класть? Увы опыта не хватает, что бы ответить правильно.
2. Как правильно будет исправить этот момент? Может дело в "возрасте" конфигурации? И достаточно будет обновиться (ну или скопипастить часть механизма с новой версии)?


Всем заранее спасибо за советы.
Добра вам.
1 shuhard
 
26.04.23
10:26
(0)[при отладке нашла зацикливание документов Взаимозачет и Поступление безнала]
ну поставь счетчик циклов - в чём проблема ?
2 Юлианна_Н
 
26.04.23
10:29
(1) мммм, думаю, что не вариант... в связанных может быть 1 документ, может быть 10 (Заказы, РТУ, СЧФ и прочие) проверить на тип документа можно, но в теории по одной РТУ может быть два поступления безнала. Думала об этом, но пока подожду еще советов.
Спасиб
3 CepeLLlka
 
26.04.23
10:32
(2)Запоминайте ссылки по которым уже были выведены родительские/подчиненные документы и когда в цикле на такой снова натыкаетесь, пропускайте.
4 Мультук
 
гуру
26.04.23
10:34
(0)

>>Ах да, механизм вывода связанных документов типовой, руками там никто не лазил

Программисты 1С тоже ошибаются, они тоже люди.

>> И достаточно будет обновиться (ну или скопипастить часть механизма с новой версии)?

В обновлениях УТ 11.5 несчастный отчет по связанным переделывался раз три (это то, что я видел).
Он то собирался по критериям отбора, потом по некоему запросу, потом опять вернулись к критериям отбора

Я бы пошел по пути (1) или (3)

>> мммм, думаю, что не вариант... в связанных может быть 1 документ
Вам говорят не про кол-во документов, а про глубину рекурсии.
5 Юлианна_Н
 
26.04.23
10:36
(3) и об этом думала, типа завести переменную, класть туда текобъект и потом сравнивать, предпочтения пока этому варианту и были, но хотелось экспертное мнение большинства.
Мерси.
6 Юлианна_Н
 
26.04.23
10:40
(5) вот про глубину как раз и беда, т.к. Критерии отбора берут связанные только вниз, и вот тут как раз если связанные по заказу смотреть - то будут РТУ - СЧФ - и.т. все, что вниз, а Поступление то к РТУ вяжется и оно вниз находит снова себя и взаимозачет.

Мне по душе больше третий вариант, по первому все рано придется писать проверки из серии "Что за объект и куда направляемся" а третьим вариантом мы будем проверять каждого на дубль...

Благодарю за совет, и да... я ни чуть не против того что разрабы тоже люди. вопрос больше был может в какой то версии пофиксили и можно копипастнуть оттуда.
(Ни капли претензий к окружающим)
7 unenu
 
26.04.23
10:50
на удивление грамотный стажер
8 dmt
 
26.04.23
10:57
(5) ждем прибытия экспертов
9 unenu
 
26.04.23
11:13
я бы поставил точку останова в

СтруктураПодчиненностиПереопределяемый.ПередВыводомСвязанногоОбъекта(Объект, СвойстваОбъекта, Отказ)
и "проехал" по связанным докам где идет зацикливание.

ПередВыводомСвязанногоОбъекта(Объект, СвойстваОбъекта, Отказ)

СвойстваОбъекта имеют данные для принятия решения Отказ = Истина для документа зацикливания,
пример:

Выражение    Значение    Тип
Объект    Реализация товаров и услуг ...-115... от 30.12.2022 8:34:17    ДокументСсылка.РеализацияТоваровУслуг
СвойстваОбъекта    Структура    Структура
  Выводился    Структура    Структура
    ВПодчиненных    1    Число
           Итого    1    Число
ЭтоОсновной    Ложь    Булево
ЭтоПодчиненный    Истина    Булево
ЭтоСлужебный    Ложь    Булево

в этом методе можно писать свой костыль, сбросив замок или в расширении.
10 Юлианна_Н
 
26.04.23
11:17
а картинку тут можно загрузить? Или только ссылкой?
11 Юлианна_Н
 
26.04.23
11:32
ОбщаяФорма.СвязанныеДокументы

Процедура ВывестиПодчиненныеОбъекты(ТекущийОбъект, ДеревоРодитель, ВыведенныеОбъекты)

Часть процедуры:

Таблица = ОбъектыПоКритериюОтбора(ТекущийОбъект);
	Если Таблица = Неопределено Тогда
		Возврат;
	КонецЕсли;


В ТекущийОбъект попадает стартовый объект, к примеру РТУ, после в Таблица - попадает ТЗ со всеми объектами вниз, подчиненными
Тут уже Взаимозачет и Поступление

В конце этой же процедуры формируется запрос из типов документов (Взаимозачет и Поступление) и Выбираются объекты и потом эти объекты выборкой...

Пока Выборка.Следующий() Цикл
		
		НоваяСтрока = ДобавитьСтрокуВДерево(ДеревоРодитель, Выборка, ВыведенныеОбъекты, Истина);
		
		Если НоваяСтрока <> Неопределено
			И Не ДобавляемыйОбъектИмеетсяСредиРодителей(ДеревоРодитель, Выборка.Ссылка) Тогда
			
			ВывестиПодчиненныеОбъекты(Выборка.Ссылка, НоваяСтрока, ВыведенныеОбъекты);
		Иначе
			ВывестиПодчиненныеОбъекты(Выборка.Ссылка, ДеревоРодитель, ВыведенныеОбъекты);
		КонецЕсли;
		
	КонецЦикла;


Вызывается та же процедура с Поступлением к примеру, проходит она же, процедура, в Текущий объект попадает поступление, выборкой находит себя же и начинает снова то же самое
Вот место цикличности (вызов процедуры с самим собой же)
12 Юлианна_Н
 
26.04.23
11:27
Надеюсь получилось объяснить, т.к. это выжимка какая то а не описание
13 lubitelxml
 
26.04.23
11:28
Может просто убрать лишнюю галку в критериях отбора?
14 Юлианна_Н
 
26.04.23
11:30
(13) дай я тя расцелую....

это был бы джек пот, но тут будут потери, в зависимости от исключенной галки - кто то исчезнет из связанных, к примеру Взаимозачет (его не жалко), но нужно как то это юзерам объяснить, что бы вопросов не было потом
15 Юлианна_Н
 
26.04.23
11:34
я все таки за переменную, т.к. цикличность в рамках одной процедуры - завернуть всю ее же (процедуру) в условие, но боюсь, что нужно продумать детально, а вдруг связанные вниз выведутся не все... тут нужно поэкспериментировать... или же заполнение ТЗ Таблица завернуть в условие, и пускай будет Неопределено если дубль

С Неопределено я смотрела по другим документам, у которых нет ошибки, Таблица = Неопределено и все работает норм
16 lubitelxml
 
26.04.23
11:34
(14) если циклится - скорее всего стоит лишняя галка, и если уберешь - все останется на месте, даже если вы свои документы добавляли. Я очень много переписывал УТ, ни разу проблем с зацикливанием не видел в связанных документах. Вы где-то лишнюю галку определенно поставили.
17 Юлианна_Н
 
26.04.23
11:43
(16) Блин, ну тогда давай попробуем так...

Нетиповые документы там есть - факт
Ругается на типовые документы - факт (Взаимозачет и Поступление)
Эти два документа в состав добавлены поставщиком и они там в той же форме и остались, то есть и сам документ и определенные реквизиты.

С чего начать тестировать?
Кикнуть с критерия нетиповые документы (вместе с реквизитами)? Могу на тестовой, легко. могу вернуть Критерий отбора в первоначальный вид и протестить. А потом, если вдруг заработает - добавлять по одному и смотреть на каком объекте рухнет.

Об этом речь? Я правильно поняла?
18 unenu
 
26.04.23
11:46
(11) это сложный путь.
по моему, ловить зацикливание логичнее внутри метода который для этого уже создан (9).
Просто анализировать свойство Выводился.ВПодчиненных
19 Юлианна_Н
 
26.04.23
11:53
(18) Функция ВыводитьТекущийОбъект(ТекущийОбъект, ВыведенныеОбъекты, ЭтоПодчиненный, Отказ = Ложь)
    
    Выводился = ВыведенныеОбъекты[ТекущийОбъект];
    Если Выводился = Неопределено Тогда
        Выводился = НовыеСвойстваЧастотыВыводаОбъекта();
    КонецЕсли;
    
    СвойстваОбъекта = НовыеСвойстваОбъекта();
    СвойстваОбъекта.ЭтоОсновной = (ТекущийОбъект = ОсновнойОбъект);
    СвойстваОбъекта.ЭтоПодчиненный = ЭтоПодчиненный;
    СвойстваОбъекта.Выводился = Выводился;
    
    Если СвойстваОбъекта.ЭтоОсновной
        Или ЭтоПодчиненный И Выводился.ВПодчиненных > 0
        Или Не ЭтоПодчиненный И (Выводился.Итого - Выводился.ВПодчиненных) > 0 Тогда
        
        Отказ = Истина;
    КонецЕсли;
    
    СтруктураПодчиненностиПереопределяемый.ПередВыводомСвязанногоОбъекта(ТекущийОбъект, СвойстваОбъекта, Отказ);
    
    Возврат Не Отказ;
    
КонецФункции



Об этом речь? Скорее всего да...

Тут я не была, странно что пропустила... да, согласна... нужно отладить тут еще, почему ОНО постоянно возвращает НЕОПРЕДЕЛЕНО, если документ нужно вывести а
20 Юлианна_Н
 
26.04.23
11:59
Ребята, огромное вам спасибо.... я теперь получила кучу новых вводных "нормальных", а это и была цель поднятия темы, что бы меньше костылить.

С весной вас всех

PS. Писать результат починки? Или не нужно? А то могу написать потом типа "Все починила" и все :)
21 unenu
 
26.04.23
12:02
(20) конечно писать, среда - маленькая пятница
22 Юлианна_Н
 
27.04.23
12:11
И снова всем привет...
Исправила...

1. СтруктураПодчиненностиПереопределяемый.ПередВыводомСвязанногоОбъекта(ТекущийОбъект, СвойстваОбъекта, Отказ); - вот тут пусто, решила так и оставить
2. Как сделала?:

- в месте где происхоодит вывод документа  - проверила был выведен или нет и , если нет - выводим, если да - пропускаем

  Если НЕ ВыведенныеОбъекты.Получить(ТекущийОбъект) = Неопределено Тогда
    . . .
  КонецЕсли;

- а в месте где происходит зацикливание, не поверите, сделала то же самое. только красное, если документ выведен, то хватит

Если ВыведенныеОбъекты.Получить(Выборка.Ссылка) = Неопределено Тогда
    ВывестиПодчиненныеОбъекты(Выборка.Ссылка, ДеревоРодитель, ВыведенныеОбъекты);
КонецЕсли;

Как говориться: "Без пап, мам и переменных" ☝️Народная мудрость☝️

Как минимум все заработало, протестила на множестве вариантов, вроде документы выводятся все.