|   |   | 
| 
 | Конвертация данных. Алгоритмы. | ☑ | ||
|---|---|---|---|---|
| 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 | 
        как отладку включал? используй подстановку по метсу вызова     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |