Имя: Пароль:
1C
1С v8
Связанные документы
0 tishkir
 
30.07.26
12:53
Здравствуйте.
Решаю задачу, чтобы программно найти подчиненные документы к Реализации.
Запрос по критериям отбора и строка типа
НайденныеСвязанныеДокументы = КритерииОтбора.СвязанныеДокументы.Найти(ДокументСсылка);
возвращают только исходную реализацию.
Прошу подсказать, кто сталкивался. Может в недрах 1с уже есть готовая процедура.
1С УТ 11.5
1 tishkir
 
30.07.26
12:58
мне надо все что внизу от реализации ))
2 paramedic
 
30.07.26
13:18
В недрах ЕРП (КА, УТ) есть общая форма СвязанныеДокументы. Там есть все для копипасты в свой код получения структуры подчиненности. Раздельно вверх и вниз.
3 Fedor-1971
 
30.07.26
13:57
(0) Попробуй посмотреть тут: ОбщаяФорма.СвязанныеДокументы.Форма.Модуль(822, 4)
4 Garykom
 
гуру
30.07.26
14:18
Отладка > Замер производительности
Выполняешь действия, останавливаешь замер, копаешься/ищешь в списке строк кода
Находишь подходящие места, ставишь точки останова
Снова запускаешь, "Стек вызова", изучаешь что происходит через отладку
5 Garykom
 
гуру
30.07.26
14:27
Короче там на основе
Метаданные.КритерииОтбора.СвязанныеДокументы.Состав

Строится кодом текст запроса и выполняется
С условиями типа
.ДокументОснование = &ЗначениеКритерияОтбора
.ПервичныйДокумент = &ЗначениеКритерияОтбора

и т.д.
6 Garykom
 
гуру
30.07.26
14:26
Самое обидное что функции нифига не экспортные и в модуле формы
Когда писали нифига не подумали что такое надо в общий модуль выносить
7 tishkir
 
03.08.26
11:49
Здравствуйте.
Спасибо большое всем, кто помогал.
В виде запроса данную задачу решить нереально (для меня).
Пришлось копировать реквизиты и текст модуля формы СвязанныеДокументы и допиливать под свои нужды. В результате у меня получилась процедура, которая по ссылке на любой документ выдает таблицу значений со всеми дочерними документами.
Так или иначе нужный результат получен, жаль что при помощи костылей и гипса. 1с в очередной раз "удивила".
Спасибо.
8 maxab72
 
03.08.26
11:55
(7) В УТ10.3 там простой код для формирования запроса:

Процедура ЗаполнитьТаблицуСвязанныхДокументов()
    Таблица = ПолныеПрава.ПолучитьСписокДокументовПоКритериюОтбора("СвязанныеДокументы", Ссылка);
    
    КэшПоТипамДокументов = Новый Соответствие;

    Для Каждого СтрокаТаблицы ИЗ Таблица Цикл
        МетаданныеДокумента = СтрокаТаблицы.Ссылка.Метаданные();
        Попытка
            Если Не ПравоДоступа("Чтение", МетаданныеДокумента) Тогда
                Продолжить;
            КонецЕсли;            
        Исключение
            Продолжить;
        КонецПопытки;
        ИмяДокумента = МетаданныеДокумента.Имя;
        СинонимДокумента = МетаданныеДокумента.Синоним;
        
        ДополнитьКэшМетаданных(МетаданныеДокумента, ИмяДокумента);
        
        СтруктураТипа = КэшПоТипамДокументов[ИмяДокумента];
        Если СтруктураТипа = Неопределено Тогда
            СтруктураТипа = Новый Структура("Синоним, МассивСсылок", СинонимДокумента, Новый Массив);
            КэшПоТипамДокументов.Вставить(ИмяДокумента, СтруктураТипа);
        КонецЕсли;
        СтруктураТипа.МассивСсылок.Добавить(СтрокаТаблицы.Ссылка);        
    КонецЦикла;
    
    ЕСли КэшПоТипамДокументов.Количество() = 0 ТОгда
        Возврат;
    КонецЕсли;
    
    ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ (";
    ТекстЗапросаКонец = ") КАК ПодчиненныеДокументы УПОРЯДОЧИТЬ ПО ПодчиненныеДокументы.Дата, ПодчиненныеДокументы.Номер";
    Запрос = Новый Запрос;
    ТекстЗапроса = "";
    Для Каждого КлючИЗначение ИЗ КэшПоТипамДокументов Цикл
        ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "", "
            |ВЫБРАТЬ ", "
            |ОБЪЕДИНИТЬ ВСЕ
            |ВЫБРАТЬ") + "
            |Дата, Номер, Ссылка, Представление,";
            Для каждого Реквизит из мМассивРеквизитов цикл
                ТекстЗапроса = ТекстЗапроса + "
                |"+?(мКэшРеквизитовДокумента[КлючИЗначение.Ключ][Реквизит], Реквизит, "NULL") + " КАК "+Реквизит+",";
            КонецЦикла;
            ТекстЗапроса = ТекстЗапроса + "
            | """+КлючИЗначение.Значение.Синоним+""" КАК ВидДокумента
            |ИЗ Документ." + КлючИЗначение.Ключ + "
            |ГДЕ Ссылка В (&" + КлючИЗначение.Ключ + ")";
                    
        Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение.МассивСсылок);        
    КонецЦикла;
    
    Запрос.Текст = ТекстЗапросаНачало + ТекстЗапроса + ТекстЗапросаКонец;
    
    Выборка = Запрос.Выполнить().Выбрать();    
    Пока Выборка.Следующий() Цикл
        Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
            НоваяСтрока = ТаблицаСвязанныхДокументов.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
            мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
        КонецЕсли;
    КонецЦикла;        

КонецПроцедуры

Функция ПолучитьСписокДокументовПоКритериюОтбора(ИмяКритерияОтбора, ЗначениеКритерияОтбора) Экспорт
    
    Запрос = Новый Запрос;
    ТекстЗапроса = "";
    
    ТипЗначениеКритерияОтбора = ТипЗнч(ЗначениеКритерияОтбора);
            
    Запрос = Новый Запрос;
    ТекстЗапроса = "";
    
    Для Каждого ЭлементСостава ИЗ Метаданные.КритерииОтбора[ИмяКритерияОтбора].Состав Цикл
        
        Если НЕ ЭлементСостава.Тип.СодержитТип(ТипЗначениеКритерияОтбора) Тогда
            Продолжить;
        КонецЕсли;
        
        ПутьКДанным = ЭлементСостава.ПолноеИмя();
        СтруктураПутьКДанным = ОбщегоНазначения.РазобратьПутьКОбъектуМетаданных(ПутьКДанным);
        
        Попытка
            ЕСли НЕ ПравоДоступа("Чтение", СтруктураПутьКДанным.Метаданные) Тогда
                Продолжить;
            КонецЕсли;
        Исключение
            Продолжить;
        КонецПопытки;
        
        ИмяОбъекта = СтруктураПутьКДанным.ТипОбъекта + "." + СтруктураПутьКДанным.ВидОбъекта;
        СинонимОбъекта = СтруктураПутьКДанным.ТипОбъекта + СтруктураПутьКДанным.ВидОбъекта;
        
        ТекущаяСтрокаГДЕ = "ГДЕ " + СинонимОбъекта + "." +СтруктураПутьКДанным.ИмяРеквизита + " = &ЗначениеКритерияОтбора";
            
        ИмяТЧ = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
        ИмяРеквизита = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
        ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "", "ВЫБРАТЬ", "ОБЪЕДИНИТЬ ВСЕ
        |ВЫБРАТЬ") + "
        |" + СинонимОбъекта +".Ссылка ИЗ " + ИмяОбъекта + "." + СтруктураПутьКДанным.ИмяТаблЧасти + " КАК " + СинонимОбъекта + "
        |" + СтрЗаменить(ТекущаяСтрокаГДЕ, "..", ".") + "
        |";
        
    КонецЦикла;
    
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора);
    Возврат Запрос.Выполнить().Выгрузить();         
    
КонецФункции
9 paramedic
 
03.08.26
15:12
(7) Это уже некромантией попахивает.)) Особенно, если вопрос был об УТ 11.
10 maxab72
 
03.08.26
15:40
(9) и там и там есть критерий отбора. Чем проще и примитивнее для данной задачи: чтоб человек разобрался - тем лучше.