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) Раз у Вас периодичность "День", то и отбор по периоду должен быть соответствующий - кратный дню.
Замените
Запрос.УстановитьПараметр("Дата", Дата);

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


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

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

Думайте что не так...
Для отправки сообщения требуется регистрация/авторизация

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