Версия для печати темы (http://pro1c.org.ua/index.php?s=9e46dc950b9aef5cd2b50929df13e5a0&showtopic=43014)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ После обработки регистр сведений оказался только с одной записью

Автор: OksanaYa 28.12.17, 18:01

Доброе время суток! Впервые столкнулась с такой проблемой. Есть обработка, которая загружает заказы из сайта и создает счета по этим заказам. Новых контрагентов обработка создает, а старых находит и если у них нет email, а на сайте он указан, то добавляет. Возникла проблема с email. Был написан такой код.

ЗапросЕМАЙЛ = Новый Запрос;
    ЗапросЕМАЙЛ.Текст =    "ВЫБРАТЬ
    |    КонтактнаяИнформация.Тип,
    |    КонтактнаяИнформация.Вид,
    |    КонтактнаяИнформация.Представление
    |ИЗ
    |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |    КонтактнаяИнформация.Объект = &ТекОбъект
    |    И КонтактнаяИнформация.Вид = &ВидЕмайл";
    
    ЗапросЕМАЙЛ.УстановитьПараметр("ТекОбъект", Контрагент);
    ЗапросЕМАЙЛ.УстановитьПараметр("ВидЕмайл", ВидЕмейл);
    
    Результат = ЗапросЕМАЙЛ.Выполнить().Выгрузить();
    
    Если Результат.Количество() > 0 Тогда
    Иначе
        Если ЗначениеЗаполнено(Емайл) Тогда
            НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
            Запись = НаборЗаписей.Добавить();
            Запись.Активность = Истина;
            Запись.Объект = Контрагент;
            Запись.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
            Запись.Вид = ВидЕмейл;
            Запись.Представление = СокрЛП(ЕМАЙЛ);
            НаборЗаписей.Записать();
        КонецЕсли;
    КонецЕсли;

После отработки регистр сведений Контактная информация оказался только с одной записью - email контрагента из последнего заказа. В чем ошибка? Помогите понять. Если код закомментировать, то все работает нормально, только не проверяется email.

Платформы пробовали разные. На версии 8.3.9.2170 точно очищает регистр. На каком-то релизе 8.3.10 тот же результат. Конфигурация УТП. Релиз конфигурации в данном вопросе не имеет значения.


 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 4,5,9
 

Автор: Eril 29.12.17, 1:53

OksanaYa @ Вчера, 18:01 * ,
Такая ситуация возникает из-за того, что Вы используете набор записей без отбора (воспринимается системой, как полный набор всех записей), наполняете этот набор одной записью (Ваш новый контрагент) и затем записываете набор (НаборЗаписей.Записать(); ) без параметра. А это для системы равнозначно тому, что вы говорите заменить старый (полный) набор записей на новый набор с Вашей одной записью.
Синтаксис команды записать:
РегистрСведенийНаборЗаписей.<Имя регистра сведений> (InformationRegisterRecordSet.<Имя регистра сведений>)
Записать (Write)
Синтаксис:
Записать(<Замещать>)
Параметры:
<Замещать> (необязательный)
Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям
Значение по умолчанию: Истина

Т.е., чтобы записи не уничтожались при записи нужно сделать любое одно из двух (или, в конкретном частном случае, можно и оба сразу, хотя смысла в этом будет не много smile.gif ):
1. После строки:

НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();

нужно добавить строки отбора:
НаборЗаписей.Отбор.Объект.Установить(Контрагент); 
НаборЗаписей.Отбор.Вид.Установить(ВидЕмайл);

Это ограничит перечень заменяемых строк только нашими контрагентом и видом е-мейла, а остальные записи будут жить спокойно.
2. В строке:
НаборЗаписей.Записать();

указать параметр перезаписи "Ложь" (т.к. в этом Вашем конкретном частном случае, этого контрагента в регистре еще нет, и можно его смело дописывать к сужествующим записям, а не обновлять существующего):
НаборЗаписей.Записать(Ложь);

Автор: Vidocq05 03.01.18, 14:16

Как вариант, можно вообще не использовать запрос.

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
http://pro1c.org.ua