Имя: Пароль:
1C
1С v8
Как в БП3.0 (БСП) получить структру адреса?
0 acsent
 
05.12.13
16:52
Это просто п.ц какой то.
ХМЛ перегоняется в объекты неведомой структуры.
Как получить Город, улицу, дом?
1 Леха Дум
 
05.12.13
17:05
Посмотри что происходит при открытии общей формы "ВводАдреса"
2 acsent
 
05.12.13
17:23
Там полный ПЭ происходит
3 acsent
 
05.12.13
17:24
&НаСервереБезКонтекста
Процедура ЗначениеРеквизитовПоКонтактнойИнформации(Контекст, РедактируемаяИнформация)
    
    ДанныеАдреса = РедактируемаяИнформация.Состав;
    
    // Общие реквизиты
    Контекст.ПредставлениеАдреса = РедактируемаяИнформация.Представление;
    Контекст.Комментарий         = РедактируемаяИнформация.Комментарий;
    
    // Копия комментария для анализа измененности
    Контекст.КопияКомментария = Контекст.Комментарий;
    
    // Страна по наименованию
    НаименованиеСтраны = СокрЛП(ДанныеАдреса.Страна);
    Если ПустаяСтрока(НаименованиеСтраны) Тогда
        Контекст.Страна = Справочники.СтраныМира.ПустаяСсылка();
    Иначе
        СсылкаНаРоссию = Справочники.СтраныМира.Россия;
        Если ВРЕГ(НаименованиеСтраны)=ВРЕГ(СокрЛП(СсылкаНаРоссию.Наименование)) Тогда
            Контекст.Страна    = СсылкаНаРоссию;
            Контекст.КодСтраны = СсылкаНаРоссию.Код;
        Иначе
            ДанныеСтраны = Справочники.СтраныМира.ДанныеСтраныМира(, НаименованиеСтраны);
            Если ДанныеСтраны=Неопределено Тогда
                // Не нашли ни в справочнике, ни в классификаторе
                Контекст.Страна    = Неопределено;
                Контекст.КодСтраны = Неопределено;
            Иначе
                Контекст.Страна    = ДанныеСтраны.Ссылка;
                Контекст.КодСтраны = ДанныеСтраны.Код;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
    ВычисленноеПредставление = КонтактнаяИнформацияСлужебный.СформироватьПредставлениеКонтактнойИнформации(
        РедактируемаяИнформация, Контекст.ВидКонтактнойИнформации);
        
    Если КонтактнаяИнформацияСлужебный.ЭтоРоссийскийАдрес(ДанныеАдреса) Тогда
        Контекст.РазрешитьВводАдресаВСвободнойФорме = Не ПустаяСтрока(ДанныеАдреса.Состав.Адрес_по_документу);
        
        // Дополнительно проверяем случай, когда представление по документу равно вычисленному
        Если Контекст.РазрешитьВводАдресаВСвободнойФорме Тогда
            Если ПредставленияАдресаОдинаковы(ВычисленноеПредставление, ДанныеАдреса.Состав.Адрес_по_документу, Истина)
                И ПредставленияАдресаОдинаковы(РедактируемаяИнформация.Представление, ДанныеАдреса.Состав.Адрес_по_документу, Истина)
            Тогда
                Контекст.РазрешитьВводАдресаВСвободнойФорме = Ложь;
                ДанныеАдреса.Состав.Адрес_по_документу      = "";
            КонецЕсли;
        КонецЕсли;
    Иначе
        Контекст.ПредставлениеИностранногоАдреса = Строка(ДанныеАдреса.Состав);
    КонецЕсли;
    
    // Индекс просто ставим
    Контекст.Индекс = Формат(КонтактнаяИнформацияСлужебный.ПочтовыйИндексАдреса(ДанныеАдреса), "ЧГ=");
    
    // Синтетический "Населенный пункт" получаем как представление
    Контекст.НаселенныйПункт = КонтактнаяИнформацияСлужебный.ПредставлениеНаселенногоПункта(ДанныеАдреса);
    АнализКлассификатора = КонтактнаяИнформацияСлужебный.НаселенныеПунктыПоПредставлению(Контекст.НаселенныйПункт);
    Если АнализКлассификатора.ДанныеВыбора.Количество()=1 Тогда
        ВыбранноеЗначение = АнализКлассификатора.ДанныеВыбора[0].Значение.Значение;
        Контекст.КодКлассификатораНаселенногоПункта = ВыбранноеЗначение.Код;
        Контекст.НаселенныйПунктНайденТочно         = Истина;
        Контекст.НаселенныйПункт                    = ВыбранноеЗначение.Представление;
    Иначе
        Контекст.КодКлассификатораНаселенногоПункта = 0;
        Контекст.НаселенныйПунктНайденТочно         = Ложь;
        // Наименование населенного пункта не трогаем
    КонецЕсли;
    
    СформироватьДетальныйНаселенныйПункт(Контекст, ДанныеАдреса);
    
    // Синтетическую "Улицу" получаем как представление
    Контекст.Улица = КонтактнаяИнформацияСлужебный.ПредставлениеУлицы(ДанныеАдреса);
    АнализКлассификатора = КонтактнаяИнформацияСлужебный.УлицыПоПредставлению(Контекст.КодКлассификатораНаселенногоПункта, Контекст.Улица);
    Если АнализКлассификатора.ДанныеВыбора.Количество()=1 Тогда
        ВыбранноеЗначение = АнализКлассификатора.ДанныеВыбора[0].Значение.Значение;
        Контекст.КодКлассификатораУлицы = ВыбранноеЗначение.Код;
        Контекст.УлицаНайденаТочно      = Истина;
        Контекст.Улица                  = ВыбранноеЗначение.Представление;
    Иначе
        Контекст.КодКлассификатораУлицы = 0;
        Контекст.УлицаНайденаТочно      = Ложь;
        // Наименование улицы не трогаем
    КонецЕсли;
    
    // Дом, строение, помещение
    ЗданияИПомещения = КонтактнаяИнформацияСлужебный.ЗданияИПомещенияАдреса(ДанныеАдреса);
    
    // Первые два здания выделяем отдельно, остальное в списке
    ТаблицаДанных = ЗданияИПомещения.Здания;
    
    // Вид = 1 - признак дома, владения. Вид = 2, доп строение
    СтрокаДома = ТаблицаДанных.Найти(1, "Вид");
    Если СтрокаДома<>Неопределено Тогда
        Контекст.ТипДома = СтрокаДома.Тип;
        Контекст.Дом     = СтрокаДома.Значение;
        Контекст.ДомНайденТочно = Истина;
        ТаблицаДанных.Удалить(СтрокаДома);
    Иначе
        Контекст.ДомНайденТочно = Ложь;
    КонецЕсли;
    
    СтрокаДома = ТаблицаДанных.Найти(2, "Вид");
    Если СтрокаДома<>Неопределено Тогда
        Контекст.ТипСтроения = СтрокаДома.Тип;
        Контекст.Строение    = СтрокаДома.Значение;
        ТаблицаДанных.Удалить(СтрокаДома);
    КонецЕсли;
    
    НомерСтроки  = ТаблицаДанных.Количество();
    Пока НомерСтроки>0 Цикл
        НомерСтроки = НомерСтроки - 1;
        ЗаполнитьЗначенияСвойств(Контекст.ДополнительныеЗдания.Вставить(0), ТаблицаДанных[НомерСтроки]);
    КонецЦикла;
    
    // Первое помещение указываем отдельно, остальные в списке
    ТаблицаДанных = ЗданияИПомещения.Помещения;
    НомерСтроки   = ТаблицаДанных.Количество();
    Если НомерСтроки>0 Тогда
        Контекст.ТипПомещения = ТаблицаДанных[0].Тип;
        Контекст.Помещение    = ТаблицаДанных[0].Значение;
    КонецЕсли;
    Пока НомерСтроки>1 Цикл
        НомерСтроки = НомерСтроки - 1;
        ЗаполнитьЗначенияСвойств(Контекст.ДополнительныеПомещения.Вставить(0), ТаблицаДанных[НомерСтроки]);
    КонецЦикла;
    
    // Если переданное представление отличается от вычисленного, то адрес изменен
    Если Не Контекст.РазрешитьВводАдресаВСвободнойФорме И Не ПредставленияАдресаОдинаковы(Контекст.ПредставлениеАдреса, ВычисленноеПредставление) Тогда
        Контекст.Модифицированность = Истина;
    КонецЕсли;
    
