Регистр сведений подчиненный регистратору

1. lordguard 37 06.04.22 18:00 Сейчас в теме
Не записывает наборЗаписей ?*

  РегистрТЦ=Документы.УстановкаЦенНоменклатуры.НайтиПоНомеру("РР-00000012",текущаядата());
	НаборЗаписей = РегистрыСведений.СебестоимостьНоменклатуры.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(РегистрТЦ); 
        НоваяЗапись = НаборЗаписей.Добавить();
					НоваяЗапись.Период = РегистрУС.Дата;
					НоваяЗапись.Регистратор =РегистрУС.Ссылка;
					НоваяЗапись.Магазин=Справочники.Магазины.НайтиПоНаименованию("КЕ");
					НоваяЗапись.Номенклатура=Резуль.Ссылка;
					НоваяЗапись.Активность=Истина;
					НоваяЗапись.Цена =ЦенаХ ;
  	                                НаборЗаписей.Записать(Истина);
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
25. VPanin56 535 07.04.22 09:35 Сейчас в теме +1 $m
Замени
сообщить("Ошибка записи в регистр");
На
Сообщить(ОписаниеОшибки());

или дополни, увидишь истинную причину ошибки
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. ishelper 06.04.22 18:46 Сейчас в теме
(1)
РегистрТЦ=Документы.УстановкаЦенНоменклатуры.НайтиПоНомеру("РР-00000012",текущаядата());
После поиска по номеру неплохо бы проверять его результат - найден документ или нет? Соответственно, дальше или добавлять набор записей, или нет.
6. lordguard 37 07.04.22 09:07 Сейчас в теме
(3)найден,я проверял по отладке
4. umev 07.04.22 00:02 Сейчас в теме
(1)
РегистрТЦ=Документы.УстановкаЦенНоменклатуры.НайтиПоНомеру("РР-00000012",текущаядата());
НаборЗаписей = РегистрыСведений.СебестоимостьНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(РегистрТЦ);

Документ УстановкаЦенНоменклатуры не является регистратором регистра СебестоимостьНоменклатуры
7. lordguard 37 07.04.22 09:08 Сейчас в теме
12. lordguard 37 07.04.22 09:22 Сейчас в теме
(7)
(4)Но все равно не записывает,проверил документ находит, в наборе есть записи
5. Ivanov_OM 38 07.04.22 06:31 Сейчас в теме
(1) После создания набора записей его нужно прочитать и очистить. Иначе ты попытаешься сделать второй подобный набор, а этого делать нельзя. Иесли ты хочешь всю номенклатуру в регистр добавить, то нуно это делать в цикле. Я не знаю как у тебя называется ТЧ документа, в примере я назвал ее "Товары"
РегистрТЦ=Документы.УстановкаЦенНоменклатуры.НайтиПоНомеру("РР-00000012",текущаядата());
    НаборЗаписей = РегистрыСведений.СебестоимостьНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(РегистрТЦ); 
    НаборЗаписей.Прочитать();
    НаборЗаписей.Записать();
    Для Каждого СтрокаТовара из РегистрТЦ.Товары Цикл              
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Период = РегистрУС.Дата;
        НоваяЗапись.Регистратор =РегистрУС.Ссылка;
        НоваяЗапись.Магазин=Справочники.Магазины.НайтиПоНаименованию("КЕ");
        НоваяЗапись.Номенклатура=Резуль.Ссылка;
        НоваяЗапись.Активность=Истина;
        НоваяЗапись.Цена =ЦенаХ ;
   КонецЦикла;
   НаборЗаписей.Записать(Истина);
Показать
13. lordguard 37 07.04.22 09:23 Сейчас в теме
(5)почистил, все равно не записывает
2. triviumfan 93 06.04.22 18:24 Сейчас в теме
Может, потому что ты устанавливаешь отбор по одному регистратору, а в наборе добавляешь запись по другому регистратору?
user1619761; lordguard; user1203706; +3 Ответить
9. lordguard 37 07.04.22 09:13 Сейчас в теме
(2)Да ,ты тоже это заметил , исправил,но все равно не записывает
8. VPanin56 535 07.04.22 09:10 Сейчас в теме
НаборЗаписей.Отбор.Регистратор.Установить(РегистрТЦ);
НоваяЗапись.Регистратор =РегистрУС.Ссылка;

Кто такой "РегистрУС.Ссылка" ?
10. lordguard 37 07.04.22 09:13 Сейчас в теме
(8)переменная с ссылкой к регистратору
11. VPanin56 535 07.04.22 09:15 Сейчас в теме
(10) РегистрТЦ и РегистрУС - Это не один и тот же объект.
14. lordguard 37 07.04.22 09:24 Сейчас в теме
(11)да ты прав, но обе переменные заполнены и содержать объект,расчет себестоимости, поменял, но все равно не записывет.Если надо могу скинуть полный код
15. nomad_irk 72 07.04.22 09:25 Сейчас в теме
(14)
НаборЗаписей.Записывать = Истина;

Тоже не помогает?
19. lordguard 37 07.04.22 09:27 Сейчас в теме
(15)перед записью или перед созданием, я так понял это очищение набора?
20. nomad_irk 72 07.04.22 09:28 Сейчас в теме
(19)После создания, перед записью.
21. lordguard 37 07.04.22 09:29 Сейчас в теме
(15)поставил перед записью набора, не сработало
16. umev 07.04.22 09:25 Сейчас в теме
18. lordguard 37 07.04.22 09:27 Сейчас в теме
22. lordguard 37 07.04.22 09:31 Сейчас в теме
(18)
i=0;
sum=0;//счтиваем общее количество созданных карточек
ФайлExcel="C:\Users\корт\Documents\себестоиомсть\yt10_TOS.xlsx"
ТЗ = ИзExcelВТаблицу(ФайлExcel,1,Истина);
РегистрУС=Документы.УстановкаСебестоимости.НайтиПоНомеру("РР-00000011",текущаядата());
НаборЗаписей2 = РегистрыСведений.СебестоимостьНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей2.Отбор.Регистратор.Установить(РегистрУС);
//Читаем регистр и добавляем колонку код
наборзаписей2.Прочитать();
ТаблН=наборзаписей2.Выгрузить(,"Номенклатура,Цена");
ТаблН.Колонки.Добавить("Код");
ДЛя каждого стрТ Из ТаблН Цикл
СтрТ.код=стрТ.Номенклатура.Код;
КонецЦикла;
//-к
//-первое определение для чтения ,второй для записи
РегистрТЦ=Документы.УстановкаСебестоимости.НайтиПоНомеру("РР-00000012",текущаядата());
НаборЗаписей = РегистрыСведений.СебестоимостьНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(РегистрТЦ);
//--чтобы регистр записался

НомерСтроки=Наборзаписей.Количество();
НаборЗаписей.записать();
Для Каждого Стр Из ТЗ Цикл //таблица копий
СебесН=ЧИсло(СтрЗаменить(Стр.Стоимость,Символы.НПП,""));
КодН=Строка(СтрЗаменить(Стр.код,Символы.НПП,""));
КолвоН=Число(Стр.Количество);
Пока СтрДлина(КодН)<11 Цикл
КодН="0"+КодН;
КонецЦикла;
//находим
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Родитель.Наименование КАК РодительНаименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Код = &Код
| И Номенклатура.Родитель.Наименование = &Наименование";

Запрос.УстановитьПараметр("Код", КодН);
Запрос.УстановитьПараметр("Наименование", "TS Ювелирные изделия");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Резуль=ВыборкаДетальныеЗаписи;// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
Если ЗначениеЗаполнено(Резуль) тогда //Если найдена номенклатура
НайдСтр=ТаблН.Найти(КодН);
ЦенаХ=Окр(СебесН/КолвоН,2);
Если ЗначениеЗаполнено(НайдСтр) тогда // находим интревал округления
РазличиеЦен=Макс(-(НайдСтр.Цена-ЦенаХ),НайдСтр.Цена-ЦенаХ); //модуль числа,чтоб всегда положительное
иначе
РазличиеЦен=ЦенаХ;
КонецЕсли;

Если РазличиеЦен>0.01 Тогда //если различие одна копейка , то оставляем старую цену
Если Не ЗначениеЗаполнено(НайдСтр) или НайдСтр.Цена<>(ЦенаХ) ТОгда

НоваяЗапись = НаборЗаписей.Добавить();

НоваяЗапись.Период = РегистрТЦ.Дата;// +(сч)так как врегистр не записываются одинаковые строки в одно время
НоваяЗапись.Регистратор =РегистрТЦ.Ссылка;
НоваяЗапись.Магазин=Справочники.Магазины.НайтиПоНаименованию("TOUS");
НоваяЗапись.Номенклатура=Резуль.Ссылка;
НоваяЗапись.Активность=Истина;
НоваяЗапись.Цена =ЦенаХ ;//ЦенаХ из ексел ут 10

Если Не ЗначениеЗаполнено(НайдСтр) ТОгда
Сообщить("Записано в регистр:"+Резуль.ссылка+" себестоимость:"+Строка(ЦенаХ));
иначе
Сообщить("Записано в регистр:"+Резуль.ссылка+" себестоимость:"+Строка(ЦенаХ)+" была себес:"+строка(НайдСтр.Цена));
КонецЕсли;
КонецЕсли;
КонецЕсли;
i=i+1;
КонецЕсли;
КонецЦикла;
Попытка
НаборЗаписей.Записать();
Исключение
сообщить("Ошибка записи в регистр");
КонецПопытки;
Показать
17. lordguard 37 07.04.22 09:26 Сейчас в теме
Сперва не правильно код вставил
27. SlavaKron 07.04.22 09:36 Сейчас в теме
(17) Возможно, дублируются записи по измерениям в самом наборе. Вы бы убрали Попытку / Исключение и показали реальный текст ошибки, вместо этого
Попытка
	НаборЗаписей.Записать();
Исключение
	сообщить("Ошибка записи в регистр");
КонецПопытки;
29. lordguard 37 07.04.22 09:39 Сейчас в теме
(27)ты прав, сейчас увидел что дублируются. На минуту раньше, тебе бы отправил за решение.А так тебя опередили.Спасибо большое день мучился
23. umev 07.04.22 09:31 Сейчас в теме
Жесть. Зачем так сложно.
24. lordguard 37 07.04.22 09:33 Сейчас в теме
(23)там я беру данные из файла ексель, сверяю с данными из регистра и не достающие или неправильные по цифрам данные записываю в регистр, а как можно проще это сделать?
26. lordguard 37 07.04.22 09:36 Сейчас в теме
(23)там еще в считанные данные добавляю колонку код, так как только этот реквизит уникальный в пределах номенклатуры
25. VPanin56 535 07.04.22 09:35 Сейчас в теме +1 $m
Замени
сообщить("Ошибка записи в регистр");
На
Сообщить(ОписаниеОшибки());

или дополни, увидишь истинную причину ошибки
28. lordguard 37 07.04.22 09:38 Сейчас в теме
(25)спасибо вставил.
Ошибка при вызове метода контекста (Записать): Запись с такими ключевыми полями существует! : СебестоимостьНоменклатуры: 01.01.2022 1:00:00, Расчет и установка себестоимости РР-00000012
30. user1203706 13 07.04.22 09:39 Сейчас в теме
(22) тебе же уже написали выше - ставишь отбор по одному регистратору, а в новую запись пихаешь другой регистратор, будет всегда ошибка - не соответствие отбору при записи такого набора.
32. lordguard 37 07.04.22 09:42 Сейчас в теме
(30)Да, я это поправил, но все равно была ошибка записи,оказалось двойная запись
31. user1203706 13 07.04.22 09:41 Сейчас в теме
НомерСтроки=Наборзаписей.Количество();
//НаборЗаписей.записать(); это выкинуть, для начала. Не надо очищать набор, это лишнее
33. lordguard 37 07.04.22 09:43 Сейчас в теме
(31)да ,понял.ошибка была в двойной записи
34. lordguard 37 07.04.22 09:44 Сейчас в теме
Спасибо всем большое, все помогли!!
35. umev 07.04.22 11:12 Сейчас в теме
Вот как-то так проще наверно
i=0;
sum=0;//счтиваем общее количество созданных карточек
ФайлExcel="C:\Users\корт\Documents\себестоиомсть\yt10_TOS.xlsx"
ТЗ = ИзExcelВТаблицу(ФайлExcel,1,Истина);

ТЗ.Колонки.Добавить("Код11",Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(11, ДопустимаяДлина.Фиксированная));
ТЗ.Колонки.Добавить("Себест",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой)));
ТЗ.Колонки.Добавить("Колво",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Любой)));

//Вот это по идее сразу нужно делать в ИзExcelВТаблицу 
Стр0="00000000000";
Для Каждого Стр Из ТЗ Цикл //таблица копий
	Стр.Себест=Число(СтрЗаменить(Стр.Стоимость,Символы.НПП,""));
	Стр.Колво=Число(Стр.Количество);
	КодН=СокрЛП(СтрЗаменить(Стр.код,Символы.НПП,""));
	Стр.Код11=Лев(Стр0,11-СтрДлина(КодН))+КодН;
КонецЦикла;

ТЗ.Колонки.Удалить("Стоимость");
ТЗ.Колонки.Удалить("Количество");
ТЗ.Колонки.Удалить("код");

РегистрУС=Документы.УстановкаСебестоимости.НайтиПоНомеру("РР-00000011",текущаядата());
РегистрТЦ=Документы.УстановкаСебестоимости.НайтиПоНомеру("РР-00000012",текущаядата());
Родитель=Справочники.Номенклатура.НайтиПоНаименованию("TS Ювелирные изделия",Истина);
Магазин=Справочники.Магазины.НайтиПоНаименованию("TOUS");
//Тут бы по уму проверку, что все это нашлось

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	ТЗ.Код11 КАК Код,
|	ТЗ.Себест КАК Себест,
|	ТЗ.Колво КАК Колво
|ПОМЕСТИТЬ ТЗ
|ИЗ &ТЗ КАК ТЗ
|;
|ВЫБРАТЬ
|	ISNULL(СпрНоменклатура.Ссылка,ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
|   ВЫРАЗИТЬ(ТЗ.Себест/ТЗ.Колво КАК (Число(15,2)) КАК НоваяЦена,
|   ВЫБОР
|		КОГДА СпрНоменклатура.Ссылка IS NULL ТОГДА 0
|	ИНАЧЕ ISNULL(СебестоимостьНоменклатурыСрезПоследних.Цена,0)
|	КОНЕЦ КАК Цена
|ИЗ ТЗ КАК ТЗ
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
|	ПО СпрНоменклатура.Код = ТЗ.Код,
|	И СпрНоменклатура.Родитель = &Родитель
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(, Регистратор = &Регистратор) КАК СебНомСрезПоследних
|	ПО СебНомСрезПоследних.Номенклатура = ISNULL(СпрНоменклатура.Ссылка,ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)	
|";

Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.УстановитьПараметр("РегистрУС", РегистрУС);
Запрос.УстановитьПараметр("Родитель",Родитель);
Выборка = Запрос.Выполнить().Выбрать();

НаборЗаписей = РегистрыСведений.СебестоимостьНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(РегистрТЦ);

Пока Выборка.Следующий() Цикл
	
	Если ЗначениеЗаполнено(Выборка.Номенклатура) Тогда
		
		Если Выборка.Цена=0 ИЛИ Макс(Выборка.Цена-Выборка.НоваяЦена,Выборка.НоваяЦена-Выборка.Цена)>0.01 Тогда
			
			НоваяЗапись = НаборЗаписей.Добавить();
			
			НоваяЗапись.Период = РегистрТЦ.Дата;// +(сч)так как врегистр не записываются одинаковые строки в одно время
			НоваяЗапись.Регистратор =РегистрТЦ;
			НоваяЗапись.Магазин=Магазин;
			НоваяЗапись.Номенклатура=Выборка.Номенклатура;
			НоваяЗапись.Активность=Истина;
			НоваяЗапись.Цена =Выборка.НоваяЦена ;//ЦенаХ из ексел ут 10
			
			Если Не Выборка.Цена=0 ТОгда
				Сообщить("Записано в регистр:"+Выборка.Номенклатура+" себестоимость:"+Выборка.НоваяЦена);
			иначе
				Сообщить("Записано в регистр:"+Выборка.Номенклатура+" себестоимость:"+Выборка.НоваяЦена+" была себес:"+Выборка.Цена);
			КонецЕсли;
			
			i=i+1;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецЦикла;

Попытка
	НаборЗаписей.Записать();
Исключение
	сообщить("Ошибка записи в регистр");
КонецПопытки;
Показать
36. lordguard 37 07.04.22 16:26 Сейчас в теме
(35)спасибо, там просто еще дописок много будет
Оставьте свое сообщение

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