|   |   | 
| 
 | XDTO : Установить в Неопределено реквизит объекта XDTO | ☑ | ||
|---|---|---|---|---|
| 0
    
        bvb 25.07.25✎ 11:02 | 
        Добрый день
 Нужно в процедуре, получив параметром объект XDTO очистить его реквизиты (свойства) установленные как строки Я пытаюсь это сделать так : Процедура ОчиститьЗначениеXDTO(Элемент, ИмяРеквизита) //Элемент.Свойства().Получить("ИмяРеквизита") Если Элемент[ИмяРеквизита] <> Неопределено Тогда Элемент[ИмяРеквизита] = Неопределено; Но он не очищает и ругается на то , что у свойства установлен фасет 
 | |||
| 1
    
        mikecool 25.07.25✎ 11:09 | 
        емнип - нельзя установить значение, не соответствующее ограничению поля     | |||
| 2
    
        bvb 25.07.25✎ 11:59 | 
        (1) Походу, да.  
 Но мне очень нужно. И да, мне доступен только сам объект XDTO. Метод .Очистить для него не работает. Может можно подправить типизацию через Элемент.Свойства().Получить("ИмяРеквизита") ? | |||
| 3
    
        АнализДанных 25.07.25✎ 11:48 | 
        (0) Очень мало информации. Если нужен xml, который сделан по схеме XSD, но при этом ты хочешь изменить какие-то значения, которые противоречат схеме, то можно сделать так:
 Сначала сохранить объект XDTO в xml файл, потом прочить это xml, через фабрикуXDTO, но при этом не указывать схему, тогда можно будет зачистить нужные поля. Правда при сохранении что-то в файле может сохраниться иначе, например, если в схеме есть список, но он с одной строкой, то он сохранится не как список, а как какой-то одинарный тип. | |||
| 4
    
        bvb 25.07.25✎ 12:21 | 
        (3) Если подробно - мне нужно отредактировать контент Utd820SellerContent исходящего документа в Контур Диадок в части адресов продавца и покупателя (грузополучатель норм)
 Проблема в том, что нужно взять подробный юридический адрес строкой из представления юр. адреса. Первоначально контент адреса заполнен из полей. В юр адресе заполнены поля и представление. Очищать стандартные поля я не хочу (это на крайний случай) Я подставляю текстовое представление но если, не очистить поля, то для выгружаемого документа, приоритетнее значения из полей Вот я и пытаюсь очистить поля оставив заполненным только AdressText. | |||
| 5
    
        denk32 25.07.25✎ 15:51 | 
        (0) можно попробовать создать новый объект xdto, заполнить как нужно и его присвоить:
 НовыйОбъектXDTO = ГенерацияXML.НовыйProtoОбъектXDTO( "AddressInfo970", Ложь ); ГенерацияXML - это встроенная обработка в макет КонтурДиадокГенерацияXML | |||
| 6
    
        mikecool 25.07.25✎ 15:53 | 
        (4) а нельзя это сделать в подключаемом модуле и пользоваться объектной моделью?     | |||
| 7
    
        denk32 25.07.25✎ 15:54 | 
        + из подключаемого модуля можно создать так:
 Ядро = ПолучитьИзВременногоХранилища(ОсновнойМодуль.ОбщийКонтекстКлиентСервер.АдресОбработкиЯдра); ГенерацияXML = Ядро.Модуль_ГенерацияXML(Ядро) | |||
| 8
    
        mikecool 26.07.25✎ 10:32 | 
        (7) да там и попроще есть путь, не помню только наизусть
 типа передвыгрузкой или как-то так, доступен объект, который впоследствии выгружается | |||
| 9
    
        denk32 25.07.25✎ 16:15 | 
        (8) ПодготовитьЭлектронныйДокумент?     | |||
| 10
    
        bvb 31.07.25✎ 11:51 | 
        8,9) Все правильно. ПодготовитьЭлектронныйДокумент 
 это Событие мы перехватываем, но контент xml как я понимаю уже там сформирован Content = Параметры.Результат.Content; И менять нужно пытаться его Функция ПодготовитьЭлектронныйДокумент(Параметры) // Имя шаблона: Произвольное изменение контента УПД Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда Content = Параметры.Результат.Content; Документ1С = Параметры.Результат.Документ1С; ВидДокументаРазвернутый = Параметры.ВидДокументаРазвернутый; ТипКонтента_XDTO = ВидДокументаРазвернутый.ТипКонтента; //+СКБ Контур Петровская E1C_in-201559 05.02.2025 //Если ВРЕГ(ТипКонтента_XDTO) = ВРЕГ("Utd820SellerContent") Тогда Если ОсновнойМодуль.ТипСоответствуетКонтентуУПД(ВидДокументаРазвернутый) Тогда //-СКБ Контур Петровская E1C_in-201559 05.02.2025 УПД_ИзменитьКонтент(Content, Документ1С); Нужно поменять поля в Content.Consignees[0].Address все кроме .AddressText (в нем произвольный адрес) поставить в неопределенно, но они не сбрасываются Можно только очистить строку (кроме полей RegionCode, ZipCode, - они фасетные) | |||
| 11
    
        bvb 31.07.25✎ 11:57 | 
        (5) Вы мне предлагаете создать новый объект XDTO "Address" с нужной структурой и наполнением полей?
 А как пихнуть его на место нативного Content.Consignees[0].Address | |||
| 12
    
        mikecool 31.07.25✎ 11:58 | 
        (10) не, было событие, завязанное на подготовку контента, которое срабатывает не только при отправке, но и для печатных форм, к примеру...     | |||
| 13
    
        mikecool 31.07.25✎ 12:00 | 
        +12 в новом модуле это
 Функция ПослеПодготовкиПакета(Параметры) | |||
| 14
    
        bvb 31.07.25✎ 16:55 | 
        (13) Дык проблема останется 
 Я также получу Content = Параметры.Результат.Content; Это будет объект XDTO и как его править ? | |||
| 15
    
        bvb 04.08.25✎ 11:25 | 
        Проблема решена :
 (7) Denk32 Спасибо большое Вам за подсказку. Сам бы ни за что не догадался. Идея в том, что менять поля существующего объекта нельзя, но можно создать новый и подменить им существующий. Переписал исходную процедуру, созданную программистами Контура. С помощью функции. «НовыйProtoОбъектXDTO» создал новый протообъект XDTO. Зарядил его как нужно. Процедура ИзменитьАдресПоДаннымОбъектаКИ (ExtendedOrganizationInfo, НовыйАдрес) Если НЕ ЗначениеЗаполнено(НовыйАдрес) Тогда Возврат; КонецЕсли; //Генерим новый прото объект XDTO и заполняем его Ядро = ПолучитьИзВременногоХранилища(ОсновнойМодуль.ОбщийКонтекстКлиентСервер.АдресОбработкиЯдра); //СтруктураОбъектаXDTO = Ядро.ОбработкаОбъект.ОбъектXDTOВСтруктуру(Address); ГенерацияXML = Ядро.ОбработкаОбъект.Модуль_ГенерацияXML(Ядро); НовыйОбъектXDTO = ГенерацияXML. ("AddressInfo", Ложь); //заполняем только нужные нам поля (остальные по умолчанию в неопределено) УстановитьЗначениеXDTO(НовыйОбъектXDTO, "IsForeign" , Истина); УстановитьЗначениеXDTO(НовыйОбъектXDTO, "CountryCode" , "643"); УстановитьЗначениеXDTO(НовыйОбъектXDTO, "AddressText" , НовыйАдрес); //Затем присваиваем в контент на место аутентичного объекта XDTO. ExtendedOrganizationInfo.Address = НовыйОбъектXDTO; ЗЫ : Кстати, внедренцы из контура. Хотели. За это 20 часов * 3500 р. = 70000 р И еще мозг выносили с постановкой задачи и генерацией тестового стенда | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |