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