Имя: Пароль:
1C
1С v8
Конвертация данных. Алгоритмы.
,
0 Хорт
 
03.09.14
17:46
Создаю правило. Использую алгоритм. В алгоритме используется переменная Источник. На нее ругается при обмене, мол так и так, НЕ бывает такой. Подскажите, что не так.

КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Тип");
КоллекцияОбъектов.Колонки.Добавить("Вид");
КоллекцияОбъектов.Колонки.Добавить("Представление");
КоллекцияОбъектов.Колонки.Добавить("ЗначенияПолей");
КоллекцияОбъектов.Колонки.Добавить("Страна");
КоллекцияОбъектов.Колонки.Добавить("Регион");
КоллекцияОбъектов.Колонки.Добавить("Город");
КоллекцияОбъектов.Колонки.Добавить("АдресЭП");
КоллекцияОбъектов.Колонки.Добавить("ДоменноеИмяСервера");
КоллекцияОбъектов.Колонки.Добавить("НомерТелефона");
КоллекцияОбъектов.Колонки.Добавить("НомерТелефонаБезКодов");

Запрос = Новый Запрос("
|ВЫБРАТЬ
|    КонтактнаяИнформация.Тип КАК Тип,
|    КонтактнаяИнформация.Вид КАК Вид,
|    КонтактнаяИнформация.Представление КАК Представление,
|    КонтактнаяИнформация.Поле1 КАК Поле1,
|    КонтактнаяИнформация.Поле2 КАК Поле2,
|    КонтактнаяИнформация.Поле3 КАК Поле3,
|    КонтактнаяИнформация.Поле4 КАК Поле4,
|    КонтактнаяИнформация.Поле5 КАК Поле5,
|    КонтактнаяИнформация.Поле6 КАК Поле6,
|    КонтактнаяИнформация.Поле7 КАК Поле7,
|    КонтактнаяИнформация.Поле8 КАК Поле8,
|    КонтактнаяИнформация.Поле9 КАК Поле9,
|    КонтактнаяИнформация.ТипДома КАК ТипДома,
|    КонтактнаяИнформация.ТипКорпуса КАК ТипКорпуса,
|    КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры
|ИЗ
|    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
|    КонтактнаяИнформация.Объект = &Контрагент
|");

Запрос.УстановитьПараметр("Контрагент", ?(ТипЗнч(Источник.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица"), ВходящиеДанные.КонтактноеЛицоКонтрагента, Источник.Ссылка));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    НоваяСтрока = КоллекцияОбъектов.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);

    Если Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
        
        Если ЗначениеЗаполнено(Выборка.ТипДома) Тогда
            //ТипДома = НРег(Выборка.ТипДома.Метаданные().ЗначенияПеречисления[Перечисления.ТипыДомов.Индекс(Выборка.ТипДома)].Имя);
            ТипДома = Выборка.ТипДома;
        Иначе
            ТипДома = Выборка.ТипДома;
        КонецЕсли;
        
        Если ЗначениеЗаполнено(Выборка.ТипКорпуса) Тогда
            //ТипКорпуса = НРег(Выборка.ТипКорпуса.Метаданные().ЗначенияПеречисления[Перечисления.ТипыКорпусов.Индекс(Выборка.ТипКорпуса)].Имя);
            ТипКорпуса = Выборка.ТипКорпуса;

        Иначе
            ТипКорпуса = Выборка.ТипКорпуса;
        КонецЕсли;
        
        Если ЗначениеЗаполнено(Выборка.ТипКвартиры) Тогда
            //ТипКвартиры = ?(Выборка.ТипКвартиры = Перечисления.ТипыКвартир.Квартира,
            //    "кв.", НРег(Выборка.ТипКвартиры.Метаданные().ЗначенияПеречисления[Перечисления.ТипыКвартир.Индекс(Выборка.ТипКвартиры)].Имя));
            ТипКвартиры = Выборка.ТипКвартиры;
        Иначе
            ТипКвартиры = Выборка.ТипКвартиры;
        КонецЕсли;                
        
        НоваяСтрока.ЗначенияПолей = ?(ЗначениеЗаполнено(Выборка.Поле1), "Индекс=" + Выборка.Поле1 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле2), "Регион="            + Выборка.Поле2 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле3), "Район="            + Выборка.Поле3 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле4), "Город="            + Выборка.Поле4 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле5), "НаселенныйПункт="    + Выборка.Поле5 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле6), "Улица="            + Выборка.Поле6 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле7), "Дом="                + Выборка.Поле7 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле8), "Корпус="            + Выборка.Поле8 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле9), "Квартира="        + Выборка.Поле9 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(ТипДома),         "ТипДома="            + ТипДома        + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(ТипКорпуса),     "ТипКорпуса="        + ТипКорпуса    + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(ТипКвартиры),     "ТипКвартиры="        + ТипКвартиры, "");
          
    ИначеЕсли Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
        
        НоваяСтрока.ЗначенияПолей = ?(ЗначениеЗаполнено(Выборка.Поле1), "КодСтраны="     + Выборка.Поле1 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле2), "КодГорода="     + Выборка.Поле2 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле3), "НомерТелефона=" + Выборка.Поле3 + Символы.ПС, "")
           + ?(ЗначениеЗаполнено(Выборка.Поле4), "Добавочный="    + Выборка.Поле4, "");

        НоваяСтрока.НомерТелефонаБезКодов = Выборка.Поле3;
        НоваяСтрока.НомерТелефона         = Выборка.Поле1 + Выборка.Поле2 + Выборка.Поле3;
        
    ИначеЕсли Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
        НоваяСтрока.АдресЭП = Выборка.Представление;
    КонецЕсли;
    
КонецЦикла;
1 Хорт
 
03.09.14
17:47
Это взято из стандартных правил УТ-БП
2 Хорт
 
03.09.14
17:49
Источник вообще везде по идее должно работать...
3 salvator
 
03.09.14
17:54
(2) Кто тебе сказал? Передавай источник в параметры алгоритма.
4 Хорт
 
03.09.14
17:57
В поле Параметры на форме Алгоритмы - там я вписал Источник
5 Зойч
 
03.09.14
17:57
где испоьлзуешь алгоритм?
Должен вызываться в группе ПКС
6 Хорт
 
03.09.14
17:57
(3) ну где-то начитал, гуглю весь день уже этот ерундовый вопрос :(((((
7 Хорт
 
03.09.14
17:59
(5) при перегрузке контактных данных организации, в ПКГС
8 Хорт
 
03.09.14
18:13
(3) Передать? Может я чего не доделал , вызываю алгоритм так :

Если Источник.ЭтоГруппа Тогда
    Отказ = Истина;
Иначе
    Выполнить(Алгоритмы.ПереносКонтактнойИнформации);
Конецесли;
9 Хорт
 
03.09.14
18:30
все ушли домой :( буду один тут сидеть
10 Зойч
 
03.09.14
18:32
какая ошибка точно?
11 Зойч
 
03.09.14
18:33
Точно на источник ругается, а не на входящие данные?
12 Зойч
 
03.09.14
18:33
Запрос.УстановитьПараметр("Контрагент", ?(ТипЗнч(Источник.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица"), ВходящиеДанные.КонтактноеЛицоКонтрагента, Источник.Ссылка));
13 Хорт
 
04.09.14
09:12
(11) на параметр Источник, при отладке , алгоритм тоже некорректным становится
14 Хорт
 
04.09.14
09:12
(12) это что-то совсем не то по-моему
15 13_Mult
 
04.09.14
09:17
(2) Не везде
Все зависит от того где вызывать этот алгоритм
16 13_Mult
 
04.09.14
09:19
(7) В каком обработчике?
17 13_Mult
 
04.09.14
09:20
Может быть не Источник а Объект? ))
18 Steini
 
04.09.14
09:48
Короче, пилю свою историю, может поможет. Для обмена по самописным правилам есть два способа: 1) подкинуть свои правила в типовой обмен, 2) использовать обработку УниверсальныйОбменВФорматеХМЛ или же использовать свою обработку, вызывающюю ту и подкидывающую ей самописные правила. Так вот. Конфа "Конвертация данных", как я понимаю, написана под актуальную версию обработки УниверсальныйОбменВФорматеХМЛ. А при обмене через типовой обмен используется не она, а вот на 99,999% такой же код, но с маааалюсеньким различием. Но это мааалюсенькое различие способно такооого натворить.

В общем, мое мнение: надо запускать в режиме отладки и смотреть именно в том конкретном месте доступны ли те или иные переменный. Ведь всякие "Объект", "Источник" - это просто локальные переменные обработки загрузки и ничего более. Весь код твоих правил выполняется в "Выполнить()" обработки загрузки.
19 Хорт
 
04.09.14
10:30
Я пытаюсь воспользоваться отладкой, получаю :

{ВнешняяОбработка.ОтладкаПравил.МодульОбъекта(164,51)}: Переменная не определена (Источник)
    Запрос.УстановитьПараметр("Контрагент", ?(ТипЗнч(<<?>>Источник.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица"), ВходящиеДанные.КонтактноеЛицоКонтрагента, Источник.Ссылка)); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.ОтладкаПравил.МодульОбъекта(164,152)}: Переменная не определена (Источник)
    Запрос.УстановитьПараметр("Контрагент", ?(ТипЗнч(Источник.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица"), ВходящиеДанные.КонтактноеЛицоКонтрагента, <<?>>Источник.Ссылка)); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.ОтладкаПравил.МодульОбъекта(164,110)}: Переменная не определена (ВходящиеДанные)
    Запрос.УстановитьПараметр("Контрагент", ?(ТипЗнч(Источник.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица"), <<?>>ВходящиеДанные.КонтактноеЛицоКонтрагента, Источник.Ссылка)); (Проверка: Толстый клиент (обычное приложение))
20 Хорт
 
04.09.14
10:32
(18) алгоритм преобразуется в такую процедуру :

////////////////////////////////////////////////////////////////////////////////
// АЛГОРИТМЫ

Процедура Алгоритм_ПереносКонтактнойИнформации()

    КоллекцияОбъектов = Новый ТаблицаЗначений;
    КоллекцияОбъектов.Колонки.Добавить("Тип");
    КоллекцияОбъектов.Колонки.Добавить("Вид");
    КоллекцияОбъектов.Колонки.Добавить("Представление");
    КоллекцияОбъектов.Колонки.Добавить("ЗначенияПолей");
    КоллекцияОбъектов.Колонки.Добавить("Страна");
    КоллекцияОбъектов.Колонки.Добавить("Регион");
    КоллекцияОбъектов.Колонки.Добавить("Город");
    КоллекцияОбъектов.Колонки.Добавить("АдресЭП");
    КоллекцияОбъектов.Колонки.Добавить("ДоменноеИмяСервера");
    КоллекцияОбъектов.Колонки.Добавить("НомерТелефона");
    КоллекцияОбъектов.Колонки.Добавить("НомерТелефонаБезКодов");
    
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    КонтактнаяИнформация.Тип КАК Тип,
    |    КонтактнаяИнформация.Вид КАК Вид,
    |    КонтактнаяИнформация.Представление КАК Представление,
    |    КонтактнаяИнформация.Поле1 КАК Поле1,
    |    КонтактнаяИнформация.Поле2 КАК Поле2,
    |    КонтактнаяИнформация.Поле3 КАК Поле3,
    |    КонтактнаяИнформация.Поле4 КАК Поле4,
    |    КонтактнаяИнформация.Поле5 КАК Поле5,
    |    КонтактнаяИнформация.Поле6 КАК Поле6,
    |    КонтактнаяИнформация.Поле7 КАК Поле7,
    |    КонтактнаяИнформация.Поле8 КАК Поле8,
    |    КонтактнаяИнформация.Поле9 КАК Поле9,
    |    КонтактнаяИнформация.ТипДома КАК ТипДома,
    |    КонтактнаяИнформация.ТипКорпуса КАК ТипКорпуса,
    |    КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры
    |ИЗ
    |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |    КонтактнаяИнформация.Объект = &Контрагент
    |");
    
    Запрос.УстановитьПараметр("Контрагент", ?(ТипЗнч(Источник.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица"), ВходящиеДанные.КонтактноеЛицоКонтрагента, Источник.Ссылка));
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = КоллекцияОбъектов.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
    
        Если Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
            
            Если ЗначениеЗаполнено(Выборка.ТипДома) Тогда
                //ТипДома = НРег(Выборка.ТипДома.Метаданные().ЗначенияПеречисления[Перечисления.ТипыДомов.Индекс(Выборка.ТипДома)].Имя);
                ТипДома = Выборка.ТипДома;
            Иначе
                ТипДома = Выборка.ТипДома;
            КонецЕсли;
            
            Если ЗначениеЗаполнено(Выборка.ТипКорпуса) Тогда
                //ТипКорпуса = НРег(Выборка.ТипКорпуса.Метаданные().ЗначенияПеречисления[Перечисления.ТипыКорпусов.Индекс(Выборка.ТипКорпуса)].Имя);
                ТипКорпуса = Выборка.ТипКорпуса;
    
            Иначе
                ТипКорпуса = Выборка.ТипКорпуса;
            КонецЕсли;
            
            Если ЗначениеЗаполнено(Выборка.ТипКвартиры) Тогда
                //ТипКвартиры = ?(Выборка.ТипКвартиры = Перечисления.ТипыКвартир.Квартира,
                //    "кв.", НРег(Выборка.ТипКвартиры.Метаданные().ЗначенияПеречисления[Перечисления.ТипыКвартир.Индекс(Выборка.ТипКвартиры)].Имя));
                ТипКвартиры = Выборка.ТипКвартиры;
            Иначе
                ТипКвартиры = Выборка.ТипКвартиры;
            КонецЕсли;                
            
            НоваяСтрока.ЗначенияПолей = ?(ЗначениеЗаполнено(Выборка.Поле1), "Индекс=" + Выборка.Поле1 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле2), "Регион="            + Выборка.Поле2 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле3), "Район="            + Выборка.Поле3 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле4), "Город="            + Выборка.Поле4 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле5), "НаселенныйПункт="    + Выборка.Поле5 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле6), "Улица="            + Выборка.Поле6 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле7), "Дом="                + Выборка.Поле7 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле8), "Корпус="            + Выборка.Поле8 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле9), "Квартира="        + Выборка.Поле9 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(ТипДома),         "ТипДома="            + ТипДома        + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(ТипКорпуса),     "ТипКорпуса="        + ТипКорпуса    + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(ТипКвартиры),     "ТипКвартиры="        + ТипКвартиры, "");
              
        ИначеЕсли Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
            
            НоваяСтрока.ЗначенияПолей = ?(ЗначениеЗаполнено(Выборка.Поле1), "КодСтраны="     + Выборка.Поле1 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле2), "КодГорода="     + Выборка.Поле2 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле3), "НомерТелефона=" + Выборка.Поле3 + Символы.ПС, "")
               + ?(ЗначениеЗаполнено(Выборка.Поле4), "Добавочный="    + Выборка.Поле4, "");
    
            НоваяСтрока.НомерТелефонаБезКодов = Выборка.Поле3;
            НоваяСтрока.НомерТелефона         = Выборка.Поле1 + Выборка.Поле2 + Выборка.Поле3;
            
        ИначеЕсли Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
            НоваяСтрока.АдресЭП = Выборка.Представление;
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры
21 Хорт
 
04.09.14
10:33
Не вижу вот я параметров, которые передаются Алгоритму :(
22 GenAcid
 
04.09.14
11:14
А про ограничения при режимах отладки алгоритмов читал?

Режим “Вызывать алгоритмы как процедуры” рекомендуется использовать в тех случаях, когда необходимо проводить отладку кода алгоритмов. Алгоритмы выгружаются как отдельные процедуры, а их вызовы вставляются в код обработчиков или других алгоритмов. Для передачи параметров в алгоритмы используется глобальная переменная “Параметры”. Этот способ является рекомендуемым. Однако если разработчик использует какой-либо другой способ передачи параметров (например, используются локальные переменные обработчика), то при попытке запуска выгрузки или загрузки в режиме отладки обработчиков программа выдаст ошибку создания внешней обработки. Для отладки таких алгоритмов существует третий режим.

В режиме “Подставлять код алгоритмов по месту вызова” текст алгоритмов подставляется прямо в текст вызывающих их обработчиков или других алгоритмов с учетом вложенности вызовов. В этом режиме сняты ограничения на использование локальных переменных, однако есть ограничение на отладку рекурсивных алгоритмов. В момент формирования модуля отладки при обнаружении рекурсивных вызовов алгоритмов программа сообщит об ошибке.
23 Steini
 
04.09.14
13:29
Нет, коллеги, я, когда у меня возникали ошибки при обмене через ХМЛ, и было совершенно неясно, что за ошибки, куда копать, брал конфигуратор, ставил "останавливать отладку при ошибке", запускал обмен (типовой), и далее уже смотрел конкретное место в коде, где был вызван этот алгоритм. Если надо - пользовался стеком вызовов. Вот, допустим, нашел процедуру, где исполняется этот алгоритм посредством "Выполнить()", посмотрел, а в какой момент это вообще происходит - при загрузке или после, свойства или конвертации. Тут же в отладчике можно посмотреть, а чему равны всякие локальные переменные, типа Источник или Объект, или структура параметров. Тут же сам текст алгоритма проверил, мало ли. Вся информация будет как на ладони.
24 Зойч
 
04.09.14
13:32
как отладку включал? используй подстановку по метсу вызова
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший