Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 сен 2021, 10:21

ЗУП 3.1: дублируется адрес по прописке физлица при программной записи

Автор vovkalenka, 08 фев 2017, 13:04

0 Пользователей и 1 гость просматривают эту тему.

vovkalenka

Всем привет!
Перетаскиваем данные физлиц из другой системы.
Всё получается (ИНН-ны, Снилсы, даты, паспортные данные и т.п.)
Но вот споткнулись на записи адреса по прописке.

Есть запрос, который по ФИО выбирает ссылку на физлицо:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФИО",ФИО);
Запрос.Текст = ("
| Выбрать
| ФЛ.Ссылка //здесь ещё много чего выбирается, неважного для данной темы
| ИЗ
| Справочник.ФизическиеЛица как ФЛ
| Где
| ФЛ.ФИО = &ФИО
|");


Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
//......................




Затем работает код:
ФОбъект = Выборка.Ссылка.ПолучитьОбъект();
КонтактнаяИнформация = ФОбъект.КонтактнаяИнформация.Добавить();
КонтактнаяИнформация.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
КонтактнаяИнформация.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
КонтактнаяИнформация.Представление = Представление; 

ФОбъект.Записать();

При использовании этого метода "Добавить()" получаем... Дубликаты адреса по прописке в карточке Физлица и остальных местах:

Сколько раз запускаем обработку - столько раз и дублируется адрес. Старый адрес не удаляется, ниже добавляется новый. Удалить эти дубликаты нельзя.

Подскажите, пожалуйста, где наша ошибка?

alex0402

Цитата: vovkalenka от 08 фев 2017, 13:04ФОбъект = Выборка.Ссылка.ПолучитьОбъект(); КонтактнаяИнформация = ФОбъект.КонтактнаяИнформация.Добавить();

заменить на
ФОбъект = Выборка.Ссылка.ПолучитьОбъект();
ФОбъект.КонтактнаяИнформация.Очистить();
КонтактнаяИнформация = ФОбъект.КонтактнаяИнформация.Добавить();
Спасибо за Сказать спасибо

vovkalenka

Спасибо большое, ранее созданные дубликаты таким образом очищаются.
А можно ли сделать, чтобы не очищалась остальная контактная информация, которая ранее была внесена вручную - телефоны, электронная почта и т.п.?

alex0402

Ну тогда нужно где-то хранить информацию о загруженных объектах...
1) использовать реквизит, который не используется в других целях (можно создать специально для импорта)
2) Использовать специально созданный объект конфигурации (лучше всего подходит РС).
Спасибо за Сказать спасибо

Kironten

Цитата: alex0402 от 08 фев 2017, 15:51
Ну тогда нужно где-то хранить информацию о загруженных объектах...
1) использовать реквизит, который не используется в других целях (можно создать специально для импорта)
2) Использовать специально созданный объект конфигурации (лучше всего подходит РС).
Чего то я не въезжаю. А просто из табличной части удалить строки с типом значения Перечисление.ТипыКонтактнойИнформации.Адрес - никак? Или я что то упускаю?

alex0402

Цитата: Kironten от 08 фев 2017, 15:57Перечисление.ТипыКонтактнойИнформации.Адрес

ну может и я упускаю. Если вручную такая информация не вводилась, тогда конечно...
Спасибо за Сказать спасибо

vovkalenka

Пытались разными методами, в частности перебрать выборку Контактная информация как массив, удалить все строки с видом "по прописке" (метод Удалить(Индекс)), а потом добавить новую.
Не получилось удаление по индексу строки, после первого же удаления вылетала ошибка "Индекс массива находится за границей". Вероятно, либо удалялся весь массив, либо при удалении происходит смещение индекса.
В итоге сделали так: в отдельный массив собираются все строки, кроме подлежащих удалению, потом исходный массив очищается, потом в него возвращается содержимое временного массива и записывается адрес по прописке:

ФОбъект = Выборка.Ссылка.ПолучитьОбъект();

УжеЕсть = 0;
Если ФОбъект.КонтактнаяИнформация.Количество() > 0 Тогда
Для н = 0 По ФОбъект.КонтактнаяИнформация.Количество()-1 Цикл
Если
Прав(ФОбъект.КонтактнаяИнформация[н].Вид, 8) = "прописке"
Тогда
ФОбъект.КонтактнаяИнформация[н].Представление = Представление;
УжеЕсть = 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Если УжеЕсть = 0 Тогда
КонтактнаяИнформация = ФОбъект.КонтактнаяИнформация.Добавить();
КонтактнаяИнформация.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
КонтактнаяИнформация.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
КонтактнаяИнформация.Представление = Представление; 
КонецЕсли;

alex0402

Цитата: vovkalenka от 09 фев 2017, 09:12либо при удалении происходит смещение индекса.

происходит. удалять лучше с конца;

Кво = тз.Количество();
Пока Кво > 0 Цикл
  Кво = Кво - 1;
  Если Условие Тогда
    тз.Удалить(Кво)
  КонецЕсли;
КонецЦикла;
Спасибо за Сказать спасибо

vovkalenka

Спасибо, классная идея с перебором в обратном порядке.
Цитата: vovkalenka от 09 фев 2017, 09:12
В итоге сделали так: в отдельный массив собираются все строки, кроме подлежащих удалению, потом исходный массив очищается, потом в него возвращается содержимое временного массива и записывается адрес по прописке
Поправлюсь: в итоге остановились на модели, в которой если находится адрес по прописке, он заменяется на новый, иначе добавляется потом. Именно этот код приведён выше. Промежуточный массив решили не использовать, но с ночи уже забылось:)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск