Имя: Пароль:
1C
 
Заполнение данных ТЧ
0 Вадим_1c
 
10.01.24
11:47
Нумератор = 0;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПередачаТоваров.ВидОперации КАК ВидОперации,
        |    ПередачаТоваров.Ссылка КАК Ссылка,
        |    ПередачаТоваровТовары.Цена КАК Цена,
        |    ПередачаТоваровТовары.Номенклатура КАК Номенклатура
        |ИЗ
        |    Документ.ПередачаТоваров.Товары КАК ПередачаТоваровТовары
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПередачаТоваров КАК ПередачаТоваров
        |        ПО ПередачаТоваровТовары.Ссылка = ПередачаТоваров.Ссылка
        |ГДЕ
        |    ПередачаТоваров.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПередачаТоваров.БезвозмезднаяПередача)
        |    И ПередачаТоваров.Товары.Цена = 1
        |    И ПередачаТоваров.ПометкаУдаления = ЛОЖЬ";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
        
        Для каждого Строка Из ДокументОбъект.Товары Цикл
            
            Запрос2 = Новый Запрос;
            Запрос2.Текст =
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
            |ИЗ
            |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
            |ГДЕ
            |    ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура";
            
            Запрос2.УстановитьПараметр("Номенклатура", ВыборкаДетальныеЗаписи.Номенклатура);
            
            РезультатЗапроса2 = Запрос2.Выполнить();
            
            ВыборкаДетальныеЗаписи2 = РезультатЗапроса2.Выбрать();
            
            Нумератор = Нумератор + 1;
            
            Пока ВыборкаДетальныеЗаписи2.Следующий() Цикл
                
                Строка.Цена = ВыборкаДетальныеЗаписи2.Цена;
                
                ПолеВывода = ПолеВывода + "" + Нумератор + ")  " + Строка.Цена + Символы.ПС;
                
            КонецЦикла;
                        
        КонецЦикла;
        
        ДокументОбъект.Записать();
        
    КонецЦикла;                      
    
    Сообщить("Заполнение завершено");


Суть в том, что заполняется Цена в ТЧ Товары, но если в ТЧ больше одной строки, то при заполнении все цены во всех, условно трех строчках заполняются по последней.
Как сделать, чтобы задействовалась только одна строчка и не всегда первая, а по порядку?
1 АгентБезопасной Нацио
 
10.01.24
11:49
(0) "Миста - лучший отладчик"©?
2 Tarlich
 
10.01.24
11:52
а в один запрос соединить .... ну или использовать Ценобразование.ПолучитьЦенуНоменклатуры(ВыборкаДетальныеЗаписи.Номенклатура)
РегистрСведений.ЦеныНоменклатуры - не задан тип цены
если у вас 40 типов цен ?
3 Волшебник
 
10.01.24
11:53
ого, запрос во вложенном цикле! да ещё СрезПоследних без параметров...
ЧатГПТ опять нахуячил кода, которого не понимает
4 Вадим_1c
 
10.01.24
11:54
(3) это не гпт
5 Волшебник
 
10.01.24
11:57
(4) Ну тогда всё ещё хуже, чем мы думали...
6 Beduin
 
10.01.24
12:00
Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
    |    ПередачаТоваров.Ссылка.ВидОперации КАК ВидОперации,
    |    ПередачаТоваров.Ссылка КАК Ссылка,
    |    ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаРегистра,
    |    ПередачаТоваровТовары.Цена КАК Цена,
    |    ПередачаТоваровТовары.Номенклатура КАК Номенклатура
    |ИЗ
    |    Документ.ПередачаТоваров.Товары КАК ПередачаТоваровТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |        ПО ПередачаТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
    |ГДЕ
    |    ПередачаТоваров.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПередачаТоваров.БезвозмезднаяПередача)
    |    И ПередачаТоваровТовары.Цена = 1
    |    И ПередачаТоваров.Ссылка.ПометкаУдаления = ЛОЖЬ";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
        
        Для каждого Строка Из ДокументОбъект.Товары Цикл
            Если Строка.Цена <> 1 Тогда Продолжить КонецЕсли;
            
            Строка.Цена = ВыборкаДетальныеЗаписи.ЦенаРегистра;
            
            ПолеВывода = ПолеВывода + "" + Нумератор + ")  " + Строка.Цена + Символы.ПС;
            
        КонецЦикла;
        
        ДокументОбъект.Записать();
        
    КонецЦикла;
7 mkalimulin
 
10.01.24
12:01
(0) Суть в том, что вы выбираете все строчки из всех документов по заданному вами критерию, а потом для каждой строчки вы выбираете... все строчки из документа, к которому относится эта строчка.
Исправьте первый запрос и дальше уже вам будет легче избегать ошибок
8 Tarlich
 
10.01.24
12:04
(0) вам необходимо во всех сроках в документе ПередачаТоваров которые не помеченные на уд и имеют нужный вид оперрации где у товара цена = 1 поменять цену на необходимую ?
9 Вадим_1c
 
10.01.24
12:10
(8) да
10 Tarlich
 
10.01.24
12:12
выб = Документы.ПередачаТоваров.Выбрать()
Пока выб.следующий цикл
Если выб.пометкаУдаления тогда продолжить; конецЕсли;
Если выб.ВидОперации <> Перечисление.ВидыОперацийПередачаТоваров.БезвозмезднаяПередача тогда продолжить;
Надозаписать = ложь;
док = Выб.ПолучитьОбъект()
для каждого стр из док.товары цикл
Если стр.цена = 1 тогда
стр.Цена = ПолучитьЖелаемуюЦену(стр.Гоменклатура);
Надозаписать  = истина;
КонецЕсли;
КонецЦикла;
Если надозаписать тогда
Док.Записать(РежимЗаписиДокумента.Проведение);
надозаписать = ложь;
КонецЕсли;
способ дедовский но рабочий !!!
Е


Конеццикла;


Конеццикла ;
11 Tarlich
 
10.01.24
12:14
не много ошибся - но надеюсь суть понятна
12 Волшебник
 
10.01.24
12:36
(10) Где лесенка?
13 Вадим_1c
 
10.01.24
12:50
(6) Ругается на соединение, что-то со связями.
И вот прерывание если не 1, а если там три строчки и везде 1, тогда условие не работает и заполняется по последнему
14 Tarlich
 
10.01.24
13:04
(12)
Процедура ОбработаемКакНадо()
	выб = Документы.ПередачаТоваров.Выбрать(с, по);
	Пока выб.следующий() цикл
		Если выб.пометкаУдаления тогда 
			продолжить; 
		конецЕсли;
		Если выб.ВидОперации <> Перечисления.ВидыОперацийПередачаТоваров.БезвозмезднаяПередача тогда 
			продолжить; 
		КонецЕсли;	
		НадоЗаписать = ложь;
		док = Выб.ПолучитьОбъект();
		для каждого стр из док.товары цикл
			Если стр.цена = 1 тогда
				стр.Цена = ПолучитьЖелаемуюЦену(стр.Номенклатура);
				НадоЗаписать = истина;
			КонецЕсли;
		КонецЦикла;
		Если НадоЗаписать тогда
			Док.Записать(РежимЗаписиДокумента.Запись); //если надо, то проводим: РежимЗаписиДокумента.Проведение
		КонецЕсли; 
	КонецЦикла;	
КонецПроцедуры	

Функция ПолучитьЖелаемуюЦену(товар)	
	ТипЦены = справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("НашаЦена");	
	Возврат  Ценообразование.ПолучитьЦенуНоменклатуры(товар,ТипЦены,текущаяДата());	
КонецФункции
15 Tarlich
 
10.01.24
13:01
(12) ну я же naïve -))
16 Волшебник
 
10.01.24
13:13
(15) Будьте внимательнее. Не ведите себя как бот.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший