Программное заполнение непериодического независимого регистра сведений в 1С:ЗУП 3.0

1. Olga_NN 18.10.16 10:36 Сейчас в теме
При программном заполнении на второй строке возникает ошибка:
Форма.Форма.Форма(569)}:
Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать(); по причине: Запись не верна! Значение поля не соответствует установленному отбору: НаградыФизическихЛиц: Иванов Иван Иванович, 1 (Регистр сведений: Награды; Поле: НомерПоПорядку)

Программный код:

//***Загрузка наград********************************************
&НаКлиенте
Процедура ЗагрузитьНаградыФизЛиц(Команда)
	ОчисткаНаградФизЛиц_НаСервере();	
	Файл = "D:\Выгрузка_справ_из_2.5\NAGRAD.DBF";
	БД = Новый XBase(Файл);
	БД.Кодировка = КодировкаXBase.OEM;
	БД.ВНачале();
	Для i=1 по БД.КоличествоЗаписей() Цикл
		ТабНомер = СокрЛП(БД.KOD);
		Награда = СокрЛП(БД.NAGRADA);
		НомерПП = Число(БД.NOM_STR);
		НомерПриказа = Строка(БД.NOM_PRIK);
		ДатаПриказа = БД.DATA_PRIK;
		ЧейПриказ = Строка(БД.CHEI_PRIK);
		ЗагрузитьНаградыФизЛиц_НаСервере(ТабНомер, Награда, НомерПП, НомерПриказа, ДатаПриказа, ЧейПриказ);
		БД.Следующая();	
	КонецЦикла;	
	БД.ЗакрытьФайл();
	Сообщить("Награды сотрудников загружены успешно!");
КонецПроцедуры

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

&НаСервере
Процедура ЗагрузитьНаградыФизЛиц_НаСервере(ТабНомер, Награда, НомерПП, НомерПриказа, ДатаПриказа, ЧейПриказ);
	Сотрудник = Справочники.ФизическиеЛица.НайтиПоКоду(ТабНомер);
	Если НЕ Сотрудник.Пустая() Тогда
		НаборЗаписей = РегистрыСведений.НаградыФизическихЛиц.СоздатьНаборЗаписей(); 
		НаборЗаписей.Отбор.ФизическоеЛицо.Установить(Сотрудник);
		НаборЗаписей.Отбор.НомерПоПорядку.Установить(НомерПП); 
		НоваяЗапись = НаборЗаписей.Добавить();
		НоваяЗапись.ФизическоеЛицо = Сотрудник;
		НоваяЗапись.НомерПоПорядку = НомерПП;
		НоваяЗапись.Награда = Справочники.Награды.НайтиПоНаименованию(Награда);
		НоваяЗапись.ДатаПриказа = ДатаПриказа;
		НоваяЗапись.НаименованиеПриказа = ЧейПриказ;
		НоваяЗапись.НомерПриказа = НомерПриказа;
		НаборЗаписей.Записать();
	КонецЕсли;	
КонецПроцедуры
//**************************************************************
Показать



В чем ошибка? Спасибо!
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spe1c 5 18.10.16 11:39 Сейчас в теме
В чем ошибка?

В том что вы пытаетесь менять значение поля, по которому установили отбор. Посмотрите в отладчике чему равна переменная НомерПП.
romulanin; +1 Ответить
4. romulanin 16.02.21 16:31 Сейчас в теме
(2)
В том что вы пытаетесь менять значение поля, по которому установили отбор. Посмотрите в отладчике чему равна переменная НомерПП.


Долго искал информацию, по неопытности, но ваш ответ помог. Везде пишут удаляй старую старую запись и делай новую.
3. spe1c 5 18.10.16 11:47 Сейчас в теме
Вообще вся проблема в том что у вас криво организована загрузка.
На мой взгляд неправильно:
1) Отдельный серверный вызов на очистку регистра
2) Вызов сервера с клиента в цикле (!).
3) Зачем-то передаете контекст формы на сервер при каждом вызове.

Кроме того, некрасиво передавать 6 параметров в процедуру, ухудшается читаемость кода, хотя это уже дело вкуса.

Не претендую на окончательную правоту, но мне кажется, здесь все можно выполнить за один внеконтекстный серверный вызов.
Загоните на клиенте содержимое файла в какой-нибудь контейнер, например в массив структур, передайте на сервер и там обработайте.
И тогда отбор по этому полю ставить и ненужно будет.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот