Имя: Пароль:
1C
1С v8
ЗагрузкаФЛ: адрес записывается как АдресЗаПределамиРФ
0 dft2014
 
22.04.14
19:34
Загружаю новых физ.лиц в спр.ФЛ. При записи адреса, данные записываются как АдресЗаПределамиРФ, хотя это не так. Подскажите, где ошибка? Вот код:


Функция СоздатьФЛ(ТекСтрока)
    
    СпрФЛ = Справочники.ФизическиеЛица.СоздатьЭлемент();
    СпрФЛ.Наименование     = ТекСтрока.FIO;
    СпрФЛ.ИНН              = ТекСтрока.INN;
    СпрФЛ.Записать();
    
    // АДРЕСА
    КонтактИнформАдресФизЛица = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00001");      // адрес для информирования
    КонтактЮрАдресФизЛица = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00002");          // адрес по прописке
    КонтактФактАдресФизЛица = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00003");        // адрес проживания
    КонтактИнформАдресКонтактногоЛица = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00015");
    
    // адрес регистрации
    Если ТекСтрока.REG_ADDR_KLADR <> "" Тогда
        л_СтруктураАдреса = РазобратьАдрес(ТекСтрока.REG_ADDR_KLADR);
    КонецЕсли;
    
    мНаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    
    Если мНаборЗаписей.Количество() = 0 Тогда
        
        мНаборЗаписей.Отбор.Объект.Значение        = СпрФЛ.Ссылка;
        мНаборЗаписей.Отбор.Объект.Использование    = Истина;
        мНаборЗаписей.Отбор.Тип.Значение            = Перечисления.ТипыКонтактнойИнформации.Адрес;
        мНаборЗаписей.Отбор.Тип.Использование        = Истина;
        мНаборЗаписей.Отбор.Вид.Значение            = КонтактЮрАдресФизЛица;
        мНаборЗаписей.Отбор.Вид.Использование        = Истина;
        
        
        ЗаписьНабора = мНаборЗаписей.Добавить();
        ЗаписьНабора.Объект = СпрФЛ.Ссылка;
        ЗаписьНабора.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
        ЗаписьНабора.Вид = КонтактЮрАдресФизЛица;
        
        Если Флаг_ФорматКЛАДР Тогда
            ЗаписьНабора.Поле1 = л_СтруктураАдреса.Индекс;
            ЗаписьНабора.Поле2 = л_СтруктураАдреса.Регион;
            ЗаписьНабора.Поле3 = л_СтруктураАдреса.Район;
            ЗаписьНабора.Поле4 = л_СтруктураАдреса.Город;
            ЗаписьНабора.Поле5 = л_СтруктураАдреса.НасПункт;
            ЗаписьНабора.Поле6 = л_СтруктураАдреса.Улица;
            ЗаписьНабора.Поле7 = СокрЛП(л_СтруктураАдреса.Дом);
            ЗаписьНабора.Поле8 = СокрЛП(л_СтруктураАдреса.Корпус);
            ЗаписьНабора.Поле9 = СокрЛП(л_СтруктураАдреса.Квартира);
            
            ЗаписьНабора.Представление = ЗаписьНабора.Поле1+?(СокрЛП(ЗаписьНабора.Поле2)="","",", "+ЗаписьНабора.Поле2)+
            ?(СокрЛП(ЗаписьНабора.Поле3)="","",", "+ЗаписьНабора.Поле3)+
            ?(СокрЛП(ЗаписьНабора.Поле4)="","",", "+ЗаписьНабора.Поле4)+
            ?(СокрЛП(ЗаписьНабора.Поле5)="","",", "+ЗаписьНабора.Поле5)+
            ?(СокрЛП(ЗаписьНабора.Поле6)="","",", "+ЗаписьНабора.Поле6)+
            ?(СокрЛП(ЗаписьНабора.Поле7)="","",", дом № "+ЗаписьНабора.Поле7)+?(СокрЛП(ЗаписьНабора.Поле8)="","",", корпус "+ЗаписьНабора.Поле8)+?(СокрЛП(ЗаписьНабора.Поле9)="","",", кв."+ЗаписьНабора.Поле9);
        Иначе
            ЗаписьНабора.Представление = ТекСтрока.REG_ADDR_KLADR;
        КонецЕсли;
        
        
        мНаборЗаписей.Записать(Истина);
    КонецЕсли;
    
    СпрФЛ.Записать();
    
КонецФункции
1 Базис
 
naïve
22.04.14
19:37
ВидыКонтактнойИнформации - предопределённые элементы.
Проверяй каждое поле на соответствие типа. И, ЕМНИП, есть флаг, определяющий - надо ли читать структурированные поля или только текстовое представление.

Готовый вариант не искал в конфе?
2 Wobland
 
22.04.14
19:37
>данные записываются как АдресЗаПределамиРФ
в куда записываются?
3 echo77
 
22.04.14
19:39
По-моему, если индекса нет, то адрес трактуется как "за пределами РФ"
4 echo77
 
22.04.14
19:47
+(3) точнее проверяется что индекс содержит все цифры

//Функция для объекта редактирования определяет Российский это адрес или нет
Функция ОпределитьДляОбъектаРоссийскийАдрес(ОбъектРедактирования) Экспорт
    
    Если (НЕ ПустаяСтрока(ОбъектРедактирования.Поле1)) Тогда
        // если хотя бы один символ не цифра, то это точно не индекс
        МожетБытьИностарнныйАдрес = ЕстьНеЦифрыВСтроке(ОбъектРедактирования.Поле1);
        // так, если есть хоть одна не цифра - это иностранный адрес, а если все цивры то Российский
        Возврат НЕ МожетБытьИностарнныйАдрес;
    КонецЕсли;
    
    // Сравниваем представления
    ЭтоРоссийскийАдрес = (ПолучитьПредставлениеАдреса(ОбъектРедактирования) = ОбъектРедактирования.Представление);
    Возврат ЭтоРоссийскийАдрес;
        
КонецФункции
5 dft2014
 
22.04.14
19:47
(3) Индекс есть.
6 Wobland
 
22.04.14
19:48
>МожетБытьИностарнныйАдрес
типовая?
7 dft2014
 
22.04.14
19:53
Нет, наш российский адрес (г.Омск). ЗУП типовая.
8 dft2014
 
22.04.14
20:03
Сам адрес (который загружаю), до загрузки у меня записан так:

,305029,Курская обл,,Курск г,,Карла Маркса ул,33/41,,14
9 dft2014
 
22.04.14
20:10
В таком формате, тоже не загружает:

305029, Курская обл, Курск г, Карла Маркса ул, д. 33/41, кв. 14
10 Wobland
 
22.04.14
20:11
а почему я на мисте не могу точку останова поставить и посмотреть в переменные? миста поломалась?
11 dft2014
 
22.04.14
20:13
Все пишет в АдресЗаПределамиРФ, вот:
http://s020.radikal.ru/i716/1404/07/7be5226433ab.jpg
12 Wobland
 
22.04.14
20:14
(11) не открываются свойства. не видно, по какому принципу оно так решает
13 dft2014
 
22.04.14
20:39
(10) Базовая конфигурация, не дает отладчик запустить...
14 Wobland
 
22.04.14
20:42
(13) думаешь, дело в базовости?
15 Wobland
 
22.04.14
20:45
на этом свете есть люди, я уверен, могущие разобраться в вопросе по одному лишь модулю формы, даже не запуская пофигуратор
16 Zypse
 
22.04.14
20:45
Вот как определяет:

ПроизвольныйАдрес = (УправлениеКонтактнойИнформацией.ПолучитьПредставлениеАдреса(ЭтотОбъект) <> Представление);

ЗЫ: что-то в твоем представлении не так...
17 Wobland
 
22.04.14
20:48
ну ладно. с одним лишь модулем формы я погорячился. но без мозга всё равно ничего не выйдет
18 Wobland
 
22.04.14
20:49
(16) а вообще не похоже на русский/нерусский адрес
19 dft2014
 
22.04.14
20:50
Ничего не понимаю, что не так! Вот еще выкладываю код функции, она тоже вызывается в моем коде в (0):


Функция РазобратьАдрес(л_Адрес)
    // 1 поле - страна
    // 2 поле - индекс
    // 3 поле регион
    // 4 поле район
    // 5 поле город
    // 6 поле населенный пункт
    // 7 поле улица
    // 8 поле дом
    // 9 поле корпус
    // 10 поле квартира
    
    лСтр = Новый Структура;
    
    // страна
    Страна = "Россия";
    Если Найти(л_Адрес,",")=1           Тогда
        лСтр.Вставить("Страна",Страна);
    ИначеЕсли Найти(л_Адрес,",")>0 Тогда
        Страна = Лев(л_Адрес,Найти(л_Адрес,",")-1);
        лСтр.Вставить("Страна",Страна);
    Иначе
        // не формат
        Возврат лСтр;
    КонецЕсли;
    
    // индекс
    Индекс = "";
    л_Адрес1 = Сред(л_Адрес,Найти(л_Адрес,",")+1);
    Индекс = Лев(л_Адрес1,Найти(л_Адрес1,",")-1);
    лСтр.Вставить("Индекс",Индекс);
    
    // регион
    Регион = "";
    л_Адрес2 = Сред(л_Адрес1,Найти(л_Адрес1,",")+1);
    Регион = Лев(л_Адрес2,Найти(л_Адрес2,",")-1);
    лСтр.Вставить("Регион",Регион);
    
    // район
    Район = "";
    л_Адрес3 = Сред(л_Адрес2,Найти(л_Адрес2,",")+1);
    Район = Лев(л_Адрес3,Найти(л_Адрес3,",")-1);
    лСтр.Вставить("Район",Район);
    
    // Город
    Город = "";
    л_Адрес4 = Сред(л_Адрес3,Найти(л_Адрес3,",")+1);
    Город = Лев(л_Адрес4,Найти(л_Адрес4,",")-1);
    лСтр.Вставить("Город",Город);
    
    // Насел. пункт
    НасПункт = "";
    л_Адрес5 = Сред(л_Адрес4,Найти(л_Адрес4,",")+1);
    НасПункт = Лев(л_Адрес5,Найти(л_Адрес5,",")-1);
    лСтр.Вставить("НасПункт",НасПункт);

    // Улица
    Улица = "";
    л_Адрес6 = Сред(л_Адрес5,Найти(л_Адрес5,",")+1);
    Улица = Лев(л_Адрес6,Найти(л_Адрес6,",")-1);
    лСтр.Вставить("Улица", Улица);

    // Дом
    Дом = "";
    л_Адрес7 = Сред(л_Адрес6,Найти(л_Адрес6,",")+1);
    Дом = Лев(л_Адрес7,Найти(л_Адрес7,",")-1);
    лСтр.Вставить("Дом", Дом);

    // Корпус
    Корпус = "";
    л_Адрес8 = Сред(л_Адрес7,Найти(л_Адрес7,",")+1);
    Корпус = Лев(л_Адрес8,Найти(л_Адрес8,",")-1);
    лСтр.Вставить("Корпус", Корпус);

    // Квартира
    Квартира = "";
    л_Адрес9 = Сред(л_Адрес8,Найти(л_Адрес8,",")+1);
    Квартира = л_Адрес9;
    лСтр.Вставить("Квартира", Квартира);    
    
    Возврат лСтр;
//    ,111111,область,,город,,улица,дом,корпус,квартира
    
КонецФункции
20 Wobland
 
22.04.14
20:52
(19) абыдно, правда? радиобаттон на форме есть, а когда он принимает то или иное значение, не понятно
21 Zypse
 
22.04.14
21:00
(19) я в (16) уже указал условие по которому меняется радиобатон. В (0) пиши
ЗаписьНабора.Представление = УправлениеКонтактнойИнформацией.ПолучитьПредставлениеАдреса(ЗаписьНабора)
22 Wobland
 
22.04.14
21:05
(21) а это точно про радиобаттон а не про какой-нибудь адрес в формате КЛАДР?
23 mdocs
 
22.04.14
21:09
укурки из 1с когда-то решили что если адрес не по формату, то он за пределами РФ. Типичная логика методистов 1с. В новых конфах подход слегка по адекватнее вроде.
24 Zypse
 
22.04.14
21:10
(22) про радиобатон. Обработка "РедактированиеКонтактнойИнформации". Форма "ФормаЗаписиАдреса"
25 Wobland
 
22.04.14
21:12
(23) (24) вот и ладненько. уже прошло 26 минут ;)
26 mdocs
 
22.04.14
21:19
(19) Укурки когда писали способ хранения адреса забыли про страну, потом ее начали пихать в Поле1 если адрес за пределами и совсем не указывать если адрес российский (в этом случае в Поле1 находится Индекс).
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший