Имя: Пароль:
1C
1С v8
Не заполняется регистр сведений
0 Штурман
 
06.11.14
14:24
Имеем в наличии непериодический независимый регистр сведений

Заполняю его из ТЗ следующим кодом:


НаборЗаписей = РегистрыСведений.АвансыРаботникамОрганизаций.СоздатьНаборЗаписей();
        для каждого ц из тз цикл
            Физлицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ц.Сотрудник);
            НоваяЗапись = наборЗаписей.Добавить();
            НоваяЗапись.Организация = Организация;
            НоваяЗапись.Физлицо = Физлицо.Ссылка;
            НоваяЗапись.СуммаАванса = ц.Аванс;
        КонецЦикла;
        НаборЗаписей.Записать(Истина);


Все заполняется нормально, однако, если использовать следующий код:


НаборЗаписей = РегистрыСведений.АвансыРаботникамОрганизаций.СоздатьНаборЗаписей();
        для каждого ц из тз цикл
            Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду(Число(СокрЛП(ц.Код)));
            НоваяЗапись = наборЗаписей.Добавить();
            НоваяЗапись.Организация = Организация;
            НоваяЗапись.Физлицо = Физлицо.Ссылка;
            НоваяЗапись.СуммаАванса = ц.Аванс;
        КонецЦикла;
        НаборЗаписей.Записать(Истина);


То вылетает ошибка: "Запись не верна! Значение поля "Физическое лицо" не может быть пустым! ... "

Проверил ТЗ - там нет пустых полей в столбце кодов.

Что не так?
1 vicof
 
06.11.14
14:29
Код - это строка
2 Heckfy
 
06.11.14
14:31
Основное представление в виде наименования стоит.
Попробуй:
Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду(Число(СокрЛП(ц.Код))).Ссылка;
3 vicof
 
06.11.14
14:33
+(1)
Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду(СокрЛП(ц.Код));

НоваяЗапись.Физлицо = Физлицо;
4 vicof
 
06.11.14
14:34
(2) Борис, ты не прав! (с)
5 Enders
 
06.11.14
14:34
Потому что код физЛица - строка.
И в первом варианте

Физлицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ц.Сотрудник);
Вы ищите по строковому реквизиту и передаёте строку

А во втором

Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду(Число(СокрЛП(ц.Код)));

Вы ищите по строковому реквизиту, а передаёте число.


Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду(СокрЛП(ц.Код));
6 Heckfy
 
06.11.14
14:35
Ну да.
7 Штурман
 
06.11.14
15:14
Переписал

Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду(СокрЛП(ц.Код));
            НоваяЗапись = наборЗаписей.Добавить();
            НоваяЗапись.Организация = Организация;
            НоваяЗапись.Физлицо = Физлицо.Ссылка;

Регистр опять не заполняется, выдает туже самую ошибку, что в начале топика
8 hhhh
 
06.11.14
15:35
ц.Код какого типа? И почему нельзя

Физлицо = ц.ссылка;
            НоваяЗапись = наборЗаписей.Добавить();
            НоваяЗапись.Организация = Организация;
            НоваяЗапись.Физлицо = Физлицо;
9 Штурман
 
06.11.14
15:56
(8) обычного, строкового

ц.Ссылка - не выйдет, т.к. ТЗ состоит только из двух колонок: Код и Сумма

Хотя, думаю надо ТЗ переписать под квалификаторы, а не просто
тз.Колонки.Добавить("Код") ...
10 Krolik Bezobraznik
 
06.11.14
16:00
А вы уверены что у вас поиск по коду возвращает не пустое значение? =)

Добавте проверку

Если ФизЛицо.Пустая() Тогда
Сообщить("Фигня какая то");
Продолжить;
КонецЕсли;
11 Maxus43
 
06.11.14
16:01
а отбор у набора где вобще? потерялся?
12 Krolik Bezobraznik
 
06.11.14
16:02
Регистр независимый или какой?
13 Жан Пердежон
 
06.11.14
16:04
(0) семерошник шоле? что выведет этот код?

Сообщить(СокрЛП(100500));
14 Штурман
 
06.11.14
16:08
(10)  странно, возвращает как раз пустое знаение

Однако, если в регистр этим же кодом добавлять одно физлицо, то все спокойно добавляется
15 Штурман
 
06.11.14
16:10
(11)  а зачем отбор при простом добавлении записей?

(12) в начале темы же написал, что независимый
16 Krolik Bezobraznik
 
06.11.14
16:11
(14) Ну вот, разбирайтесь почему вам возвращает пустую ссылку. Код у справочника какого типа?
17 Krolik Bezobraznik
 
06.11.14
16:12
(14) Вот тут расшифруйте плиз "Однако, если в регистр этим же кодом добавлять одно физлицо, то все спокойно добавляется"
18 Maxus43
 
06.11.14
16:15
>>а зачем отбор при простом добавлении записей?
если юзаешь Набор - будь бодр наложить отбор, а то весь регистр будет перезаписывать/очищать и делать прочие гадости.
Если простые операции с одной записью - используй менеджер записи, а не набор
19 Штурман
 
06.11.14
16:28
(16)  Код у справочника строкового типа

(17)  Программно в одного спокойно добавляется, пример кода:

Рег = РегистрыСведений.АвансыРаботникамОрганизаций.СоздатьМенеджерЗаписи();
        Рег.Организация = Организация;
        Рег.Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду("1234");        
        Рег.СуммаАванса = Число("1000");
        Рег.Записать(Истина);

(18) у меня регистр как раз перед заполнением полностью очищается программным кодом
20 Жан Пердежон
 
06.11.14
16:31
>> Рег.СуммаАванса = Число("1000");

это многое объясняет
21 Maxus43
 
06.11.14
16:32
>>у меня регистр как раз перед заполнением полностью очищается программным кодом
без разницы, негоже использовать НаборЗаписей без Отбора, за это отдельная сковородка в аду готовится
22 Штурман
 
06.11.14
16:34
(21)  а поподроднее можно, что вы подразумеваете под отобором при заполнении регистра?
23 Maxus43
 
06.11.14
16:38
(22) делай как в (19), МенеджерЗаписи, а не набор записей как в (0).
НаборЗаписей используют для другого как правило
24 Штурман
 
06.11.14
16:41
(23)  т.е. менедженр записи в цикл выборки ТЗ поместить, а не как в (0), где набор записей перед циклом выборки?

в общем, буду пробовать )
25 Maxus43
 
06.11.14
16:42
(24) давай проще - Менеджер - для работы с одной записью, Набор - со множеством. У тебя работа с одной - ну и используй соответсвующие инструменты