Имя: Пароль:
1C
1С v8
ТиС- УТ 11: Перенос "Контактной информации контрагентов": через "Выгрузить по правилу
0 DenYuliya
 
15.01.18
14:32
Добрый день.
подскажите пожалуйста, как правильнее/проще реализовать часть задачи?

Дано: Переход с ТиС 7.7 на УТ 11.
В 1С ТиС 7.7 есть справочник "Контрагенты". У него есть реквизиты строкового типа:
1)
- ФИО руководителя
- должность руководителя
- тел руководителя
- почта руководителя

2)
1)
- ФИО менеджера
- должность менеджера
- тел менеджера
- почта менеджера

и т.д., 1) и 2) - это 8 реквизитов спр. Контрагенты строкового типа.

Я часть реквизитов (ФИО, должность) конвертировала в элементы справочника "Контактные лица партнера".
Сделала ПКО "Контрагенты_КонтактныеЛица", в обработчике "после выгрузки в файл" код:

СЗ = СоздатьОбъект("СписокЗначений");

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

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

КонецЕсли;

Есть ПКО "Контакты", с пустым источником, приемником "КонтактныеЛицаПартнеров", и ПКС на каждый из реквизитов по подобному принципу в обработчике "Перед выгрузкой":

Значение = Источник.Получить("ДолжностьПоВизитке");

Все работает, элементы создаются.
Теперь собсна сам вопрос:

надо же теперь еще как-то "контактную информацию" для "Контактных лиц партнера" заполнить...

А вот тут я не могу понять.. С учетом идиотской схемы хранения КИ в Доп.реквизитах, как лучше поступить?

Заполнять КИ через "Выгрузить по правилу", в тех же ПКО, по аналогии с реквизитами "ФИО" и "Должность", как бы в том же цикле (пробовала - не получается...)?
или сделать новое ПКО для заполнения КИ, и выгружать по аналогии типовых правил для выгрузки КИ, например тех же партнеров?

А то я сейчас буду, как баран, пытаться...Мне бы хотя бы понимание - можно ли через "Выгрузить по правилу" тут действовать?
1 mistеr
 
15.01.18
14:55
Доп. реквизиты это ведь ТЧ, если я правильно помню? Нужно сформировать ее как ТЗ и присвоить параметру КоллекцияОбъектов в обработчике ПКГС ПередОбработкой.
2 DenYuliya
 
15.01.18
15:46
(1) да, ТЧ.
Вопрос в другом немного... можно ли "сформировать ее как ТЗ и присвоить параметру КоллекцияОбъектов в обработчике ПКГС ПередОбработкой" делать через "выгрузить по правилу",
например как в (0),

ВыгрузитьПоПравилу(СЗ,,,,"Контакты");

В ПКО "Контакты" делать "все танцы с бубном", и потом результат передавать в исходное ПКО "Контрагенты_КонтактныеЛица".

Или надо ПКГС для КИ создавать непосредственно в исходном ПКО "Контрагенты_КонтактныеЛица", а дальше - обрабатывать по аналогии с типовыми правилами ПКГС для КИ (в типовых это реализовано в алгоритмах).

Не уверена, что понятно формулирую вопрос...
И в том, и в том случае - принцип одинаковый - "сформировать ее как ТЗ и присвоить параметру КоллекцияОбъектов в обработчике ПКГС ПередОбработкой" делать через "выгрузить по правилу", это я понимаю. Вопрос в том, откуда вызывать)).
3 mistеr
 
15.01.18
16:04
Заполнять нужно там, где ТЧ, то есть в ПКО с приемником КонтактныеЛицаПартнеров. А как вызывать, думаю разницы нет.
4 DenYuliya
 
15.01.18
16:08
(3) и в том, и в том ПКО приемник КонтактныеЛицаПартнеров

В исходном ПКО - источник спр.Контрагенты, в вызываемом из исходного ПКО источник пустой.
5 mistеr
 
15.01.18
16:09
Можно заполнить весть объект, включая ТЧ, в ПКО с источником Контрагенты, где есть вся информация, и ВыгрузитьПоПравилу().

Так даже проще будет.
6 DenYuliya
 
15.01.18
16:17
(5) Вот))). Я так и хотела, тем более что из одного элемента Источника у меня получается 5 элементов приемника, боялась запутаться в том "кому что раздавать".
Спасибо!
Значит не вышло у меня так сделать из-за криворукости кода, а не потому, что так вообще не делают.
7 d4rkmesa
 
гуру
15.01.18
20:22
(2) Имхо, я бы лучше в ПКО, к примеру, ФизическиеЛица, Контрагенты или Организация сделал для ПКГС КонтактнаяИнформация обработчик, который все формирует и скопипастил в остальные ПКО с ТЧ КонтактнаяИнформация. К примеру, для V8:

ЗапросКонтактнаяИнформация = Новый Запрос;
ЗапросКонтактнаяИнформация.Текст = "ВЫБРАТЬ
|    КонтактнаяИнформация.Тип,
|    КонтактнаяИнформация.Вид,
|    КонтактнаяИнформация.Вид КАК ВидДляСписка,
|    КонтактнаяИнформация.Представление,
|    ВЫБОР
|        КОГДА КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
|            ТОГДА КонтактнаяИнформация.Поле4
|    КОНЕЦ КАК Город,
|    ВЫБОР
|        КОГДА КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
|            ТОГДА КонтактнаяИнформация.Поле1 + КонтактнаяИнформация.Поле2 + КонтактнаяИнформация.Поле3
|    КОНЕЦ КАК НомерТелефона,
|    ВЫБОР
|        КОГДА КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
|            ТОГДА КонтактнаяИнформация.Поле3
|    КОНЕЦ КАК НомерТелефонаБезКодов,
|    ВЫБОР
|        КОГДА КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
|            ТОГДА КонтактнаяИнформация.Представление
|    КОНЕЦ КАК АдресЭП,
|    ВЫБОР
|        КОГДА КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
|            ТОГДА КонтактнаяИнформация.Поле2
|    КОНЕЦ КАК Регион,
|    ВЫБОР
|        КОГДА КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
|                И НЕ КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ИнострАдресФизЛица)
|            ТОГДА ""Россия""
|    КОНЕЦ КАК Страна,
|    КонтактнаяИнформация.Поле1,
|    КонтактнаяИнформация.Поле2,
|    КонтактнаяИнформация.Поле3,
|    КонтактнаяИнформация.Поле4,
|    КонтактнаяИнформация.Поле5,
|    КонтактнаяИнформация.Поле6,
|    КонтактнаяИнформация.Поле7,
|    КонтактнаяИнформация.Поле8,
|    КонтактнаяИнформация.Поле9,
|    КонтактнаяИнформация.Поле10,
|    КонтактнаяИнформация.ТипДома,
|    КонтактнаяИнформация.ТипКорпуса,
|    КонтактнаяИнформация.ТипКвартиры
|ИЗ
|    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
|    КонтактнаяИнформация.Объект = &Объект
|    И КонтактнаяИнформация.Вид.Предопределенный
|    И (ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(1000))) <> """"";

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

Если НЕ РезультатЗапроса.Пустой() Тогда
    КоллекцияОбъектов = РезультатЗапроса.Выгрузить();
    КоллекцияОбъектов.Колонки.Добавить("ЗначенияПолей", Новый ОписаниеТипов("Строка"));
    
    Для Каждого СтрокаКоллекции Из КоллекцияОбъектов Цикл
        
        Если СтрокаКоллекции.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
            СтрокаКоллекции.ЗначенияПолей = "Индекс=" + СтрокаКоллекции.Поле1 + Символы.ПС
            + "Регион="           + СтрокаКоллекции.Поле2 + Символы.ПС
            + "Район="            + СтрокаКоллекции.Поле3 + Символы.ПС
            + "Город="            + СтрокаКоллекции.Поле4 + Символы.ПС
            + "НаселенныйПункт="  + СтрокаКоллекции.Поле5 + Символы.ПС
            + "Улица="            + СтрокаКоллекции.Поле6 + Символы.ПС
            + "Дом="              + СтрокаКоллекции.Поле7 + Символы.ПС
            + "Корпус="           + СтрокаКоллекции.Поле8 + Символы.ПС
            + "Квартира="         + СтрокаКоллекции.Поле9 + Символы.ПС
            + "ТипДома="        + СтрокаКоллекции.ТипДома + Символы.ПС
            + "ТипКорпуса="        + СтрокаКоллекции.ТипКорпуса + Символы.ПС
            + "ТипКвартиры="    + СтрокаКоллекции.ТипКвартиры;
        ИначеЕсли СтрокаКоллекции.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
            СтрокаКоллекции.ЗначенияПолей = "КодСтраны=" + СтрокаКоллекции.Поле1 + Символы.ПС
            + "КодГорода="     + СтрокаКоллекции.Поле2 + Символы.ПС
            + "НомерТелефона=" + СтрокаКоллекции.Поле3 + Символы.ПС
            + "Добавочный="    + СтрокаКоллекции.Поле4;            
        КонецЕсли;        
    КонецЦикла;    
Иначе
    Отказ = Истина;
КонецЕсли;
8 DenYuliya
 
16.01.18
09:39
(7) подобное есть в типовых правилах для УТ. Например у спр. Контрагенты, являющегося Источником для ПКО "Контрагенты_КонтактныеЛица", есть еще одно ПКО "Контрагенты_Партнеры". И в нем как раз примерно такая схема, только в самом ПКГС вызывается Алгоритм. Я в (0) упоминала этот момент.

Использовать тот же Алгоритм не выйдет, потому что
1) Разный набор полей у Источников и Приемников
2) В случае с Орг, Контрагенты, Физлица 1 элемент источника = 1 элемент приемника. У меня же 1 элемент источника = 5 элементов приемника.

Но сам принцип "в ПКГС источника, без доп. ПКО" - не знаю, как лучше((.
Смущает то, что остальные-то реквизиты через "выгрузить по правилу" обходятся, не получится ли расхождений, если часть реквизитов обходить так, другую часть эдак.
9 DenYuliya
 
16.01.18
09:48
(7) + в УТ 11 КИ перенесли из рег.св в какую-то идиотскую схему хранения в Дополнительных реквизитах, которую я, если честно, так и не освоила толком. Как по мне, так там все намнооогоо запутаннее, чем в рег. св
10 DenYuliya
 
17.01.18
13:04
В продолжение (0).

Добавляю в ПКО "Контакты" (которое вызывается из основного ПКО через "выгрузить по правилу") ПКГС "Контактная информация".

Если смотреть типовые ПКГС для "Контактной информации" (например в ПКО "Контрагенты_Партнеры"), то сокращенно (на примере только "телефона") в ПКГС создается ТЗ:

Если ТипЗначенияСтр(ВходящиеДанные) <> "СписокЗначений" Тогда
    ВходящиеДанные = СоздатьОбъект("СписокЗначений");
КонецЕсли;

КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъектов.НоваяКолонка("Вид");
КоллекцияОбъектов.НоваяКолонка("Представление");
КоллекцияОбъектов.НоваяКолонка("Тип");
КоллекцияОбъектов.НоваяКолонка("НомерТелефона");

Если ПустаяСтрока(Источник.ЮрФизЛицо.Телефоны) = 0 Тогда
    ВходящиеДанные.Установить("Телефон",  Источник.ЮрФизЛицо.Телефоны);
    ВходящиеДанные.Установить("Родитель", "СправочникПартнеры");
    ВыгрузитьТелефоны();
КонецЕсли;

а потом вызывается Алгоритм "ВыгрузитьТелефоны();, в котором создается СЗ и устанавливается соответствие реквизитов Источника элементам СЗ:

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

В самом же ПКО такие ПКС, как "Телефон", остаются пустыми (в том плане, что не указан приемник, источник, никакого кода нет).

А у меня, как я переносила предыдущие реквизиты в (0) (ФИО и Должность), Список значений, и установка соответствий реквизитов Источника элементам СЗ происходит в ПКО "Контрагенты_КонтактныеЛица", а потом этот СЗ "передается" через ВыгрузитьПоПравилу() в ПКО "Контакты"...

В общем я запуталась, как мне это объединить, или что делать-то?
Мне в вызываемом из ПКГС алгоритме новый СЗ создавать, или использовать ранее созданный?
Или может можно вообще сразу из ПКО "Контрагенты_КонтактныеЛица" передавать в ПКГС ПКО "Контакты" созданный СЗ, и никакой Алгоритм не использовать?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший