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

1C 8.3. Периодически стираются контактные данные контрагента

Автор gulnyr, 02 мая 2023, 16:57

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

gulnyr

antoneus, искал с глобальным поиском, нашел такие варианты:

// Функция возвращает для заданного объекта представление контактной информации
Функция киПолучитьПредставлениеКИ(Объект, ЗначениеКИ, ДобавлятьКомментарий = Ложь) Экспорт

    Представление = "";
   
    НаборЗаписейКИ = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    НаборЗаписейКИ.Отбор.Объект.Значение      = Объект;
    НаборЗаписейКИ.Отбор.Объект.Использование = Истина;
    Если ТипЗнч(ЗначениеКИ) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
        Если ЗначениеКИ = Справочники.ВидыКонтактнойИнформации.ОсновнойТелефон Тогда
            Попытка
                Если ЗначениеЗаполнено(Объект.ОсновнойТелефон) Тогда
                    ОсновнойТелефон = СокрЛП(Строка(Объект.ОсновнойТелефон));
                    Если СтрДлина(ОсновнойТелефон)=12 И Лев(ОсновнойТелефон,2) = "+7" Тогда
                        Возврат ОсновнойТелефон;
                    ИначеЕсли СтрДлина(ОсновнойТелефон)=10 Тогда
                        Возврат "+7"+ ОсновнойТелефон;
                    Иначе
                        Возврат ОсновнойТелефон;
                    КонецЕсли;
                КонецЕсли;
            Исключение
                Возврат "";
            КонецПопытки;
        КонецЕсли;
        НаборЗаписейКИ.Отбор.Вид.Значение      = ЗначениеКИ;
        НаборЗаписейКИ.Отбор.Вид.Использование = Истина;
        НаборЗаписейКИ.Прочитать();
        Если НаборЗаписейКИ.Количество() > 0  Тогда
            Представление = НаборЗаписейКИ[0].Представление;
            Если ДобавлятьКомментарий И Не ПустаяСтрока(НаборЗаписейКИ[0].Комментарий) Тогда
                Если НаборЗаписейКИ[0].Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
                    Представление = Представление + Символы.ПС + "Комментарий: " + НаборЗаписейКИ[0].Комментарий;
                Иначе
                    Представление = Представление + " (" + НаборЗаписейКИ[0].Комментарий + ")";
                КонецЕсли;
            КонецЕсли;   
        КонецЕсли;
       
    ИначеЕсли ТипЗнч(ЗначениеКИ) = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда
        НаборЗаписейКИ.Отбор.Тип.Значение      = ЗначениеКИ;
        НаборЗаписейКИ.Отбор.Тип.Использование = Истина;
        НаборЗаписейКИ.Прочитать();
        Представление = "";
        Для каждого Запись Из НаборЗаписейКИ Цикл
            Если Запись.ЗначениеПоУмолчанию Тогда
                Представление = Запись.Представление;
                Если ДобавлятьКомментарий И Не ПустаяСтрока(Запись.Комментарий) Тогда
                    Если Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
                        Представление = Представление + Символы.ПС + "Комментарий: " + Запись.Комментарий;
                    Иначе
                        Представление = Представление + " (" + Запись.Комментарий + ")";
                    КонецЕсли;
                КонецЕсли;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
   
    Возврат Представление;
   
КонецФункции // киПолучитьПредставлениеКИ()

Второй:

// Функция возвращает для заданного объекта город из контактной информации
Функция киПолучитьГород(Объект, ЗначениеКИ) Экспорт

    НаборЗаписейКИ = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    НаборЗаписейКИ.Отбор.Объект.Значение      = Объект;
    НаборЗаписейКИ.Отбор.Объект.Использование = Истина;
    Если ТипЗнч(ЗначениеКИ) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
        НаборЗаписейКИ.Отбор.Вид.Значение      = ЗначениеКИ;
        НаборЗаписейКИ.Отбор.Вид.Использование = Истина;
        НаборЗаписейКИ.Прочитать();
        Если НаборЗаписейКИ.Количество() > 0  Тогда
            город = НаборЗаписейКИ[0].Поле4;
            Если ЗначениеЗаполнено(город) Тогда
                Если Прав(город,2)=" г" Тогда
                    Возврат "г. " + Лев(город, СтрДлина(город)-2);
                Иначе
                    Возврат город; //поселок, пгт или что-то еще
                КонецЕсли;
            Иначе
                Если Найти(НаборЗаписейКИ[0].Поле2,"Москва") Тогда
                    Возврат "г. Москва";
                ИначеЕсли Найти(НаборЗаписейКИ[0].Поле2,"Санкт-Петербург") Тогда
                    Возврат "г. Санкт-Петербург";
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
   
    Возврат "";
   
КонецФункции // киПолучитьПредставлениеКИ()

Третий:

// Процедура считывает контактную информацию из ИБ в набор записей регистра сведений.
Процедура киПрочитатьКонтактнуюИнформацию(НаборЗаписей, Ссылка) Экспорт

    Если ТипЗнч(НаборЗаписей) <> Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация") Тогда
        НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    Иначе
        НаборЗаписей.Очистить();
    КонецЕсли;
   
    НаборЗаписей.Отбор.Объект.Значение      = Ссылка;
    НаборЗаписей.Отбор.Объект.Использование = Истина;
    НаборЗаписей.Прочитать();
    // сортируем
    киСортироватьНаборЗаписей(НаборЗаписей);

КонецПроцедуры // киПрочитатьКонтактнуюИнформацию()

Четвертый:

// Процедура записывает контактную информацию в ИБ из набора записей регистра сведений.

Процедура киЗаписатьКонтактнуюИнформацию(НаборЗаписей, Ссылка, Отказ, ЧитатьКИ = Истина) Экспорт

    Индекс = 0;
   
    Пока Индекс <= НаборЗаписей.Количество() - 1 Цикл
       
        Запись = НаборЗаписей[Индекс];
       
        Запись.Объект = Ссылка;
       
        Индекс = Индекс + 1;
    КонецЦикла;
   
    НаборЗаписей.Отбор.Объект.Значение = Ссылка;
   
    Попытка
        НаборЗаписей.Записать();
    Исключение
        Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
        Сообщить("Элемент """ + СокрЛП(Ссылка) + """ не записан. Не записана контактная информация.");
        Отказ = Истина;
        Возврат;
    КонецПопытки;
    Если ЧитатьКИ Тогда
        киПрочитатьКонтактнуюИнформацию(НаборЗаписей, Ссылка)
    КонецЕсли;
   
КонецПроцедуры // киЗаписатьКонтактнуюИнформацию()

Пятый:

// Процедура устанавливает в списке регистра сведений
// запись контактной информации определенного типа
Процедура киУстановитьЗаписьОсновнойВСписке(СписокКИ, ТабличноеПоле, Кнопка) Экспорт
   
    Если СписокКИ.Отбор.Объект.Значение <> Неопределено И ТабличноеПоле.ТекущиеДанные <> Неопределено Тогда
        ЗначениеПоУмолчанию = ТабличноеПоле.ТекущиеДанные.ЗначениеПоУмолчанию;
        Если ЗначениеПоУмолчанию Тогда
            Возврат;
        КонецЕсли;
        Кнопка.Пометка = НЕ ЗначениеПоУмолчанию;
        НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Объект.Значение      = СписокКИ.Отбор.Объект.Значение;
        НаборЗаписей.Отбор.Объект.Использование = Истина;
        НаборЗаписей.Прочитать();
   
        ТекущийВид = ТабличноеПоле.ТекущиеДанные.Вид;
        ТекущийТип = ТабличноеПоле.ТекущиеДанные.Тип;
       
        Для каждого ЗаписьНабора Из НаборЗаписей Цикл
            Если ЗаписьНабора.Тип = ТекущийТип Тогда
                ЗаписьНабора.ЗначениеПоУмолчанию = ?(ЗаписьНабора.Вид = ТекущийВид, Истина, Ложь);   
            КонецЕсли;
        КонецЦикла;
       
        Попытка
            НаборЗаписей.Записать();
        Исключение
            Сообщить("Невозможно установить основной вид контактной информации.",СтатусСообщения.Важное);   
        КонецПопытки;
       
    КонецЕсли;   
   
КонецПроцедуры // киУстановитьЗаписьОсновнойВСписке()

Шестой:

Процедура КонтактныеЛицаПриАктивизацииСтроки(Элемент)
Если Элемент.ТекущиеДанные <> Неопределено Тогда
Если КИ_КЛМодифицирована и НЕ обЗначениеНеЗаполнено(НаборКонтактнойИнформацииКЛ.Отбор.Объект.Значение) Тогда
Отказ = Ложь;
киЗаписатьКонтактнуюИнформацию(НаборКонтактнойИнформацииКЛ, НаборКонтактнойИнформацииКЛ.Отбор.Объект.Значение, Отказ, Ложь);
КИ_КЛМодифицирована = Ложь;
КонецЕсли;
киПрочитатьКонтактнуюИнформацию(НаборКонтактнойИнформацииКЛ, Элемент.ТекущаяСтрока.Ведомый);
Иначе
НаборКонтактнойИнформацииКЛ.Очистить();
КонецЕсли;
КонецПроцедуры // КонтактныеЛицаПриАктивизацииСтроки()

Седьмой:

Если ЭтоНовый() Тогда
Если НЕ обЗначениеНеЗаполнено(ПараметрОбъектКопирования) Тогда
киПрочитатьКонтактнуюИнформацию(НаборКонтактнойИнформации, ПараметрОбъектКопирования);
Если НаборКонтактнойИнформации.Количество()>0 Тогда
Если Вопрос("Перенести контактную информацию из контрагента """+ПараметрОбъектКопирования+"""?",РежимДиалогаВопрос.ДаНет)<>КодВозвратаДиалога.Да Тогда
НаборКонтактнойИнформации.Очистить();
//shmi Нужно очистить отбор, иначе при добавлении КИ объектом будет выступать объект копирования
НаборКонтактнойИнформации.Отбор.Объект.Значение = Неопределено;
ОсновнойТелефон="";
КонецЕсли;
Иначе
//shmi Нужно очистить отбор, иначе при добавлении КИ объектом будет выступать объект копирования
НаборКонтактнойИнформации.Отбор.Объект.Значение = Неопределено;
ОсновнойТелефон="";
КонецЕсли;
Иначе
Если ОчищатьКонтактнуюИнформациюПриОткрытии Тогда
киПрочитатьКонтактнуюИнформацию(НаборКонтактнойИнформации, Ссылка);
КонецЕсли;
КонецЕсли;
Иначе
киПрочитатьКонтактнуюИнформацию(НаборКонтактнойИнформации, Ссылка);
КонецЕсли;

Восьмой:

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

Если НЕ Отказ Тогда
киЗаписатьКонтактнуюИнформацию(НаборКонтактнойИнформации, Ссылка, Отказ);
// сохраним активный набор записей контактной информации
Если ЭлементыФормы.КонтактныеЛица.ТекущиеДанные <> Неопределено Тогда
Если КИ_КЛМодифицирована и НЕ обЗначениеНеЗаполнено(НаборКонтактнойИнформацииКЛ.Отбор.Объект.Значение) Тогда
Отказ = Ложь;
киЗаписатьКонтактнуюИнформацию(НаборКонтактнойИнформацииКЛ, НаборКонтактнойИнформацииКЛ.Отбор.Объект.Значение, Отказ, Ложь);
КИ_КЛМодифицирована = Ложь;
КонецЕсли;
киПрочитатьКонтактнуюИнформацию(НаборКонтактнойИнформацииКЛ, ЭлементыФормы.КонтактныеЛица.ТекущаяСтрока.Ведомый);
Иначе
НаборКонтактнойИнформацииКЛ.Очистить();
КонецЕсли;
КонецЕсли;

// запищем ведомого контрагента
Если ДополнительныеСвойства.Свойство("ВедущиеКЛ") Тогда
Для Каждого Строка Из ДополнительныеСвойства.ВедущиеКЛ Цикл
Строка.Ведомый   = Ссылка;
Строка.Должность = ?(Должность.Пустая(), Справочники.Должности.Неопределена, Должность);

Если НЕ РаботаСКонтактнымиЛицами.ЗаписьВозможна(Строка.Ведомый, Строка.Ведущий) Тогда
Отказ = Истина;
Сообщить(НСтр("ru = 'При проверке контактных лиц обнаружены циклические ссылки. Запись отменена.'"));
КонецЕсли;
КонецЦикла;

Если НЕ Отказ И РаботаСКонтактнымиЛицами.ЗаписатьВедущих(Ссылка, ДополнительныеСвойства.ВедущиеКЛ) Тогда
Оповестить("ОбновитьКЛ");
КонецЕсли;
КонецЕсли;

Для Каждого Строка Из КонтактныеЛица Цикл

Строка.Ведущий = Ссылка;
Строка.Использование = Истина;

Если НЕ РаботаСКонтактнымиЛицами.ЗаписьВозможна(Строка.Ведомый, Строка.Ведущий) Тогда
Отказ = Истина;
Сообщить(НСтр("ru = 'При проверке контактных лиц обнаружены циклические ссылки. Запись отменена.'"));
КонецЕсли;

КонецЦикла;

Если НЕ Отказ Тогда
РаботаСКонтактнымиЛицами.ЗаписатьВедомых(Ссылка, КонтактныеЛица);
КонецЕсли;

Если НЕ Отказ Тогда
// произведем изменения автомобилей
// сначала запишем изменения в авто.
Для Каждого стрАвто Из СведенияАвтомобили Цикл
Если стрАвто.ПризнакИзменения Тогда
Если НЕ СохранитьАвтомобиль(стрАвто) Тогда
Отказ=Истина;
КонецЕсли;
ИначеЕсли стрАвто.ПризнакУдаления Тогда
КлючЗаписи = РегистрыСведений.Автомобили.СоздатьМенеджерЗаписи();
КлючЗаписи.Автомобиль = стрАвто.Автомобиль;
КлючЗаписи.Период     = стрАвто.Период;
КлючЗаписи.Значение   = Ссылка;
КлючЗаписи.ВидЗначения = Перечисления.ДополнительнаяИнформацияАвтомобилей.Хозяин;

КлючЗаписи.Прочитать();

Если КлючЗаписи.Выбран() Тогда
КлючЗаписи.Удалить();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры // ПриЗаписи()

Девятый:

Процедура ПослеЗаписи()

Если НЕ спЭлементПослеЗаписи(ЭтаФорма) Тогда Возврат; КонецЕсли;

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

//Запишем контактную информацию
НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Значение      = Ссылка;
НаборЗаписей.Отбор.Объект.Использование = Истина;
//запишем телефоны
Если СокрЛП(Номер1) <> "" Тогда
// создадим запись в наборе регистра сведений
Запись = НаборЗаписей.Добавить();
Запись.Объект = Ссылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
Запись.Вид = ВидТелефон1;
Запись.ЗначениеПоУмолчанию = Истина;
Запись.Поле1 = КодСтраны1;
Запись.Поле2 = КодГорода1;
Запись.Поле3 = Номер1;
Запись.Поле4 = Внутренний1;
Запись.Представление = ПредставлениеТелефон1;
КонецЕсли;
Если СокрЛП(Номер2) <> "" Тогда
// создадим запись в наборе регистра сведений
Запись = НаборЗаписей.Добавить();
Запись.Объект = Ссылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
Запись.Вид = ВидТелефон2;
Если СокрЛП(Номер1) = "" Тогда
Запись.ЗначениеПоУмолчанию = Истина;
КонецЕсли;
Запись.Поле1 = КодСтраны2;
Запись.Поле2 = КодГорода2;
Запись.Поле3 = Номер2;
Запись.Поле4 = Внутренний2;
Запись.Представление = ПредставлениеТелефон2;
КонецЕсли;

Если ДополнительныйТелефон <> ОсновнойТелефон И ДополнительныйТелефон <> "" Тогда
Если Вопрос("Номер телефона звонка отличается от основного телефона контрагента. Записать номер звонка как дополнительный номер?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
Запись = НаборЗаписей.Добавить();
Запись.Объект = Ссылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
Запись.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонДомашний;
Запись.ЗначениеПоУмолчанию = Ложь;
Запись.Поле1 = "";
Запись.Поле2 = "";
Запись.Поле3 = "";
Запись.Поле4 = "";
Запись.Представление = ДополнительныйТелефон;
КонецЕсли;
КонецЕсли;

// Создадим запишем/Найдем вернем бонусную карту
НоваяКарта = КартаОбъекта(ЭтотОбъект.Ссылка);

// Если поле КолВоБонусов > 0 Тогда
Если КолВоБонусов > 0 Тогда
Запрос = Новый Запрос;                           
Запрос.Текст = "ВЫБРАТЬ
               | КорректировкаБонусов.Ссылка
               |ИЗ
               | Документ.КорректировкаБонусов КАК КорректировкаБонусов
               |ГДЕ
               | КорректировкаБонусов.Номер = &Номер";
Запрос.УстановитьПараметр("Номер", "АКЦИЯ00105");
Доки = Запрос.Выполнить().Выгрузить();
ДокАкции = Доки.Получить(Доки.Количество()-1).Ссылка.ПолучитьОбъект();
НачБонСтр = ДокАкции.БонусыКНачислению.Добавить();
НачБонСтр.Карточка = НоваяКарта.Ссылка;
НачБонСтр.ДатаСписания = Дата("20211001");
НачБонСтр.Количество = 3000;
ДокАкции.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЕсли;

// Запишем АВТОМОБИЛЬ
НачалоТекущегоДня = НачалоДня(ТекущаяДата());
Если ЗначениеЗаполнено(Автомобиль) Тогда
Справочники.Автомобили.ЗаписьЗначенияРегистраСведения(Автомобиль.Ссылка, ЭтотОбъект.Ссылка,Перечисления.ДополнительнаяИнформацияАвтомобилей.Хозяин, НачалоТекущегоДня);
Иначе
Автом = Справочники.Автомобили.СоздатьЭлемент();
Автом.УстановитьНовыйКод("LX");
Автом.Наименование = АвтоНаименование;
Автом.НаименованиеПолное = АвтоНаименованиеПолное;
Автом.VIN = ВРег(АвтомобильVIN);
Автом.Модель = АвтомобильМодель;
Автом.Родитель = АвтомобильРодитель;
Автом.ВариантКомплектации = АвтомобильВариантКомплектации;
Автом.ГодВыпуска = АвтомобильГодВыпуска;
Автом.Родитель = АвтомобильМарка;
Автом.Автор = Автор;
Автом.ВалютаУчета = Справочники.Валюты.НайтиПоКоду("643");
Автом.ВключатьВПрайсЛист = Перечисления.ВидВключенияВПрайсЛист.ВсегдаНеВключатьВПрайсЛист;

Попытка
Автом.Записать();
Справочники.Автомобили.ЗаписьЗначенияРегистраСведения(Автом.Ссылка, ЭтотОбъект.Ссылка,Перечисления.ДополнительнаяИнформацияАвтомобилей.Хозяин, НачалоТекущегоДня);
Справочники.Автомобили.ЗаписьЗначенияРегистраСведения(Автом.Ссылка, АвтомобильПробег,Перечисления.ДополнительнаяИнформацияАвтомобилей.Пробег, НачалоТекущегоДня);
Справочники.Автомобили.ЗаписьЗначенияРегистраСведения(Автом.Ссылка, АвтомобильГосНомер,Перечисления.ДополнительнаяИнформацияАвтомобилей.ГосНомер, НачалоТекущегоДня);
// Справочники.Автомобили.ЗаписьЗначенияРегистраСведения(Автомобиль.Ссылка, АвтоТехПаспорт,Перечисления.ДополнительнаяИнформацияАвтомобилей.ТехПаспорт, НачалоТекущегоДня);
Исключение

КонецПопытки;
КонецЕсли;

//запишем адрес
Если (ЭлементыФормы.ПанельКИ.Страницы.Адрес.Видимость ИЛИ ЭлементыФормы.ПанельКИ.Страницы.АдресКраткий.Видимость) И НЕ ПустаяСтрока(Представление) Тогда
  //запишем данные
Запись = НаборЗаписей.Добавить();
Запись.Объект = Ссылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
Запись.Вид = ВидАдрес;
Запись.ЗначениеПоУмолчанию = Истина;
Для ин = 1 По 12 Цикл
Запись["Поле"+ин] = ЭтаФорма["Поле"+ин];
КонецЦикла;
Запись.ГородскойРайон = ГородскойРайон;
Запись.ТипДома = ТипДома;
Запись.ТипКорпуса = ТипКорпуса;
Запись.ТипКвартиры =  ТипКвартиры;
Запись.СтанцияМетро = СтанцияМетро;
Запись.Представление = Представление;
Запись.Комментарий =  КомментарийАдреса;
КонецЕсли;
//запишем остальные данные КИ
Для Каждого Страница Из ЭлементыФормы.ПанельКИ.Страницы Цикл
ИмяСтраницы = Страница.Имя;
Если Страница.Видимость И ИмяСтраницы <> "Телефон" И ИмяСтраницы <> "Адрес" И ИмяСтраницы <> "АдресКраткий" Тогда
Если НЕ (ПустаяСтрока(ЭтаФорма[ИмяСтраницы]) ИЛИ (ИмяСтраницы = "ВебСтраница" И ВебСтраница = "http://"))  Тогда
Запись = НаборЗаписей.Добавить();
Запись.Объект = Ссылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации[ИмяСтраницы];
Запись.Вид = ЭтаФорма["Вид"+ИмяСтраницы];
Запись.ЗначениеПоУмолчанию = Истина;
Запись.Представление = ЭтаФорма[ИмяСтраницы];
КонецЕсли;
КонецЕсли;
КонецЦикла;

НаборЗаписей.Записать();

Если ЭтаФорма.КлючУникальности <> Неопределено Тогда
Оповестить("БыстрыйВводКонтрагента",Ссылка,ЭтаФорма);
КонецЕсли;

//Возврат;

//запишем контактное лицо
КЛОбъект = Неопределено;
Если НЕ ПустаяСтрока(НаименованиеКЛ) И НаименованиеКЛ <> "Не заполнено" Тогда

КЛОбъект = Справочники.Контрагенты.СоздатьЭлемент();
КЛОбъект.УстановитьНовыйКод();
КЛОбъект.Наименование=СокрЛП(НаименованиеКЛ);
КЛОбъект.Фамилия=ФамилияКЛ;
КЛОбъект.Имя=ИмяКЛ;
КЛОбъект.Отчество=ОтчествоКЛ;
КЛОбъект.Пол=ПолКЛ;
КЛОбъект.НаименованиеПолное = СокрЛП(ФамилияКЛ + ?(обЗначениеНеЗаполнено(ФамилияКЛ),""," ") + ИмяКЛ + ?(обЗначениеНеЗаполнено(ИмяКЛ),""," ") + ОтчествоКЛ);

Если ПустаяСтрока(КЛОбъект.НаименованиеПолное) ИЛИ ФормаСобственностиКл<>Перечисления.ФормыСобственности.ЧастноеЛицо Тогда
КЛОбъект.НаименованиеПолное=КЛОбъект.Наименование;
КонецЕсли;

КЛОбъект.ДатаРождения=ДатаРожденияКЛ;
КЛОбъект.ВидКонтрагента=Перечисления.ВидыКонтрагентов.КонтактноеЛицо;
КЛОбъект.ФормаСобственности=ФормаСобственностиКЛ;
КЛОбъект.Родитель=РодительКЛ;
КЛОбъект.Должность = ДолжностьКЛ;
КЛОбъект.РекламныйИсточник = РекламныйИсточникКЛ;
КЛОбъект.ГоловнойКонтрагент = ГоловнойКонтрагентКЛ;

ПереносТелефонаИзКонтрагента = Ложь;
КЛОбъект.ОсновнойТелефон = ЭтаФорма.ПредставлениеТелефон1КЛ;
Если обЗначениеНеЗаполнено(КЛОбъект.ОсновнойТелефон) Тогда
КЛОбъект.ОсновнойТелефон = ЭтаФорма.ПредставлениеТелефон2КЛ;
КонецЕсли;
Если обЗначениеНеЗаполнено(КЛОбъект.ОсновнойТелефон) Тогда
Если обПраво("РазрешитьВводКонтрагентаБезОсновногоТелефона", Права) <> Перечисления.ВариантыОтветов.Да
И НЕ обЗначениеНеЗаполнено(ОсновнойТелефон) Тогда
ПереносТелефонаИзКонтрагента = Истина;
КЛОбъект.ОсновнойТелефон = ОсновнойТелефон;
КонецЕсли;
КонецЕсли;

Если обПраво("РазрешитьВводКонтрагентаБезРекламы", Права) <> Перечисления.ВариантыОтветов.Да
И обЗначениеНеЗаполнено(КЛОбъект.РекламныйИсточник)
И НЕ обЗначениеНеЗаполнено(РекламныйИсточник) Тогда
КЛОбъект.РекламныйИсточник = РекламныйИсточник;
КонецЕсли;

Если ФормаСобственностиКл=Перечисления.ФормыСобственности.ЧастноеЛицо Тогда
КЛОбъект.СогласиеНаОбработкуПерсональныхДанных     = СогласиеНаОбработкуПерсональныхДанныхКЛ;
КЛОбъект.СогласиеНаОбработкуПерсональныхДанныхДата = СогласиеНаОбработкуПерсональныхДанныхДатаКЛ;
КЛОбъект.СогласиеНаПолучениеSMS                    = СогласиеНаПолучениеSMSКЛ;
КонецЕсли;
Попытка
Модифицированность = Ложь;
КЛОбъект.Записать();
ЗаписьПрошлаУдачно=Истина;
Исключение
ЗаписьПрошлаУдачно=Ложь;
Сообщить("Запись контактного лица не удалась!",СтатусСообщения.Важное);
КонецПопытки;

Если ЗаписьПрошлаУдачно Тогда

// записшем в КЛ
ТаблицаКЛ = РаботаСКонтактнымиЛицами.ИнициализироватьТаблицуЗаписей();
НоваяСтрока = ТаблицаКЛ.Добавить();
НоваяСтрока.Ведущий = Ссылка;
НоваяСтрока.Ведомый = КЛОбъект.Ссылка;
НоваяСтрока.Использование = Истина;
НоваяСтрока.Основной = Истина;
НоваяСтрока.ВидОтношений = Справочники.ВидыВзаимоотношений.КонтактноеЛицо;

Если РаботаСКонтактнымиЛицами.ЗаписьВозможна(КЛОбъект.Ссылка, Ссылка) Тогда
РаботаСКонтактнымиЛицами.ЗаписатьВедущих(КЛОбъект.Ссылка, ТаблицаКЛ);
КонецЕсли;

Попытка
КЛСсылка = КЛОбъект.Ссылка;
// Запишем КИ контактного лица
НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Значение      = КЛСсылка;
НаборЗаписей.Отбор.Объект.Использование = Истина;
//запишем телефоны
Если СокрЛП(Номер1КЛ) <> "" Тогда
// создадим запись в наборе регистра сведений
Запись = НаборЗаписей.Добавить();
Запись.Объект = КЛСсылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
Запись.Вид = ВидТелефон1КЛ;
Запись.ЗначениеПоУмолчанию = Истина;
Запись.Поле1 = КодСтраны1КЛ;
Запись.Поле2 = КодГорода1КЛ;
Запись.Поле3 = Номер1КЛ;
Запись.Поле4 = Внутренний1КЛ;
Запись.Представление = ПредставлениеТелефон1КЛ;
КонецЕсли;
Если СокрЛП(Номер2КЛ) <> "" Тогда
// создадим запись в наборе регистра сведений
Запись = НаборЗаписей.Добавить();
Запись.Объект = КЛСсылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
Запись.Вид = ВидТелефон2КЛ;
Если СокрЛП(Номер1КЛ) = "" Тогда
Запись.ЗначениеПоУмолчанию = Истина;
КонецЕсли;
Запись.Поле1 = КодСтраны2КЛ;
Запись.Поле2 = КодГорода2КЛ;
Запись.Поле3 = Номер2КЛ;
Запись.Поле4 = Внутренний2КЛ;
Запись.Представление = ПредставлениеТелефон2КЛ;
КонецЕсли;

//создадим запись с основным телефоном, который подставили из контрагента
Если ПереносТелефонаИзКонтрагента Тогда
// создадим запись в наборе регистра сведений
Запись = НаборЗаписей.Добавить();
Запись.Объект = КЛСсылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
Запись.ЗначениеПоУмолчанию = Истина;
Если СокрЛП(Номер1)<>"" Тогда
Запись.Вид = ВидТелефон1;
Запись.Поле1 = КодСтраны1;
Запись.Поле2 = КодГорода1;
Запись.Поле3 = Номер1;
Запись.Поле4 = Внутренний1;
Запись.Представление = ПредставлениеТелефон1;
Иначе
Запись.Вид = ВидТелефон2;
Запись.Поле1 = КодСтраны2;
Запись.Поле2 = КодГорода2;
Запись.Поле3 = Номер2;
Запись.Поле4 = Внутренний2;
Запись.Представление = ПредставлениеТелефон2;
КонецЕсли;
КонецЕсли;


//запишем адрес
Если (ЭлементыФормы.ПанельКИКЛ.Страницы.Адрес.Видимость ИЛИ ЭлементыФормы.ПанельКИКЛ.Страницы.АдресКраткий.Видимость) И НЕ ПустаяСтрока(ПредставлениеКЛ) Тогда
//запишем данные
Запись = НаборЗаписей.Добавить();
Запись.Объект = КЛСсылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
Запись.Вид = ВидАдресКЛ;
Запись.ЗначениеПоУмолчанию = Истина;
Для ин = 1 По 12 Цикл
Запись["Поле"+ин] = ЭтаФорма["Поле"+ин+"КЛ"];
КонецЦикла;
Запись.ГородскойРайон = ГородскойРайонКЛ;
Запись.СтанцияМетро = СтанцияМетроКЛ;
Запись.Представление = ПредставлениеКЛ;
Запись.Комментарий =  КомментарийАдресаКЛ;
Запись.ТипДома = ТипДомаКЛ;
Запись.ТипКорпуса = ТипКорпусаКЛ;
Запись.ТипКвартиры = ТипКвартирыКЛ;
КонецЕсли;
//запишем остальные данные КИ
Для Каждого Страница Из ЭлементыФормы.ПанельКИКЛ.Страницы Цикл
ИмяСтраницы = Страница.Имя;
Если Страница.Видимость И ИмяСтраницы <> "Телефон" И ИмяСтраницы <> "Адрес" И ИмяСтраницы <> "АдресКраткий" Тогда
Если НЕ (ПустаяСтрока(ЭтаФорма[ИмяСтраницы+"КЛ"]) ИЛИ (ИмяСтраницы = "ВебСтраница" И ВебСтраницаКЛ = "http://"))  Тогда
Запись = НаборЗаписей.Добавить();
Запись.Объект = КЛСсылка;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации[ИмяСтраницы];
Запись.Вид = ЭтаФорма["Вид"+ИмяСтраницы+"КЛ"];
Запись.ЗначениеПоУмолчанию = Истина;
Запись.Представление = ЭтаФорма[ИмяСтраницы+"КЛ"];
КонецЕсли;
КонецЕсли;
КонецЦикла;

НаборЗаписей.Записать();

Исключение
Сообщить("Запись контактной информации контактного лица не удалась!.",СтатусСообщения.Важное);
КонецПопытки;
КонецЕсли;
КонецЕсли;

Модифицированность = Ложь;

// Сохраним куратора
Если НЕ обЗначениеНеЗаполнено(Куратор) Тогда
Запись = РегистрыСведений.Кураторы.СоздатьМенеджерЗаписи();
Запись.Контрагент = Ссылка;
Запись.Куратор = Куратор;
Запись.Прочитать();
Если НЕ Запись.Выбран() Тогда
Запись.Контрагент = Ссылка;
Запись.Куратор = Куратор;
Запись.Записать(Истина);
КонецЕсли;
КонецЕсли;

Модифицированность = Ложь;

КонецПроцедуры

Десятый:

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

ЗаписьРегистраДляРедактирования = Форма.НаборКонтактнойИнформации.Добавить();
ЗаписьРегистраДляРедактирования.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
ЗаписьРегистраДляРедактирования.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонСотовый;
ЗаписьРегистраДляРедактирования.ЗначениеПоУмолчанию = Истина;
ЗаписьРегистраДляРедактирования.Поле1 = КодРегиона;
ЗаписьРегистраДляРедактирования.Поле2 = КодГорода;
ЗаписьРегистраДляРедактирования.Поле3 = НомерТелефона;
ЗаписьРегистраДляРедактирования.Поле4 = ВнутреннийНомер;
ЗаписьРегистраДляРедактирования.Представление = ПредставлениеТелефона;
Форма.ОсновнойТелефон = ПредставлениеТелефона;
Форма.ОчищатьКонтактнуюИнформациюПриОткрытии = Ложь;
Форма.Открыть();
КонецЕсли;
КонецПроцедуры


antoneus

Девятый выглядит подозрительно - там то, про что я и говорил: набор записей создается, устанавливается отбор, в набор добавляются записи, набор записывается - и во всем регистре остаются только эти добавленные записи. Везде есть НаборЗаписей.Прочитать(), тут - нет.

gulnyr

Цитата: antoneus от 04 мая 2023, 15:48Девятый выглядит подозрительно - там то, про что я и говорил: набор записей создается, устанавливается отбор, в набор добавляются записи, набор записывается - и во всем регистре остаются только эти добавленные записи. Везде есть НаборЗаписей.Прочитать(), тут - нет.

Прошелся отладчиком, там тоже есть Прочитать:

...
// Очистим все записи по объекту
НаборЗаписей = РегистрыСведений.сфпНомераТелефоновДляПоиска.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
СтарыйНабор = НаборЗаписей.Выгрузить(, "НомерТелефона,Представление,ВнутреннийНомер");
...

Т.е. контактные данные этот код не стирает. Так что дальше надо посмотреть.

А можно ли как-то быстро определить по процедуре в каких документах, справочниках они находятся? (чтобы тестировать, где стирается регистр сведении)

Глобальным поиском искал эти процедуры, но все равно как-то результата не принесли, не стираются данные регистра, а значит и исправить не получится, не зная причины.

Использовал Alt + F12, но там очень много чего находит, например функция киПолучитьПредставлениеКИ находит около 400 раз.

Теги:

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

Рейтинг@Mail.ru

Поиск