Имя: Пароль:
1C
1С v8
Добавить структуру подчиненности документу
0 bebibo
 
06.08.21
12:56
Добрый день Всем! Подскажите как быть с проблемой - в расширении у документа добавил новый реквизит "Основание". Нужно его указать в критерии отбора СвязанныеДокументы, чтобы потом по нему можно было видеть СтруктураПодчиненности. Всё надо сделать через расширение. Но у меня не получается менять состав помещенного критерия в расширение. Что можно сделать с этим?! БП 3.0, платформа 8.3.18.1363
1 mikecool
 
06.08.21
13:00
если не можешь менять существующий, запили новый, замени на него команду структуры
2 lucbak
 
06.08.21
13:03
3 bebibo
 
06.08.21
13:12
(2) там только платно скачивать?
4 bebibo
 
06.08.21
13:16
(1) так никак в расширении
5 Dmitrii
 
гуру
06.08.21
13:18
(0) Не нужно заниматься муйнёй. Подобные вещи надо делать в самой конфе, а не в расширении. Тем более, что такие доработки никак не влияют на обновления.
Расширения не для этого предназначены.

Или у вас там замочковый фетиш и панический страх включения возможности изменения в конфигурации?
6 ДенисЧ
 
06.08.21
13:19
(5) Вообще-то изменение критерия отбора запросто слетит при обновлении, которое его затронет...
7 Dmitrii
 
гуру
06.08.21
13:19
Вообще любые изменения данных (новые объекты, реквизиты объектов, измерения и ресурсы регистров и т.п.) надо делать в самой конфе.
8 Dmitrii
 
гуру
06.08.21
13:21
(6) >> Вообще-то изменение критерия отбора запросто слетит при обновлении, которое его затронет.

Вообще-то для этого уже довольно давно появилась возможность выбрать в окне сравнения/объединения при обновлении пункт "Объединить" для типов и состава критериев отбора.
9 ДенисЧ
 
06.08.21
13:22
(8) "может слететь" и "слетит" - как говорили в Одесе - две большие разницы.
10 DJ Anthon
 
06.08.21
13:23
(5) а я сделал...
11 bebibo
 
06.08.21
13:23
Скажите прямо, как мне решить данную проблему?
12 bebibo
 
06.08.21
13:23
(5) Нельзя снимать..
13 DJ Anthon
 
06.08.21
13:25
//    б) Регистр сведений А_СвязанныеРеквизиты, измерение Реквизит типа строка(99), реквизиты Тип, Вид, ТЧ типа строка(25)
//Добавлен регистр сведений для обхода ограничения расширения на изменение/добавление критериев отбора.

&НаСервере
&ИзменениеИКонтроль("ВывестиРодительскиеОбъекты")
Процедура А_ВывестиРодительскиеОбъекты(ТекущийОбъект, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты = Неопределено)
    
    МетаданныеОбъекта = ТекущийОбъект.Метаданные();
    СписокРеквизитов  = Новый СписокЗначений;
    
    Если СлужебныеОбъекты = Неопределено Тогда
        СлужебныеОбъекты = Новый Соответствие;
    КонецЕсли;
    
    Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
        
        Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
#Вставка
            Выборка = РегистрыСведений.А_СвязанныеРеквизиты.Выбрать(Новый Структура("Реквизит", Реквизит.Имя));
            Если НЕ Выборка.Следующий() Тогда
                Продолжить;
            КонецЕсли;
        ИначеЕсли Ложь Тогда
#КонецВставки
            Продолжить;
        КонецЕсли;
        
        Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл
            
            МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
            Если МетаданныеРеквизита = Неопределено Тогда
                Продолжить;
            КонецЕсли;
            
            Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРеквизита)
                Или Не ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
                Продолжить;
            КонецЕсли;
            
            Если Не Метаданные.Документы.Содержит(МетаданныеРеквизита)
                И Не Метаданные.Справочники.Содержит(МетаданныеРеквизита)
                И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеРеквизита) Тогда
                Продолжить;
            КонецЕсли;
            
            ЗначениеРеквизита = ТекущийОбъект[Реквизит.Имя];
            Если ЗначениеЗаполнено(ЗначениеРеквизита)
                И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
                И ЗначениеРеквизита <> ТекущийОбъект
                И СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
                
                ЯвляетсяДокументом  = ОбщегоНазначения.ЭтоДокумент(МетаданныеРеквизита);
                
                Если ЯвляетсяДокументом Тогда
                    ДатаДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЗначениеРеквизита, "Дата", Истина);
                    СписокРеквизитов.Добавить(ЗначениеРеквизита, Формат(ДатаДокумента, "ДЛФ=DT"));
                Иначе
                    СписокРеквизитов.Добавить(ЗначениеРеквизита, Дата(1,1,1));
                КонецЕсли;
                
            КонецЕсли;
        КонецЦикла;
        
    КонецЦикла;
    
    Для Каждого ТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл
        
        ИменаРеквизитов = "";
        СодержимоеТЧ = ТекущийОбъект[ТЧ.Имя].Выгрузить(); // ТаблицаЗначений
        Для Каждого Реквизит Из ТЧ.Реквизиты Цикл

            Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
#Вставка
                Выборка = РегистрыСведений.А_СвязанныеРеквизиты.Выбрать(Новый Структура("Реквизит", Реквизит.Имя));
                Если НЕ Выборка.Следующий() Тогда
                    Продолжить;
                КонецЕсли;
            ИначеЕсли Ложь Тогда
#КонецВставки
                Продолжить;
            КонецЕсли;
                
            Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл
                
                МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
                Если МетаданныеРеквизита = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                
                Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРеквизита)
                    Или Не ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
                    Продолжить;
                КонецЕсли;
                
                Если Не Метаданные.Документы.Содержит(МетаданныеРеквизита)
                    И Не Метаданные.Справочники.Содержит(МетаданныеРеквизита)
                    И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеРеквизита) Тогда
                    Продолжить;
                КонецЕсли;
                
                ИменаРеквизитов = ИменаРеквизитов + ?(ИменаРеквизитов = "", "", ", ") + Реквизит.Имя;
                Прервать;
                
            КонецЦикла;
            
        КонецЦикла;
        
        СодержимоеТЧ.Свернуть(ИменаРеквизитов);
        Для Каждого КолонкаТЧ Из СодержимоеТЧ.Колонки Цикл
            
            Для Каждого СтрокаТЧ Из СодержимоеТЧ Цикл
            
                ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
                МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
                Если МетаданныеЗначения = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                
                Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеЗначения)
                    Или Не ПравоДоступа("Чтение", МетаданныеЗначения) Тогда
                    Продолжить;
                КонецЕсли;
                
                Если ЗначениеРеквизита = ТекущийОбъект
                    Или СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) <> Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                
                ЯвляетсяДокументом  = ОбщегоНазначения.ЭтоДокумент(МетаданныеЗначения);
                Если Не ЯвляетсяДокументом И Не Метаданные.Справочники.Содержит(МетаданныеЗначения)
                    И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеЗначения) Тогда
                    Продолжить;
                КонецЕсли;
                
                Если ЯвляетсяДокументом Тогда
                    ДатаДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЗначениеРеквизита, "Дата", Истина);
                    СписокРеквизитов.Добавить(ЗначениеРеквизита, Формат(ДатаДокумента, "ДЛФ=DT"));
                Иначе
                    СписокРеквизитов.Добавить(ЗначениеРеквизита, Дата(1, 1, 1));
                КонецЕсли;
                
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    СписокРеквизитов.СортироватьПоПредставлению();
    
    Для каждого ЭлементСписка Из СписокРеквизитов Цикл
        
        Выборка = ПолучитьВыборкуПоРеквизитамОбъекта(ЭлементСписка.Значение);
        
        Если Выборка.Следующий() Тогда
            
            НоваяСтрока = ДобавитьСтрокуВДерево(ДеревоРодитель, Выборка, ВыведенныеОбъекты);
            
            Если НоваяСтрока <> Неопределено
                И Не ДобавляемыйОбъектИмеетсяСредиРодителей(ДеревоРодитель, ЭлементСписка.Значение) Тогда
                
                ВывестиРодительскиеОбъекты(ЭлементСписка.Значение, НоваяСтрока, ВыведенныеОбъекты, СлужебныеОбъекты);
                
            ИначеЕсли СлужебныеОбъекты[ЭлементСписка.Значение] = Неопределено Тогда
                
                СлужебныеОбъекты.Вставить(ЭлементСписка.Значение, Истина);
                ВывестиРодительскиеОбъекты(ЭлементСписка.Значение, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты);
                
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
&Вместо("ОбъектыПоКритериюОтбора")
Функция А_ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора)
    // Вставить содержимое метода.
    Результат = ПродолжитьВызов(ЗначениеКритерияОтбора);
    
    Выборка = РегистрыСведений.А_СвязанныеРеквизиты.Выбрать();
    Пока Выборка.Следующий() Цикл
        Реквизит = ?(ПустаяСтрока(Выборка.ТЧ), Метаданные[Выборка.Тип][Выборка.Вид].Реквизиты[Выборка.Реквизит],
            Метаданные[Выборка.Тип][Выборка.Вид].ТабличныеЧасти[Выборка.ТЧ].Реквизиты[Выборка.Реквизит]);
        Если Реквизит.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда
            Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
                                  |    Объект.Ссылка КАК Ссылка
                                  |ИЗ
                                  |    " + СтрЗаменить(СтрЗаменить(Выборка.Тип, "Документы", "Документ"), "Справочники", "Справочник") + "." + Выборка.Вид +
                                    ?(ПустаяСтрока(Выборка.ТЧ), "", "." + Выборка.ТЧ) + " КАК Объект
                                  |ГДЕ
                                  |    Объект." + Выборка.Реквизит + " = &Значение");
            Запрос.УстановитьПараметр("Значение", ЗначениеКритерияОтбора);
            ТЗ = Запрос.Выполнить().Выгрузить();
            Для Каждого Строка ИЗ ТЗ Цикл
                Если Результат = Неопределено Тогда
                    Результат = Новый ТаблицаЗначений;
                    Результат.Колонки.Добавить("Ссылка");
                ИначеЕсли Результат.Найти(Строка.Ссылка, "Ссылка") = Неопределено Тогда
                    Результат.Добавить().Ссылка = Строка.Ссылка;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции
14 DJ Anthon
 
06.08.21
13:29
Только это в КА, а не в БП, не знаю, подойдет или нет. И это, оно мне не пригодилось ))
15 Dmitrii
 
гуру
06.08.21
13:41
(10)(13) Извращенцы.

(12) >> Нельзя снимать.

И идиоты.

Маразм возведённый в абсолют. Что бы не делать - лишь бы непременно через *опу.

PS Извиняюсь за мой французский. Но иногда просто трудно сдержать эмоции.
16 DJ Anthon
 
06.08.21
13:42
(15) о да, конечно, расширения ведь придумали для извращенцев. че бы в основной конфиге не работать-то, а?
17 lucbak
 
06.08.21
13:57
(16) Скорее всего ВПФ - это то чем человек занят 99% своего времени, вряд-ли там требуются расширения (их же ведь еще и изучать надо)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.