КонецПроцедуры
4 Жан Пердежон
 
05.12.13
17:25
(2) для БСП это норма
5 acsent
 
05.12.13
17:32
Может кто знает, как нормальную структуру в стиле старых приложений получить
6 zak555
 
05.12.13
17:35
ТЧ КонтактнаяИнформация
не ?
7 samozvanec
 
05.12.13
17:39
(3) ахренеть. индусы блин. а в ДанныеАдреса нет что ль?
8 acsent
 
05.12.13
17:54
(7) данныеАдреса - это хитровы.ный XDTO объект
9 acsent
 
05.12.13
17:55
(6) да, нужно получить значения полей
10 Wobland
 
05.12.13
17:58
(8) я щас глупость скажу, но схема из оттуда не вынимается никак?
11 acsent
 
05.12.13
18:03
Схема и так есть
http://img440.imageshack.us/i/ik3m.png/
12 Записьдампа
 
05.12.13
22:18
Эхъэхъэхъ...

1) Громко выматерившись,  записаться на курсы http://www.1c.ru/rus/partners/training/uc3/demand1.jsp?id=561, почувствовать свою крутизну.
2) Тихо выматерившись, скачать приказ ФНС России от 31 августа 2011 г. № ММВ-7-1/525@ "Об утверждении Единых требований к описанию адресов" (http://fias.nalog.ru/Public/Docs/prik525.doc), курить приложения, пакет XDTO и код 1С до просветления.
3) Если предыдущее не помогает, то вызвать метод УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML
Независимо от того, куда вы едете — это в гору и против ветра!