Имя: Пароль:
1C
 
Необходимо перенести значения реквизитов справочника в ТЧ
0 Amriil
 
19.05.22
09:45
Необходимо в модуле менеджера справочника создать экспортную процедуру, которая перенесет значения реквизитов справочника в ТЧ. Справочник получила, тч открыла, как записать воображения не хватает.

Процедура ЗаполнитьТабличнуюЧастьКонтактнаяИнформация()Экспорт

    Выборка = Справочники.Контрагенты.Выбрать();
    
    Пока Выборка.Следующий() Цикл
    
        КонтактнаяИнформация = Выборка.ПолучитьОбъект().КонтактнаяИнформация;
        КонтактнаяИнформация.Очистить();
        
        Строка1 = КонтактнаяИнформация.Добавить();
        Строка1.Вид = Справочники.ВидыКонтактнойИнформации.EMailКонтрагента;
        Строка1.Значение = Выборка.УдалитьEMail;
        
        Строка2 = КонтактнаяИнформация.Добавить();
        Строка2.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
        Строка2.Значение = Выборка.УдалитьТелефон;
        
    КонецЦикла;
1 Dmitrii
 
гуру
19.05.22
09:52
(0) >> Справочник получила, тч открыла.

Получи объект отдельно. Ведь записывать то ты будешь именно объект. Записать табличную часть отдельно от объекта платформа не позволяет.
А то ты сразу ломанулась к табличной части.


Контрагент = Выборка.ПолучитьОбъект();
КонтактнаяИнформация = Контрагент.КонтактнаяИнформация;
// что-то делаем с табличной частью КонтактнаяИнформация
Контрагент.Записать();
2 SuperMario
 
19.05.22
09:52
Процедура ЗаполнитьТабличнуюЧастьКонтактнаяИнформация()Экспорт

    Выборка = Справочники.Контрагенты.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        КонтрагентОбъект = Выборка.ПолучитьОбъект();
        КонтактнаяИнформация = КонтрагентОбъект.КонтактнаяИнформация;
        КонтактнаяИнформация.Очистить();
        
        Строка1 = КонтактнаяИнформация.Добавить();
        Строка1.Вид = Справочники.ВидыКонтактнойИнформации.EMailКонтрагента;
        Строка1.Значение = Выборка.УдалитьEMail;
        
        Строка2 = КонтактнаяИнформация.Добавить();
        Строка2.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
        Строка2.Значение = Выборка.УдалитьТелефон;
        
        КонтрагентОбъект.Записать();

    КонецЦикла;
3 Amra
 
19.05.22
09:53
Выборка = Справочники.Контрагенты.Выбрать();
    
    Пока Выборка.Следующий() Цикл
    Об = Выборка.ПолучитьОбъект();
        КонтактнаяИнформация = Об.КонтактнаяИнформация;
        КонтактнаяИнформация.Очистить();
        
        Строка1 = КонтактнаяИнформация.Добавить();
        Строка1.Вид = Справочники.ВидыКонтактнойИнформации.EMailКонтрагента;
        Строка1.Значение = Выборка.УдалитьEMail;
        
        Строка2 = КонтактнаяИнформация.Добавить();
        Строка2.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
        Строка2.Значение = Выборка.УдалитьТелефон;
        Об.Записать();
    КонецЦикла;
4 Amra
 
19.05.22
09:53
(2) Опередил)
5 Kassern
 
19.05.22
10:05
а вас никого не удивил вот этот кусок? "Выборка = Справочники.Контрагенты.Выбрать();" - ТС пытается экспортной процедурой каждый раз изменять контактную информацию для ВСЕХ контрагентов?)
6 Amriil
 
19.05.22
10:06
Спасибо огромное! Вы - Герои
7 Amriil
 
19.05.22
10:07
Не каждый раз. Я в эту процедуру попаду один раз при обновлении.
8 Kassern
 
19.05.22
10:08
(7) тогда зачем эта процедура нужно в модуле менеджера справочника, если она одноразовая?
9 Kassern
 
19.05.22
10:09
Что мешало сделать обычную внешнюю обработку и 1 раз запустить?
10 Amriil
 
19.05.22
10:11
Поставленная задача
11 Dmitrii
 
гуру
19.05.22
11:31
(5) (8) Это технология применяется в БСП в подсистеме обновления конфигурации.
Обработчики обновления (неважно монопольно выполняемые или для отложенного обновления) помещаются в модуль менеджера.

Другой вопрос, что тот вариант, который нарисовала автор ветки, крайне корявый сам по себе. Использовать его в таком виде можно только с рядом оговорок.
Например, если табличная часть КонтактнаяИнформация добавлена в справочник только с этим обновлением и раньше её не было. В противном случае КонтактнаяИнформация.Очистить() приведёт к удалению всей прочей ранее введённой пользователями контактной информации.
Так же зачем-то обрабатывается весь справочник. Хотя наверняка контактная информация в реквизитах УдалитьEMail и УдалитьТелефон заведена далеко не у всех контрагентов. По-хорошему должен быть выполнен запрос к справочнику для получения только тех элементов, которые необходимо обработать (где заполнены реквизиты УдалитьEMail и УдалитьТелефон, но ими ещё не заполнена ТЧ КонтанктнаяИнформация).
В-третьих, 1С рекомендует делать подобные обработки порциями по 500-1000 элементов. Т.е. получать элементы справочника запросом "ВЫБРАТЬ ПЕРВЫЕ 1000..." и повторять этот запрос в цикле пока запрос не вернёт пустой результат (не останется элементов для обработки).
Ну и мелочи типа обработки ошибок, выполнение в транзакции и контроль блокировок, если обработка обновления выполняется в отложенном режиме, а не в монопольном.