8.х Разложить строку в структуру

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем alexburn, 17 июл 2014.

  1. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Приветствую вас!
    Конфа не типовая. Режим работы - управляемое приложение.
    Пытаюсь сделать реквизит ввода адреса на форме. Вроде сделал, в поле отображается адрес нормально, и форма выбора адреса открывается. Но стоит закрыть документ, потом заново открыть и отредактировать адрес - то форма выбора адреса пустая (не заполнены поля по представлению адреса). Это я понял почему. Ребят, в типовых, вроде, есть механизм преобразования строки (представления адреса) к структуре адреса, т.е. нужно строку разбить на структуру и уже ее передавать при создании на сервере документа. Подскажите пожалуйста, как организовать ?
  2. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.435
    Симпатии:
    373
    Баллы:
    104
    можно просто из типовой дёрнуть этот код, там он отдельный
    alexburn нравится это.
  3. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Прикол в том, что у меня нет доступа к типовой :), вот по-этому и спрашиваю, может кто-нибудь выложит:)
  4. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Это?
    Код:
    // Функция возвращает представление адреса собранного из полей значений Поле1 - Поле10
    //
    // Параметры
    //  НЕТ
    //
    // Возвращаемое значение:
    //   Строка
    //
    Функция ПолучитьПредставлениеАдреса(Запись) Экспорт
    
        ТекПредставление = "";
    
        Если СокрЛП(Запись.Поле1) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + СокрЛП(Запись.Поле1);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле2) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + СокрЛП(Запись.Поле2);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле3) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + СокрЛП(Запись.Поле3);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле4) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + СокрЛП(Запись.Поле4);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле5) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + СокрЛП(Запись.Поле5);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле6) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + СокрЛП(Запись.Поле6);
        КонецЕсли;
       
        ТипДома = Неопределено;
        ТипКорпуса = Неопределено;
        ТипКвартиры = Неопределено;
        Если ТипЗнч(Запись) = Тип("Структура") Тогда
            Запись.Свойство("ТипДома",     ТипДома);
            Запись.Свойство("ТипКорпуса",  ТипКорпуса);
            Запись.Свойство("ТипКвартиры", ТипКвартиры);
        Иначе
            ТипДома     = Запись.ТипДома;
            ТипКорпуса  = Запись.ТипКорпуса;
            ТипКвартиры = Запись.ТипКвартиры;
        КонецЕсли;
       
        Если СокрЛП(Запись.Поле7) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + ?(ЗначениеЗаполнено(ТипДома), ТипДома, "дом") + " № " + СокрЛП(Запись.Поле7);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле8) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + ?(ЗначениеЗаполнено(ТипКорпуса), ТипКорпуса, "корпус") + " " + СокрЛП(Запись.Поле8);
        КонецЕсли;
    
        Если СокрЛП(Запись.Поле9) <> "" Тогда
            ТекПредставление = ТекПредставление + ", " + ?(ЗначениеЗаполнено(ТипКвартиры), ТипКвартиры, "кв.") + СокрЛП(Запись.Поле9);
        КонецЕсли;
    
        Если СтрДлина(ТекПредставление) > 2 Тогда
            ТекПредставление = Сред(ТекПредставление, 3);
        КонецЕсли;
       
        Возврат ТекПредставление;
    
    КонецФункции
  5. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Нет, нужно наоборот, строку (представление) разложить в структуру, т.к. нужно будет передавать при создании на сервере в форме, чтобы форма выбора адреса содержала данные уже заполненного поля.
    --- Объединение сообщений, 17 июл 2014 ---
    Нужно что-то типа:
    Код:
    Функция ПолучитьСтруктуруАдресаИзСтроки(Знач СтроковыйАдрес) Экспорт
  6. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    а разве в типовых не хранится : все поля по отдельности + представление ???
  7. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Конфа не типовая :)
    --- Объединение сообщений, 17 июл 2014 ---
    Есть модуль управления контактной информацией, но этой функции там нет :(
  8. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Это?
    Код:
    //Функция раскладывает строку с данными об адресе (в формате 9 запятых) на элементы структуры
    Функция РазложитьАдрес(Знач СтрокаАдрес) Экспорт
       
        Страна = "";
        Индекс = "";
        Регион = "";
        Район = "";
        Город = "";
        НаселенныйПункт = "";
        Улица ="";
        Дом ="";
        Корпус ="";
        Квартира ="";
       
        ТипДома ="";
        ТипКорпуса ="";
        ТипКвартиры ="";
    
        МассивАдрес    =    РазложитьСтрокуВМассивПодстрок(СтрокаАдрес);
        ЭлементовВМассиве = МассивАдрес.Количество();  
    
        Если ЭлементовВМассиве    >    0    тогда
            Страна    =    СокрЛП(МассивАдрес[0]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    1    тогда
            Индекс    =    СокрЛП(МассивАдрес[1]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    2    тогда
            Регион    =    СокрЛП(МассивАдрес[2]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    3    тогда
            Район    =    СокрЛП(МассивАдрес[3]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    4    тогда
            Город    =    СокрЛП(МассивАдрес[4]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    5    тогда
            НаселенныйПункт    =    СокрЛП(МассивАдрес[5]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    6    тогда
            Улица    =    СокрЛП(МассивАдрес[6]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    7    тогда
            Дом    =    СокрЛП(МассивАдрес[7]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    8    тогда
            Корпус    =    СокрЛП(МассивАдрес[8]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    9    тогда
            Квартира    =    СокрЛП(МассивАдрес[9]);
        КонецЕсли;
       
        //Расширенное представление
        Если ЭлементовВМассиве    >    10    тогда
            ТипДома        = СокрЛП(МассивАдрес[10]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    11    тогда
            ТипКорпуса    = СокрЛП(МассивАдрес[11]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    12    тогда
            ТипКвартиры = СокрЛП(МассивАдрес[12]);
        КонецЕсли;
       
        СтруктураВозврата = Новый Структура;
        СтруктураВозврата.Вставить("Страна",Страна);
        СтруктураВозврата.Вставить("Индекс",Индекс);
        СтруктураВозврата.Вставить("Регион",Регион);
        СтруктураВозврата.Вставить("Район",Район);
        СтруктураВозврата.Вставить("Город",Город);
        СтруктураВозврата.Вставить("НаселенныйПункт",НаселенныйПункт);
        СтруктураВозврата.Вставить("Улица",Улица);
        СтруктураВозврата.Вставить("Дом",Дом);
        СтруктураВозврата.Вставить("Корпус",Корпус);
        СтруктураВозврата.Вставить("Квартира",Квартира);
        СтруктураВозврата.Вставить("ТипДома",ТипДома);
        СтруктураВозврата.Вставить("ТипКорпуса",ТипКорпуса);
        СтруктураВозврата.Вставить("ТипКвартиры",ТипКвартиры);
    
        Возврат СтруктураВозврата;
       
    КонецФункции
    
    // Функция "расщепляет" строку на подстроки, используя заданный
    //        разделитель. Разделитель может иметь любую длину.
    //        Если в качестве разделителя задан пробел, рядом стоящие пробелы
    //        считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
    //        игнорируются.
    //        Например,
    //        РазложитьСтрокуВМассивПодстрок(",строка 1,,,строка 2", ",") возвратит массив значений из пяти элементов,
    //        три из которых - пустые строки, а
    //        РазложитьСтрокуВМассивПодстрок(" строка1   строка 2", " ") возвратит массив значений из двух элементов
    //
    //    Параметры:
    //        Стр -             строка, которую необходимо разложить на подстроки.
    //                        Параметр передается по значению.
    //        Разделитель -     строка-разделитель, по умолчанию - запятая.
    //
    //
    //    Возвращаемое значение:
    //        массив значений, элементы которого - подстроки
    //
    Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
       
        МассивСтрок = Новый Массив();
        Если Разделитель = " " Тогда
            Стр = СокрЛП(Стр);
            Пока 1=1 Цикл
                Поз = Найти(Стр,Разделитель);
                Если Поз=0 Тогда
                    МассивСтрок.Добавить(Стр);
                    Возврат МассивСтрок;
                КонецЕсли;
                МассивСтрок.Добавить(Лев(Стр,Поз-1));
                Стр = СокрЛ(Сред(Стр,Поз));
            КонецЦикла;
        Иначе
            ДлинаРазделителя = СтрДлина(Разделитель);
            Пока 1=1 Цикл
                Поз = Найти(Стр,Разделитель);
                Если Поз=0 Тогда
                    МассивСтрок.Добавить(Стр);
                    Возврат МассивСтрок;
                КонецЕсли;
                МассивСтрок.Добавить(Лев(Стр,Поз-1));
                Стр = Сред(Стр,Поз+ДлинаРазделителя);
            КонецЦикла;
        КонецЕсли;
       
    КонецФункции 
    alexburn нравится это.
  9. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Походу да, буду припиливать :)
  10. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
  11. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.435
    Симпатии:
    373
    Баллы:
    104
    а пример вводимого адреса можно?
  12. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Вот пример адреса :)
    Байкон, Башкортостан Респ, Бакалинский р-н, Килькабызовский с/с
    Только что-то криво выводит :( поля немного не попадают:)
  13. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Нее, процедура работает немного некорректно. Зайдем с другой стороны. Как можно сохранить структуру в реквизит объекта ?
  14. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.435
    Симпатии:
    373
    Баллы:
    104
    криво скорее всего потому что не все поля соблюдены
    то есть если разделитель "," то пустые/пропущенные поля должны ими тоже отделятся
    --- Объединение сообщений, 17 июл 2014 ---
    самым простым там такое
    Код:
    //Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
    //
    //Параметры:
    //    Строка                 - Строка - текст с разделителями;
    //    Разделитель            - Строка - разделитель строк текста, минимум 1 символ;
    //    ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
    //    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
    //     - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
    //       включаются в результат.
    //     - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
    //       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
    //       при других разделителях результатом функции будет пустой массив.
    //
    // Возвращаемое значение:
    //    Массив - массив строк.
    //
    //Примеры:
    //    РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых  - пустые строки;
    //    РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
    //    РазложитьСтрокуВМассивПодстрок(" один   два  ", " ") - возвратит массив из двух элементов;
    //    РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
    //    РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
    //    РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
    //
    Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт
       
        Результат = Новый Массив;
       
        // для обеспечения обратной совместимости
        Если ПропускатьПустыеСтроки = Неопределено Тогда
            ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
            Если ПустаяСтрока(Строка) Тогда 
                Если Разделитель = " " Тогда
                    Результат.Добавить("");
                КонецЕсли;
                Возврат Результат;
            КонецЕсли;
        КонецЕсли;
        //
       
        Позиция = Найти(Строка, Разделитель);
        Пока Позиция > 0 Цикл
            Подстрока = Лев(Строка, Позиция - 1);
            Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
                Результат.Добавить(Подстрока);
            КонецЕсли;
            Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
            Позиция = Найти(Строка, Разделитель);
        КонецЦикла;
       
        Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
            Результат.Добавить(Строка);
        КонецЕсли;
       
        Возврат Результат;
       
    КонецФункции 
    
    
    такой пример "Байкон, Башкортостан Респ, Бакалинский р-н, Килькабызовский с/с" , переданный строкой и указанием разделителя = ","
    преобразует в массив
    1) Байкон
    2) Башкортостан Респ
    3) Бакалинский р-н
    4) Килькабызовский с/с
  15. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Да, но если строка имеет уже другую структуру, например, 443548, Самарская обл, Волжский р-н, Смышляевка пгт, Шоссейная ул, дом № 1А, кв. 27, то уже криво выходит.
    Я вот о чем подумал. Может как-то можно сохранять эту структуру в реквизит объекта, например в соответствие, где указываем ключ структуры и значение. Потом при создании на сервере формы - вытаскиваем это соответствие и подставляем в реквизит формы.
  16. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29

    чем пост 6 не угодил ? как раз то же самое ))
  17. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.435
    Симпатии:
    373
    Баллы:
    104
    данное получиться в:
    1) 443548
    2) Самарская обл
    3) Волжский р-н
    4) Смышляевка пгт
    5) Шоссейная ул
    6) дом № 1А
    7) кв. 27
    --- Объединение сообщений, 17 июл 2014 ---
    всего лишь учесть по формату адреса количество полей и всё
  18. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    В каких типовых ?
    --- Объединение сообщений, 17 июл 2014 ---
    У меня заполняет почему-то вот так:
    111.png
    Последнее редактирование: 17 июл 2014
  19. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Я думаю ошибка в этом коде:), а может так должно быть;)
    Код:
    Если ЭлементовВМассиве    >    0    тогда
            Страна    =    СокрЛП(МассивАдрес[0]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    1    тогда
            Индекс    =    СокрЛП(МассивАдрес[1]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    2    тогда
            Регион    =    СокрЛП(МассивАдрес[2]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    3    тогда
            Район    =    СокрЛП(МассивАдрес[3]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    4    тогда
            Город    =    СокрЛП(МассивАдрес[4]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    5    тогда
            НаселенныйПункт    =    СокрЛП(МассивАдрес[5]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    6    тогда
            Улица    =    СокрЛП(МассивАдрес[6]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    7    тогда
            Дом    =    СокрЛП(МассивАдрес[7]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    8    тогда
            Корпус    =    СокрЛП(МассивАдрес[8]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    9    тогда
            Квартира    =    СокрЛП(МассивАдрес[9]);
        КонецЕсли;
      
        //Расширенное представление
        Если ЭлементовВМассиве    >    10    тогда
            ТипДома        = СокрЛП(МассивАдрес[10]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    11    тогда
            ТипКорпуса    = СокрЛП(МассивАдрес[11]);
        КонецЕсли;
        Если ЭлементовВМассиве    >    12    тогда
            ТипКвартиры = СокрЛП(МассивАдрес[12]);
  20. TopicStarter Overlay
    alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    При таком коде отваливается с ошибкой
    Тип "Массив" не может использоваться в данных формы

Поделиться этой страницей