8.х [РЕШЕНО] Объединение данных из двух Структур в одну

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

  1. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Уважаемые эксперты, help!
    8.3.9.2033, КА-2.2.2.199
    Есть две Структуры:
    стр("1","2",...) и стр2("11","12",...)
    все поля уникальные, повторов нет.
    Как добавить в стр данные из стр2?
    Пробовал использовать
    Код:
    ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(стр,стр2);
    ЗаполнитьЗначенияСвойств(стр, стр2);
    
    - ничего не дает.
    А как надо?
    Последнее редактирование: 28 фев 2017
  2. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    164
    Баллы:
    104
    Код:
       
    Структура1 = Новый Структура("а, б, в", 1, 2, 3);
    Структура2 = Новый Структура("в, г", 4, 5);
    
    Для Каждого Элт Из Структура2 Цикл
          
        Если Не Структура1.Свойство(Элт.Ключ) Тогда
            Структура1.Вставить(Элт.Ключ, Элт.Значение);
        КонецЕсли;
          
    КонецЦикла;
    
    // результат: Структура1 = ("а, б, в, г", 1, 2, 3, 5);
    
    nickvv нравится это.
  3. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Что-то не добавилось ничего :(
  4. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    164
    Баллы:
    104
    Значит добавлять нечего.
    nickvv нравится это.
  5. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Вот вся функция:
    Код:
    &НаСервере
    Функция ПолучитьДанные(Договор)
    Запрос = Новый Запрос("ВЫБРАТЬ
                           |    КонтактныеЛицаПартнеров.Наименование КАК КонтактФИО,
                           |    КонтактныеЛицаПартнеров.ДолжностьПоВизитке КАК ДолжностьКонтактногоЛица,
                           |    Контрагенты.КонтактнаяИнформация.(
                           |        Представление,
                           |        Тип,
                           |        Вид,
                           |        АдресЭП КАК ЭППартнера,
                           |        НомерТелефона КАК ТелефонПартнера
                           |    ),
                           |    КонтактныеЛицаПартнеров.Владелец КАК КонтактВладелец,
                           |    ДоговорыКонтрагентов.Дата КАК ДатаДоговора,
                           |    ДоговорыКонтрагентов.Номер КАК НомерДоговора,
                           |    БанковскиеСчетаКонтрагентов.НомерСчета КАК РСчетПартнера,
                           |    ДоговорыКонтрагентов.Контрагент.НаименованиеПолное КАК НаименованиеПартнера,
                           |    ДоговорыКонтрагентов.ОснованиеПолномочий КАК Основание,
                           |    КлассификаторБанковРФ.Наименование КАК БанкПартнера,
                           |    КлассификаторБанковРФ.КоррСчет КАК КСБанкаПартнера,
                           |    КлассификаторБанковРФ.Код КАК БИКБанкаПартнера,
                           |    Контрагенты.ИНН КАК ИННПартнера,
                           |    Контрагенты.КПП КАК КПППартнера,
                           |    Контрагенты.ОКВЭД КАК ОКВЭДПартнера,
                           |    Контрагенты.ОГРН КАК ОГРНПартнера
                           |ИЗ
                           |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
                           |        ПО ДоговорыКонтрагентов.КонтактноеЛицо = КонтактныеЛицаПартнеров.Ссылка
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
                           |        ПО ДоговорыКонтрагентов.Контрагент = Контрагенты.Ссылка
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчетаКонтрагентов
                           |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ
                           |            ПО БанковскиеСчетаКонтрагентов.Банк = КлассификаторБанковРФ.Ссылка
                           |        ПО ДоговорыКонтрагентов.БанковскийСчетКонтрагента = БанковскиеСчетаКонтрагентов.Ссылка
                           |ГДЕ
                           |    ДоговорыКонтрагентов.Ссылка = &Ссылка");
    Запрос.УстановитьПараметр("Ссылка", Договор);
    
    рез = Запрос.Выполнить();
    выб = рез.Выбрать();
    Если выб.Следующий() Тогда
        ВыборкаПоКонтактамПартнера = выб.КонтактнаяИнформация.Выбрать();
        Пока ВыборкаПоКонтактамПартнера.Следующий() Цикл
            Если ВыборкаПоКонтактамПартнера.Вид =  Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
                ЮрАдресПартнера  = ВыборкаПоКонтактамПартнера.Представление;
            ИначеЕсли ВыборкаПоКонтактамПартнера.Вид =  Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента Тогда
                ФактАдресПартнера  = ВыборкаПоКонтактамПартнера.Представление;
            ИначеЕсли ВыборкаПоКонтактамПартнера.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента Тогда
                ТелефонПартнера  = ВыборкаПоКонтактамПартнера.ТелефонПартнера;
            ИначеЕсли ВыборкаПоКонтактамПартнера.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента Тогда
                ЭППартнера = ВыборкаПоКонтактамПартнера.ЭППартнера;
            КонецЕсли;
            контакт = Новый Структура("ЮрАдресПартнера,ФактАдресПартнера,ЭППартнера,ТелефонПартнера");
        КонецЦикла;
        стр = Новый Структура("ИННПартнера,КПППартнера,ОКВЭДПартнера,ОКПОПартнера,КонтактФИО,ДолжностьКонтактногоЛица,ДатаДоговора,НомерДоговора,РСчетПартнера,БИКБанкаПартнера,БанкПартнера,КСБанкаПартнера,НаименованиеПартнера,Основание");
          
      ЗаполнитьЗначенияСвойств(стр, выб);
      ЗаполнитьЗначенияСвойств(контакт, ВыборкаПоКонтактамПартнера);
     
      Для Каждого Элт Из контакт Цикл
          //Если Не стр.Свойство(Элт.Ключ) Тогда
          стр.Вставить(Элт.Ключ, Элт.Значение);
          //КонецЕсли;
      КонецЦикла;
       
      Возврат стр;
    Иначе
      Возврат Неопределено;
    КонецЕсли;
    КонецФункции
    
    В консоли запросов все данные выводятся корректно. Где же ошибка?
  6. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    164
    Баллы:
    104
    1. Переменная "контакт" инициализируется в цикле по КИ, если КИ нет, то и структуры не будет.
    2. Заполнение структуры "контакт" происходит чем? ВыборкойПоКИ, которая ни на что не указывает после того, как в цикле ты по ней пробежался.
    Пора бы научиться пользоваться отладчиком.
    nickvv нравится это.
  7. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    вот итоговый рабочий вариант:
    Код:
    Функция ПолучитьДанные(Договор)
    Запрос = Новый Запрос("ВЫБРАТЬ
                           |    КонтактныеЛицаПартнеров.Наименование КАК КонтактФИО,
                           |    КонтактныеЛицаПартнеров.ДолжностьПоВизитке КАК ДолжностьКонтактногоЛица,
                           |    КонтактныеЛицаПартнеров.Владелец КАК КонтактВладелец,
                           |    ДоговорыКонтрагентов.Дата КАК ДатаДоговора,
                           |    ДоговорыКонтрагентов.Номер КАК НомерДоговора,
                           |    БанковскиеСчетаКонтрагентов.НомерСчета КАК РСчетПартнера,
                           |    ДоговорыКонтрагентов.Контрагент.НаименованиеПолное КАК НаименованиеПартнера,
                           |    ДоговорыКонтрагентов.ОснованиеПолномочий КАК Основание,
                           |    КлассификаторБанковРФ.Наименование КАК БанкПартнера,
                           |    КлассификаторБанковРФ.КоррСчет КАК КСБанкаПартнера,
                           |    КлассификаторБанковРФ.Код КАК БИКБанкаПартнера,
                           |    Контрагенты.ИНН КАК ИННПартнера,
                           |    Контрагенты.КПП КАК КПППартнера,
                           |    Контрагенты.ОКВЭД КАК ОКВЭДПартнера,
                           |    Контрагенты.ОГРН КАК ОГРНПартнера,
                           |    Контрагенты.КодПоОКПО КАК ОКПОПартнера,
                           |    Контрагенты.КонтактнаяИнформация.(
                           |        Тип,
                           |        Вид,
                           |        Представление,
                           |        АдресЭП,
                           |        НомерТелефона
                           |    )
                           |ИЗ
                           |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
                           |        ПО ДоговорыКонтрагентов.КонтактноеЛицо = КонтактныеЛицаПартнеров.Ссылка
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
                           |        ПО ДоговорыКонтрагентов.Контрагент = Контрагенты.Ссылка
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчетаКонтрагентов
                           |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ
                           |            ПО БанковскиеСчетаКонтрагентов.Банк = КлассификаторБанковРФ.Ссылка
                           |        ПО ДоговорыКонтрагентов.БанковскийСчетКонтрагента = БанковскиеСчетаКонтрагентов.Ссылка
                           |ГДЕ
                           |    ДоговорыКонтрагентов.Ссылка = &Ссылка");
    Запрос.УстановитьПараметр("Ссылка", Договор);
    
    рез = Запрос.Выполнить();
    выб = рез.Выбрать();
    Если выб.Следующий() Тогда
        стр = Новый Структура("ОГРНПартнера,ИННПартнера,КПППартнера,ОКВЭДПартнера,ОКПОПартнера,КонтактФИО,ДолжностьКонтактногоЛица,ДатаДоговора,НомерДоговора,РСчетПартнера,БИКБанкаПартнера,БанкПартнера,КСБанкаПартнера,НаименованиеПартнера,Основание");
        ЗаполнитьЗначенияСвойств(стр, выб);
        ВыборкаПоКонтактамПартнера = выб.КонтактнаяИнформация.Выбрать();
        Пока ВыборкаПоКонтактамПартнера.Следующий() Цикл
            Если ВыборкаПоКонтактамПартнера.Вид =  Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
                стр.Вставить("ЮрАдресПартнера", ВыборкаПоКонтактамПартнера.Представление);
            ИначеЕсли ВыборкаПоКонтактамПартнера.Вид =  Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента Тогда
                стр.Вставить("ФактАдресПартнера", ВыборкаПоКонтактамПартнера.Представление);
            ИначеЕсли ВыборкаПоКонтактамПартнера.Вид =  Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента Тогда
                стр.Вставить("ТелефонПартнера", ВыборкаПоКонтактамПартнера.НомерТелефона);
            ИначеЕсли ВыборкаПоКонтактамПартнера.Вид =  Справочники.ВидыКонтактнойИнформации.EmailКонтрагента Тогда
                стр.Вставить("ЭППартнера", ВыборкаПоКонтактамПартнера.АдресЭП);
            КонецЕсли;
        КонецЦикла;
          
      Возврат стр;
    Иначе
      Возврат Неопределено;
    КонецЕсли;
    КонецФункции
    
    Спасибо за советы! Очень помогли