1С Регистр Сведений

1. _7445_ 06.03.19 12:23 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. В УТ 10.3. Документ поступление товаров услуг делает движение в регистр сведений цены номенклатуры. Периодичность регистра в пределах дня. Значить товар может делать движению только один раз в день. Но есть токая задача. Пример : В первым документа поступление я указал товар (Клавиатура 002) и движения было. А в втором документа я уже указал два товар один из них Клавиатура 002 а другой Экран. Когда пользователь нажмёт кнопку ОК, как надо появляется сообщение запись с такими ключевыми полями существует. Задача в том что код проста сделал движению только для товара Экран.
Написал код в процедуру Обработка проведение. Но бывают ошибки. Можете дать советы что как решить эту задачу.
Спасибо всем за ранее.
ТипЦенаПродажи = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000002");
		
	Для Каждого ТекСтрокаТовары Из Товары Цикл
			Если ТекСтрокаТовары.ЦенаПродажи = 0 Тогда
				Продолжить;
			КонецЕсли;Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|ЦеныНоменклатуры.Период,
		|ЦеныНоменклатуры.Регистратор,
		|ЦеныНоменклатуры.ТипЦен,
		|ЦеныНоменклатуры.Номенклатура,
		|ЦеныНоменклатуры.Цена
		|ИЗ
		|РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		|ГДЕ 
		|ЦеныНоменклатуры.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг И 
		|ЦеныНоменклатуры.ТипЦен = &ТипЦен И 
		|ЦеныНоменклатуры.Период = &Дата И 
		|ЦеныНоменклатуры.Номенклатура = &Номенклатура";
		Запрос.УстановитьПараметр("Дата", Дата);
		Запрос.УстановитьПараметр("ТипЦен", ТипЦенаПродажи);
		Запрос.УстановитьПараметр("Номенклатура", ТекСтрокаТовары.Номенклатура);
			Выборка = Запрос.Выполнить().Выбрать();
			Если ПустаяСтрока(Выборка.Номенклатура) Тогда
			Движение = Движения.ЦеныНоменклатуры.Добавить();
			Движение.Период = Дата;
			Движение.ТипЦен = ТипЦенаПродажи;
	     	Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
			Движение.Валюта = ТипЦенаПродажи.ВалютаЦены;
			Движение.Цена = ТекСтрокаТовары.ЦенаПродажи;
			Движение.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
		КонецЕсли;
	КонецЦикла;    
Показать

Срез последних тоже использовал но не работал.
По теме из базы знаний
Найденные решения
9. dhurricane 06.03.19 12:50 Сейчас в теме
(8) А, ну конечно же... :)

Замените
Если ПустаяСтрока(Выборка.Номенклатура) Тогда

на
Если Не Выборка.Следующий() Тогда
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. dhurricane 06.03.19 12:35 Сейчас в теме
(1) Раз у Вас периодичность "День", то и отбор по периоду должен быть соответствующий - кратный дню.
Замените
Запрос.УстановитьПараметр("Дата", Дата);

на
Запрос.УстановитьПараметр("Дата", НачалоДня(Дата));
SedovSU@mail.ru; _7445_; +2 Ответить
5. _7445_ 06.03.19 12:39 Сейчас в теме
(3)Спасибо за вниманию.
Но по-моему я код писал не в правильным месте. Ошибка появляется.
6. dhurricane 06.03.19 12:43 Сейчас в теме
(5) Попробуйте еще убрать условие по регистратору из запроса.
8. _7445_ 06.03.19 12:49 Сейчас в теме
(6)
ТипЦенаПродажи = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000002");
		
	Для Каждого ТекСтрокаТовары Из Товары Цикл
			Если ТекСтрокаТовары.ЦенаПродажи = 0 Тогда
				Продолжить;
			КонецЕсли;Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|ЦеныНоменклатуры.Период,
		|ЦеныНоменклатуры.Регистратор,
		|ЦеныНоменклатуры.ТипЦен,
		|ЦеныНоменклатуры.Номенклатура,
		|ЦеныНоменклатуры.Цена
		|ИЗ
		|РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		|ГДЕ  
		|ЦеныНоменклатуры.ТипЦен = &ТипЦен И 
		|ЦеныНоменклатуры.Период = &Дата И 
		|ЦеныНоменклатуры.Номенклатура = &Номенклатура";
		Запрос.УстановитьПараметр("Дата", НачалоДня(Дата));
		Запрос.УстановитьПараметр("ТипЦен", ТипЦенаПродажи);
		Запрос.УстановитьПараметр("Номенклатура", ТекСтрокаТовары.Номенклатура);
			Выборка = Запрос.Выполнить().Выбрать();
			Если ПустаяСтрока(Выборка.Номенклатура) Тогда
			Движение = Движения.ЦеныНоменклатуры.Добавить();
			Движение.Период = Дата;
			Движение.ТипЦен = ТипЦенаПродажи;
	     	Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
			Движение.Валюта = ТипЦенаПродажи.ВалютаЦены;
			Движение.Цена = ТекСтрокаТовары.ЦенаПродажи;
			Движение.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
		КонецЕсли;
	КонецЦикла;
	КонецЕсли;
Показать

Может это не надо делать в процедуре обработка проведение
Прикрепленные файлы:
9. dhurricane 06.03.19 12:50 Сейчас в теме
(8) А, ну конечно же... :)

Замените
Если ПустаяСтрока(Выборка.Номенклатура) Тогда

на
Если Не Выборка.Следующий() Тогда
11. _7445_ 06.03.19 12:59 Сейчас в теме
(9)
Спасибо вам большое.
Почему не работал с этим кодом?
Если ПустаяСтрока(Выборка.Номенклатура) Тогда

Запрос будить возвращать пустой или заполненный строка. Ну там и есть оператор условию.
12. dhurricane 06.03.19 13:00 Сейчас в теме
(11) Потому что Вы выбрали данные запросом, но не попытались спозиционироваться на первой строке результата.
7. RocKeR_13 1413 06.03.19 12:48 Сейчас в теме
(1) Зачем вам делать у цен номенклатуры еще один регистратор? Проще делать по следующему алгоритму:
1) при проведении первого за день поступления товаров создаем документ установки цен номенклатуры и заполняем его всеми товарами из поступления
2) при проведении следующих документов поступлений получаем ранее созданный документ установки цен и дополняем его новыми строками или изменяем цены у существующих
YannikAlx; +1 Ответить
10. _7445_ 06.03.19 12:50 Сейчас в теме
(7)
Вот именно как сделать второй вариант
13. RocKeR_13 1413 06.03.19 13:04 Сейчас в теме
(10) примерно так:
Установка = НайтиДокументУстановкциЦен();
УстановкаЦен = Установка.ПолучитьОбъект();
Для Каждого Строка Из СсылкаНаПоступление.Товары Цикл
        ПараметрыОтбора = Новый Структура("ИменаИзмерений");
        //<ЗаполняемПараметрыОтбора>
        СтрокиУстановки = УстановкаЦен.Товары.НайтиСтроки(ПараметрыОтбора);
        Если СтрокиУстановки.Количество() = 0 Тогда
                //<такой строки нет, добавляем новую>
               ТекущаяСтрока = УстановкаЦен .Товары.Добавить();
               //<заполняем данные новой строки установки цен>
        Иначе
                ТекущаяСтрока = СтрокиУстановки[0];
        КонецЕсли;
         //<при необходимости в строке меняем цену на цену из поступления>
КонецЦикла;
УстановкаЦен.Записать(РежимЗаписиДокумента.Проведение);
Показать


где НайтиДокументУстановкциЦен() - функция, которая возвращает ссылку на документ установки цен
ИменаИзмерений - строка измерений регистра "Цены номенклатуры" через запятую, например "ВидЦены, Номенклатура, Характеристика"
<ЗаполняемПараметрыОтбора> - выполняем заполнение структуры по данным строки поступления товаров
2. VictorRGB2 14 06.03.19 12:32 Сейчас в теме
запись с такими ключевыми полями существует - именно это и означает, что в пределах периодичности уже есть запись с теми же самыми значениями ключевых полей

варианта 2
1. изменить периодичность регистра
2. изменить состав ключевых полей регистра
4. _7445_ 06.03.19 12:36 Сейчас в теме
(2)
Первый вариант не надо. Второй вариант можете подробнее? Это что надо сделать в самом регистре?
С кодом можно решать проблему?
14. YannikAlx 28 06.03.19 13:06 Сейчас в теме
Подход на мой взгляд неверный в той части , что в Регистр Сведений нужно всегда делать записи последним документом.
То есть утром поступил товар по 10 а вечером по 15 но по вашей схеме цена на следующий день останется 10, хотя последняя была 15 ...

Думайте что не так...
Оставьте свое сообщение

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