Имя: Пароль:
1C
1С v8
Запись в регистр сведений программно
,
0 amadeus2010
 
15.08.12
11:45
Добрый день, пытаюсь решить следующую задачу.Надо программно заполнить спр.Контрагенты из ексел.В разделе контакты пытаюсь заполнить поле юридический адрес контрагента, таким образом что если адрес уже существует то код должен обновить его, а если поле адрес пустое то заполнить его данными из файла.Вот код для заполнения адреса
////////////////////////////////////////////////////////////////
Набор = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ *
                  |ИЗ
                  |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                  |ГДЕ
                  |    КонтактнаяИнформация.Объект = &Объект
                  |    И КонтактнаяИнформация.Тип = &Тип
                  |    И КонтактнаяИнформация.Вид = &Вид";                                                                                                                                                        
   Запрос.УстановитьПараметр("Объект", Контрагент.Ссылка);
   Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
   Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
   Выборка = Запрос.Выполнить().Выбрать();
   Если Выборка.Следующий() Тогда
       //Возврат;
       
       СтруктураЮрАдреса= Новый Структура;
       СтруктураЮрАдреса.Вставить("Объект", Контрагент.Ссылка);
       СтруктураЮрАдреса.Вставить("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
       СтруктураЮрАдреса.Вставить("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
       
   Запись=Набор.Получить(СтруктураЮрАдреса);
      Иначе
   Запись = Набор.Добавить();
    КонецЕсли;
   Запись.Объект = Контрагент;
   Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
   Запись.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
   Запись.Поле6 = Строка.Улица;
   Запись.Поле7 = Строка.Дом;
   Запись.Представление = Строка.Улица + ", " + Строка.Дом;
   Набор.Записать(Ложь);
//////////////////////////////////////////////////////////
при компиляции выдается  Ошибка при вызове метода контекста (Получить)
   Запись=Набор.Получить(СтруктураЮрАдреса);
P.S Если убрать часть кода где создается структура то код работает,но нет проверки и обновления адреса
1 Светлый Гений
 
15.08.12
11:51
выдержка из СП:
РегистрСведенийНаборЗаписей.<Имя регистра сведений>.Получить (InformationRegisterRecordSet.<Имя регистра сведений>.Get)
РегистрСведенийНаборЗаписей.<Имя регистра сведений> (InformationRegisterRecordSet.<Имя регистра сведений>)
Получить (Get)
Синтаксис:
Получить(<Индекс>)
Параметры:
<Индекс> (обязательный)
Тип: Число. Индекс записи.
Возвращаемое значение:
Тип: РегистрСведенийЗапись.
Описание:
Получает значение по индексу. Работает аналогично оператору [].
Примечание:
Применяется в случаях, когда использование оператора [] невозможно.
Пример:
см. пример метода Очистить
2 Шапокляк
 
15.08.12
11:53
А почему нельзя использовать СоздатьМенеджерЗаписи и все туда спокойно записать?
3 zladenuw
 
15.08.12
11:55
ПолучитьМенеджерЗаписи (GetRecordManager)
Синтаксис:

ПолучитьМенеджерЗаписи()
Возвращаемое значение:

Тип: РегистрСведенийМенеджерЗаписи.

Описание:

ВыбранПолучает объект для чтения, изменения, добавления и удаления записи регистра сведений, на которой в данный момент спозиционирована выборка.
(0) Может ты так хотел получить?
4 amadeus2010
 
15.08.12
12:00
(3)структурой я делаю отбор записей, а методом получить хотел вытащить записи для вставки их в поля справочника.
5 amadeus2010
 
15.08.12
12:06
(3)т.е имеете в виду вместо Набор = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей() написать Создать МенеджерЗаписи?
6 dmpl
 
15.08.12
12:08
(0) Во-первых, где установка отбора для набора записей? Ты что, сразу весь регистр контактной информации будешь перезаписывать? Во-вторых, что мешает установить отбор, прочитать набор записей, ну а дальше уже проверять - есть ли нужная запись или нет? После чего записать модифицированный набор записей.

А если действовать через менеджер записи, то вообще ничего проверять не надо - просто пиши, и она перепишет старый адрес, если он есть.

P.S. А набор записей надо писать так:


Набор.Записать(Истина);


Только про отборы не забыть, а то придется восстанавливать содержимое регистра.
7 Шапокляк
 
15.08.12
12:08
(5) Да, только это я имею в виду. Если есть данные в регистре - перезапишет, если нет - напишет новые
8 amadeus2010
 
15.08.12
12:55
(6)т.е если я напишу вместо
Набор = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();

Набор=РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
и весь мой остальной код/////////
то должно все работать?
9 Popkorm
 
15.08.12
13:02
(0)
           КИ = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
           КИ.Отбор.Объект.Значение = НовыйКонтрагент.Ссылка;
           КИ.Отбор.Объект.Использование = Истина;
           АдресЮр = КИ.Добавить();
           АдресЮр.Объект = НовыйКонтрагент.Ссылка;
           АдресЮр.Тип    = Перечисления.ТипыКонтактнойИнформации.Адрес;
           АдресЮр.Вид    = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Юридический адрес контрагента");
           АдресЮр.Представление = ВыбКонт.Контрагент.ЮрФизЛицо.ФактАдрес;
           КИ.Записать();
           АдресФакт = КИ.Добавить();
           АдресФакт.Объект= НовыйКонтрагент.Ссылка;
           АдресФакт.Тип  = Перечисления.ТипыКонтактнойИнформации.Адрес;
           АдресФакт.Вид  = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Фактический адрес контрагента");
           АдресФакт.Представление = ВыбКонт.Контрагент.ЮрФизЛицо.ФактАдрес;
           КИ.Записать();
           Телефон = КИ.Добавить();
           Телефон.Объект = НовыйКонтрагент.Ссылка;
           Телефон.Тип    = Перечисления.ТипыКонтактнойИнформации.Телефон;
           Телефон.Вид    = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Телефон контрагента");
           Телефон.Представление = ВыбКонт.Контрагент.ЮрФизЛицо.ТекущийЭлемент().Телефоны;
           КИ.Записать();
10 amadeus2010
 
15.08.12
13:53
(9) т.е не используя запрос к регистру можно получить юридический и фактический адрес контрагента и проверить если запись есть то заменить ее новой а если нет то добавить запись?
11 SanGvin
 
15.08.12
13:56
(10) режим записи - замещение. т.е. если есть - заменит, если  нет создаст.
12 dmpl
 
15.08.12
14:18
(9) Этот код перепишет всю контактную информацию контрагента 3 новыми записями. Плюс 3 записи набора записей вместо одной.
13 dmpl
 
15.08.12
14:20
(10) Это делается на уровне платформы, которая гарантирует уникальность записи в регистре сведений с заданным набором измерений.
14 Popkorm
 
15.08.12
14:22
(10)в регистрах сведений не бывает корректировки записей,старая запись удаляется и пишется новая
15 amadeus2010
 
15.08.12
14:31
(9)как я понял этим кодом я заменяю свой и уже не использую запрос для выбора данных из регистра?
16 amadeus2010
 
15.08.12
15:06
Немного подправил (9) код под свои нужды, учитывая что источник данных ексель
////////////////////////////////////////////////////////////
КИ = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
           КИ.Отбор.Объект.Значение = Контрагент.Ссылка;
           КИ.Отбор.Объект.Использование = Истина;
           АдресЮр = КИ.Добавить();
           АдресЮр.Объект = Контрагент.Ссылка;
           АдресЮр.Тип    = Перечисления.ТипыКонтактнойИнформации.Адрес;
           АдресЮр.Вид    = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Юридический адрес контрагента");
           АдресЮр.Поле6  = Строка.Улица;
           АдресЮр.Поле7=Строка.Дом;
           //АдресЮр.Представление = ВыбКонт.Контрагент.ЮрФизЛицо.ФактАдрес;
           АдресЮр.Представление=Строка.Улица + ", " + Строка.Дом;
           КИ.Записать();
           АдресФакт = КИ.Добавить();
           АдресФакт.Объект= Контрагент.Ссылка;
           АдресФакт.Тип  = Перечисления.ТипыКонтактнойИнформации.Адрес;
           АдресФакт.Вид  = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Фактический адрес контрагента");
           АдресФакт.Поле6=Строка.Улица;
           АдресФакт.Поле7=Строка.Дом;
           //АдресФакт.Представление = ВыбКонт.Контрагент.ЮрФизЛицо.ФактАдрес;
           АдресФакт.Представление=Строка.Улица + ", " + Строка.Дом;
           КИ.Записать();
///////////////////////////////////////////////////
а так всем большое спасибо.
17 dmpl
 
15.08.12
15:13
(16) Только стоит учесть (12) - если контрагенту будет назначена еще какая-то информация (например, телефон или e-mail), то загрузка удалит эти данные.
Программист всегда исправляет последнюю ошибку.