Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Администрирование и интеграция
Войти
Регистрация
Восстановить пароль
 
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
1

Обмен данными с группой ВК (самописка, не моя)

21.01.2019, 11:02. Просмотров 362. Ответов 17
Метки нет (Все метки)

Здравствуйте, извиняюсь если пишу не в тот раздел.
С 1С 8.х вообще не работал, писал очень давно конфигурацию на 1С 7.7 и многое позабыл.
Попросили помочь решить проблему.
Сразу скажу, что конфигурацию ту (обработку писал не я).
Есть токен доступа к ВК (скорей всего как приложение)
Есть 3 группы, состав одной группы около 4000 подписчиков, других двух более 10000 подписчиков.
Группу в 4000 нормально обрабатывает, а группы более 10000 выдает ошибку - отсутствует фамилия...
1C
1
2
{ВнешняяОбработка.ЗагрузкаКонтрагентовИзВКонтакте.Форма.Форма.Форма(111)}: Индекс находится за границами массива
                НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
Привожу часть кода внешней обработки, именно куда ссылается на ошибку.
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Процедура РезультатДокументСформирован(Элемент)
    Если Элемент.Документ.location.host = "api.vk.com" Тогда
        ТекстОтвета = Элемент.Документ.body.outerText;
        МассивИД = ПолучитьМассивТекстовМеждуТегами(ТекстОтвета,"user");
        Если МассивИД.Количество()>0 Тогда
            ЧислоЗагрузок = ЧислоЗагрузок+МассивИД.Количество();
            Для Каждого ИД Из МассивИД Цикл
                НовСтрока = Объект.СписокКонтрагентов.Добавить();
                НовСтрока.ID = ПолучитьМассивТекстовМеждуТегами(ИД,"uid")[0];
                НовСтрока.Имя = ПолучитьМассивТекстовМеждуТегами(ИД,"first_name")[0];
                Попытка
                    НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
                Исключение
                КонецПопытки;
                НовСтрока.Ник = ПолучитьМассивТекстовМеждуТегами(ИД,"domain")[0];
                Сообщить(НовСтрока.ID+" "+НовСтрока.Имя+" "+НовСтрока.Фамилия);
            КонецЦикла;
            Смещение=Смещение+1000;
            //ДобавитьПользователейВСправочник();
            ВызватьМетодAPI("groups.getMembers","group_id="+Элементы.ГруппаID.ТекстРедактирования+"&offset="+Строка(Формат(Смещение,"ЧГ="))+"&count=1000&fields=sex,domain");
            
 
        КонецЕсли;
        Сообщить(ЧислоЗагрузок);
 
    КонецЕсли;
КонецПроцедуры
Вникаю, не могу понять пока как выявить у кого нет фамилии в группах, либо это удаленные пользователи с именем DELETED
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2019, 11:02
Ответы с готовыми решениями:

Обмен данными с 1С 8.2
Пишу программу для выгрузки товаров из 1С 8.2 Управление торговлей 11 на сервер MySql. Получаю...

Обмен данными с УТ 10.3
Добрый день. Обмены данными УТ 10,3 - БП 3,0 В БП нет справочника "КонтактныеЛицаКонтрагентов"...

Обмен данными 7.7
Данная обработка обеспечивает перенос документов и справочников между идентичными конфигурациями...

Обмен данными м/у УТ И БП
Здравствуйте, уважаемые форумчане. У меня возникла такая проблема: Всегда делали обмен между УТ...

обмен данными
Разработка и реализация на ассемблере программы обмена данными между ЭВМ через последовательный...

17
Phil
Эксперт 1С
404 / 281 / 86
Регистрация: 28.05.2014
Сообщений: 1,138
21.01.2019, 11:16 2
6byv1,
а как разбор проходит тут?
1C
1
ПолучитьМассивТекстовМеждуТегами
0
Orsanka
20 / 16 / 7
Регистрация: 23.04.2018
Сообщений: 73
21.01.2019, 11:41 3
6byv1,

Вот сюда добавь запись в ЖР:
1C
1
2
3
4
5
Попытка
        НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
Исключение
        ЗаписьЖурналаРегистрации("ОшибкаЗагрузкиИзГруппыВК",,,,"Нет фамилии у пользователя ID:" + НовСтрока.ID);
