Имя: Пароль:
1C
1C 7.7
v7: Перебор реквизитов справочника в 1с.7.7
,
0 Denshu
 
06.04.18
12:23
Добрый день. Есть некоторый справочник в нем куча реквизитов. Я получаю некоторую информацию из текстового документа, информация следующего вида "НаименованиеРеквизитаСправочника" - "Значение". Затем мне это значение нужно воткнуть в справочник. Что-то типо того ЭлементСправочника[НаименованиеРеквизитаСправочника] = "Значение". Подскажите как такое реализуется на 7.7?
1 cincout
 
06.04.18
12:25
УстановитьАтрибут(<?>,);
Синтаксис:
УстановитьАтрибут(<ИмяРеквизита>,<Значение>)
Назначение:
Установить значение реквизита по имени идентификатора.
Параметры:
<ИмяРеквизита> - строковое выражение, содержащее имя реквизита, как оно задано в конфигураторе.
<Значение> - выражение, содержащее устанавливаемое значение реквизита.
2 SleepyHead
 
гуру
06.04.18
12:26
Спр = СоздатьОбъект("Справочник.ХХХ");
Спр.Новый();

...

Спр.УстановитьАтрибут(ИмяРеквизита, Значение);

//в синтакис помощнике еще и не такое есть
3 Denshu
 
06.04.18
12:27
Здорово, спасибо мужики
4 zavsoms
 
06.04.18
12:29
перебрать элементы справочника

Спр = СоздатьОбъект("Справочник.Такойто");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл

     Спр.Реквизит1 = значениепеременной;
     Спр.Записать();
КонецЦикла
5 Denshu
 
06.04.18
12:31
(4) не, мне реквизиты надо, а не элементы =)
6 Zmich
 
06.04.18
12:34
(3). Только тебе нужно соответствие с типами. Не все же реквизиты типа "Строка"
7 Denshu
 
06.04.18
12:39
(6) Все реквизиты типа строка, так что не нужно
8 ПегийЛунь
 
06.04.18
12:51
СпрСотр = Метаданные.Справочник(“Сотрудники”);
КолвоРеквизитов = СпрСотр.Реквизит();
Для Ном=1 to КолвоРеквизитов Цикл
СпрРекв = СпрСотр.Реквизит(Ном);
Идентификатор = СпрРекв.Идентификатор();
ПолныйИдентификатор = СпрРекв.ПолныйИдентификатор();
Синоним = СпрРекв.Синоним();
Комментарий = СпрРекв.Комментарий();
Тип = СпрРекв.Тип(); //Тут "строка"
Длина = СпрРекв.Длина();
Точность = СпрРекв.Точность();
... и так далее
9 aka AMIGO
 
06.04.18
12:53
Есть такая штука: Спр.НайтиПоРеквизиту(...);
10 Zmich
 
06.04.18
12:56
(9). Для всех реквизитов не получится, там какая-то галочка должна быть установлена в конфигураторе, насколько я помню.
11 zavsoms
 
06.04.18
12:59
(10) галочка = Сортировать по реквизиту
12 aka AMIGO
 
06.04.18
13:06
(10) А, точно!
13 ПегийЛунь
 
06.04.18
13:08
В рот мне скобки!
Процедура Сформировать()
СпрСотр = Метаданные.Справочник("Сотрудники");
КолвоРеквизитов = СпрСотр.Реквизит();
Для Ном=1 to КолвоРеквизитов Цикл
    СпрРекв = СпрСотр.Реквизит(Ном);
    Тип = СпрРекв.Тип;//Тут "строка"
    Если Тип="Строка" Тогда
        Идентификатор = СпрРекв.Идентификатор;
        Если Идентификатор="МестоРождения" Тогда
            Сообщить("Ага!");
        КонецЕсли;
    КонецЕсли;
    
КонецЦикла;
КонецПроцедуры
14 MWWRuza
 
гуру
06.04.18
13:12
Чего-то каких-то сложностей нагородили...

Создаем объект нужного справочника:
Спр = СоздатьОбъект("Справочник.НужныйСправочник");

А дальше, в зависимости от задачи, позиционируемся на нужном элементе справочника:
Если бежим по строкам текста, и создаем новые элементы справочника:
Для Сч = 1 По Текст.КоличествоСтрок() Цикл
Тут, в зависимости от задачи, либо ищем его из имеющихся элементов справочника одним из методов:
Спр.НайтиЭлемент(), НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизту())
Иесли нашли = 1 Тогда
Просто присваиваем нужному реквизиту нужное значение спомощью "=". Так:
Спр.НужныйРеквизит = НужноеЗначение;
Спр.Записать();
Либо, создаем новый:
Спр.Новый();
И дальше, просто присваиваем через равно значения реквизитам, на элементе мы при создании нового уже спозиционированы:
Спр.НужныйРеквизит = НужноеЗначение;
Спр.Записать();
Если надо бежать по справочнику, то все то-же самое, только перебираем его элементы:
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Присвоение значений реквизитам все так-же, через "=".
15 Zmich
 
06.04.18
13:16
(14). Спр.НужныйРеквизит - как сработает, если конкретно известно только название этого реквизита, заданное в некой строке? Так что (1) и (2) правы и автору этого оказалось достаточно, т.к. все реквизиты у него типа "Строка".
16 Aleksey
 
06.04.18
13:16
Выборка не собъется после записи в цикле?
17 MWWRuza
 
гуру
06.04.18
13:35
(16)Не собъется. Если элементов много, то можно делать в транзакции:
НачатьТранзакцию();
Сч = 0;

В цикле:
Сч = Сч + 1;
Если Сч%500 = 0 Тогда  // Где 500 шаг, через который фиксируется транзакция. можно поиграть с этим параметром, для получения лучшей производительности.
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Послецикла:
ЗафиксироватьТранзакцию();
Основная теорема систематики: Новые системы плодят новые проблемы.