КонецПопытки;
В журнале регистрации после этого будут записи с событием "ОшибкаЗагрузкиИзГруппыВК". В которой будет указан ID.

Но дополнительно нужно как-то обрабатывать эту ситуацию штатно.
Что делать, если в выгрузке нет фамилии? Может загружать без фамилии, или добавлять какой-то признак?
Или фамилия это обязательное поле и вы пытаетесь понять, как такие пользователи без фамилии получились?
0
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
21.01.2019, 12:31  [ТС] 4
Цитата Сообщение от Orsanka Посмотреть сообщение
Может загружать без фамилии, или добавлять какой-то признак?
По сути фамилия обязательна, но можно вместо нее сделать ID, чтобы уже самому посмотреть какой пользователь не загрузился и изменить на настоящую фамилию, может даже в будущем не обрабатывать уже добавленного пользователя в справочник контрагентов. Я пока не понимаю по какому принципу работает та внешняя обработка, либо она сканирует всю группу и потом добавляет в справочник кого нет, либо она сразу целиком добавляет (без дублей)

Добавлено через 15 минут
Нашел причину, в группе состоят пользователи с именем DELETED, у которых нет фамилии. Каким способом/оператором можно "пропускать" если "first_name"=DELETED, либо принудительно присвоить ему last_name = DELETED
0
Phil
Эксперт 1С
404 / 281 / 86
Регистрация: 28.05.2014
Сообщений: 1,138
21.01.2019, 13:54 5
6byv1,
1C
1
2
3
Если "first_name"=DELETED Тогда
 Продолжить;
 КонецЕсли;
0
Orsanka
20 / 16 / 7
Регистрация: 23.04.2018
Сообщений: 73
21.01.2019, 14:47 6
Для принудительной записи с фамилией DELETED:

1C
1
2
3
4
5
6
7
8
9
Если НовСтрока.Имя = "DELETED" Тогда
        НовСтрока.Фамилия = "DELETED";
Иначе
        Попытка
                  НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
        Исключение
                  ЗаписьЖурналаРегистрации("ОшибкаЗагрузкиИзГруппыВК",,,,"Нет фамилии у пользователя ID:" + НовСтрока.ID);
        КонецПопытки;
КонецЕсли;
Для пропуска таких строк:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Процедура РезультатДокументСформирован(Элемент)
    Если Элемент.Документ.location.host = "api.vk.com" Тогда
        ТекстОтвета = Элемент.Документ.body.outerText;
        МассивИД = ПолучитьМассивТекстовМеждуТегами(ТекстОтвета,"user");
        Если МассивИД.Количество()>0 Тогда
            ЧислоЗагрузок = ЧислоЗагрузок+МассивИД.Количество();
            Для Каждого ИД Из МассивИД Цикл
                Имя = ПолучитьМассивТекстовМеждуТегами(ИД,"first_name")[0];
                Если Имя = "DELETED" Тогда
                        Продолжить;
                КонецЕсли;
                НовСтрока = Объект.СписокКонтрагентов.Добавить();
                НовСтрока.ID = ПолучитьМассивТекстовМеждуТегами(ИД,"uid")[0];
                НовСтрока.Имя = Имя;
                Попытка
                    НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
                Исключение
                    ЗаписьЖурналаРегистрации("ОшибкаЗагрузкиИзГруппыВК",,,,"Нет фамилии у пользователя ID:" + НовСтрока.ID);
                КонецПопытки;
                НовСтрока.Ник = ПолучитьМассивТекстовМеждуТегами(ИД,"domain")[0];
                Сообщить(НовСтрока.ID+" "+НовСтрока.Имя+" "+НовСтрока.Фамилия);
            КонецЦикла;
            Смещение=Смещение+1000;
            //ДобавитьПользователейВСправочник();
            ВызватьМетодAPI("groups.getMembers","group_id="+Элементы.ГруппаID.ТекстРедактирования+"&offset="+Строка(Формат(Смещение,"ЧГ="))+"&count=1000&fields=sex,domain");
            
 
        КонецЕсли;
        Сообщить(ЧислоЗагрузок);
 
    КонецЕсли;
КонецПроцедуры
0
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
22.01.2019, 16:00  [ТС] 7
Цитата Сообщение от Orsanka Посмотреть сообщение
Для пропуска таких строк:
Не помогает, еще ругается на то что отсутствует значение "ЗаписьЖурналаРегистрации", даже если закомментировать, тоже ругается
0
Orsanka
20 / 16 / 7
Регистрация: 23.04.2018
Сообщений: 73
22.01.2019, 17:07 8
6byv1, Приведите ошибку полностью (текст или скрин) с закомментированной и раскомментированной строкой про журнал регистрации.
0
Phil
Эксперт 1С
404 / 281 / 86
Регистрация: 28.05.2014
Сообщений: 1,138
22.01.2019, 21:58 9
6byv1, там где DELETED что в отладке
1C
1
Имя = ПолучитьМассивТекстовМеждуТегами(ИД,"first_name")[0];
может там пробелы или ещё что?

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Для Каждого ИД Из МассивИД Цикл
                Имя = СокрЛП(ПолучитьМассивТекстовМеждуТегами(ИД,"first_name")[0]);
                Если Имя = "DELETED" Тогда
                        Продолжить;
                КонецЕсли;
                НовСтрока = Объект.СписокКонтрагентов.Добавить();
                НовСтрока.ID = ПолучитьМассивТекстовМеждуТегами(ИД,"uid")[0];
                НовСтрока.Имя = Имя;
                Попытка
                    НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
                Исключение
                    Сообщить("Нет фамилии у пользователя ID:" + НовСтрока.ID);
                КонецПопытки;
                НовСтрока.Ник = ПолучитьМассивТекстовМеждуТегами(ИД,"domain")[0];
                Сообщить(НовСтрока.ID+" "+НовСтрока.Имя+" "+НовСтрока.Фамилия);
            КонецЦикла;
0
Dethmontt
Модератор
Эксперт 1С
2655 / 2444 / 419
Регистрация: 10.03.2011
Сообщений: 8,746
Записей в блоге: 1
Завершенные тесты: 1
23.01.2019, 01:41 10
Цитата Сообщение от Orsanka Посмотреть сообщение
ТекстОтвета = Элемент.Документ.body.outerText;
* * * * МассивИД = ПолучитьМассивТекстовМеждуТегами(ТекстОтвета,"user");
Для кого ФИРМА 1С придумывала построительDOM, документHTML ???
нет, давайте напишем кривую функцию ПолучитьМассивТекстовМеждуТегами() и будем ее пытать до посинения......

Добавлено через 2 минуты
функцию ПолучитьМассивТекстовМеждуТегами() надо исправлять, а не попытками обвешивать... Она всегда должна возвращать инициализированный массив с одним элементом!!!
0
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
23.01.2019, 12:10  [ТС] 11
Цитата Сообщение от Orsanka Посмотреть сообщение
Приведите ошибку полностью
Это надеюсь поможет, а в самой 1С "Индекс находится за границами массива"
0
Миниатюры
Обмен данными с группой ВК (самописка, не моя)   Обмен данными с группой ВК (самописка, не моя)  
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
23.01.2019, 12:17  [ТС] 12
Цитата Сообщение от Phil Посмотреть сообщение
может там пробелы или ещё что?
В json идет без пробелов
Javascript
1
{"uid":944726,"first_name":"DELETED","last_name":"","deactivated":"deleted","sex":1}
0
Phil
Эксперт 1С
404 / 281 / 86
Регистрация: 28.05.2014
Сообщений: 1,138
23.01.2019, 12:36 13
6byv1, тут проблема вся в ПолучитьМассивТекстовМеждуТегами, что в отладке
когда переходите сюда?
1C
1
НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0]
она по умолчанию должна возвращать 1 элемент, чтобы не обращаться по индексу

Добавлено через 26 секунд
А лучше структуру
0
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
23.01.2019, 13:18  [ТС] 14
Не получается по-шагово посмотреть ошибки. Вроде ставлю точку останова, но ... все равно не останавливается и вылетает ошибка. Что в начале делать точку останова, что прямо у фамилии. Говорю же давно не программировал на 1С, и то тогда была 1С 7.7

Добавлено через 4 минуты
Единственное что могу дать, удаленный доступ чтобы посмотреть наглядно (но не сам rdp - потому что работа вся в нем производится)
0
Phil
Эксперт 1С
404 / 281 / 86
Регистрация: 28.05.2014
Сообщений: 1,138
23.01.2019, 13:40 15
Конфигуратор -> Отладка/Остановка по ошибке - Поставить в форме галку у "Останавливаться по ошибке"
Запустить отладку, запустить обработку.
На ошибке платформа сама должна остановиться, а там уже дальше отладчиком посмотреть, что пошло не так и проблемный "ИД".
0
6byv1
0 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 39
23.01.2019, 15:49  [ТС] 16
Ну вот у меня как без "Остановки на ошибке", что с ней, ошибка одна и та же
1C
1
2
{ВнешняяОбработка.ЗагрузкаКонтрагентовИзВКонтакте.Форма.Форма.Форма(111)}: Индекс находится за границами массива
                НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
0
Orsanka
20 / 16 / 7
Регистрация: 23.04.2018
Сообщений: 73
23.01.2019, 16:05 17
6byv1, вы точно в пользовательском режиме запускаете новую, измененную обработку?
Попробуйте как Phil написал - вместо запись журнала регистрации - сообщение пользователю. и добавить еще одно сообщение перед загрузкой:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Процедура РезультатДокументСформирован(Элемент)
    Если Элемент.Документ.location.host = "api.vk.com" Тогда
        ТекстОтвета = Элемент.Документ.body.outerText;
        МассивИД = ПолучитьМассивТекстовМеждуТегами(ТекстОтвета,"user");
        Если МассивИД.Количество()>0 Тогда
            ЧислоЗагрузок = ЧислоЗагрузок+МассивИД.Количество();
            Сообщить("Начало загрузки из ВК: " + ЧислоЗагрузок  + " элементов");
            Для Каждого ИД Из МассивИД Цикл
                Имя = ПолучитьМассивТекстовМеждуТегами(ИД,"first_name")[0];
                Если Имя = "DELETED" Тогда
                        Продолжить;
                КонецЕсли;
                НовСтрока = Объект.СписокКонтрагентов.Добавить();
                НовСтрока.ID = ПолучитьМассивТекстовМеждуТегами(ИД,"uid")[0];
                НовСтрока.Имя = Имя;
                Попытка
                    НовСтрока.Фамилия = ПолучитьМассивТекстовМеждуТегами(ИД,"last_name")[0];
                Исключение
                    Сообщить("Нет фамилии у пользователя ID:" + НовСтрока.ID);
                КонецПопытки;
                НовСтрока.Ник = ПолучитьМассивТекстовМеждуТегами(ИД,"domain")[0];
                Сообщить(НовСтрока.ID+" "+НовСтрока.Имя+" "+НовСтрока.Фамилия);
            КонецЦикла;
            Смещение=Смещение+1000;
            //ДобавитьПользователейВСправочник();
            ВызватьМетодAPI("groups.getMembers","group_id="+Элементы.ГруппаID.ТекстРедактирования+"&offset="+Строка(Формат(Смещение,"ЧГ="))+"&count=1000&fields=sex,domain");
            
 
        КонецЕсли;
        Сообщить(ЧислоЗагрузок);
 
    КонецЕсли;
КонецПроцедуры
Если сообщения не выводятся, значит, вы запускаете старую, не измененную обработку.
Напишите, куда вы нажимаете в пользовательском режиме для загрузки данных?
0
Phil
Эксперт 1С
404 / 281 / 86
Регистрация: 28.05.2014
Сообщений: 1,138
23.01.2019, 16:40 18
6byv1, причем тут одна и та же, смысл, чтобы отладкой отловить проблемный ИД, так как грузите вы не 2 или 4 записи, а 10000, а проблемную в этом случае запись и встретим через остановку на ошибке.
0
23.01.2019, 16:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2019, 16:40

Обмен данными
Добрый день. Не мог ли бы вы мне рассказать об обмене данными через интернет в дельфи? А именно,...

Обмен данными с 1С
Можно ли организовать обмен с 1-С бухгалтерией и как это сделать?

1С-обмен данными
Здравтсвуйте. Такая ситуация. Нужен обмен между одинаковыми конфигурациями. Причем из одной (общей)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru