Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
01 июл 2024, 11:10

1C 8.3. Регистр сведений СрезПоследних каждый раз меняется местами при записи реквизита

Автор gulnyr, 17 июл 2023, 10:55

0 Пользователей и 1 гость просматривают эту тему.

gulnyr

Код:
Запрос = Новый Запрос();

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

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

Пока ВыполнитьВыбрать.Следующий() Цикл

ДанныеСтрокиСсылка = ВыполнитьВыбрать.СсылкаНомен; 

Если       
Формат(ДанныеСтрокиСсылка.Цены,"ЧЦ=15; ЧДЦ=3") <> Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=3")
Тогда
ДанныеСтрокиОбъект = ДанныеСтрокиСсылка.ПолучитьОбъект();
ДанныеСтрокиОбъект.Цены = Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=3"); //Цены
ДанныеСтрокиОбъект.Записать();
КонецЕсли; //Если запись регистра сведении отличается от значении реквизита Цены, то будет записать (или перезаписать) значение реквизита

КонецЦикла;

Этот код мы ставим в процедуру при открытии (в номенклатуре). Каждый раз, когда мы открываем номенклатуру, то значение реквизита перезаписывается меняя местами.

Новый точечный рисунок.png

Новый точечный рисунок (2).png 

Максим75

gulnyr, так у Вас в регистре сведений похоже есть несколько цен по этому товару. всякий раз Вы в реквизит в товаре пишите цену из регистра сведений, потом при открытии получаете уже новую записанную цену в карточку товара и отличную от нее цену в регистре сведений. и так каждый раз.

gulnyr

Максим75, Да, цен несколько.
Данный реквизит дополнительный (для номенклатуры). И наша задача была добавить в этот дополнительный реквизит последнюю цену от регистра сведении Цена (срез последних).
Непонятно, как здесь может меняться цена в регистре сведении срез последних, если мы его никак не меняем, а только присваиваем и записываем в реквизит номенклатуры Цены. Не во всех товарах так

Afinogen

 :dfbsdfbsdf: а зачем вообще цены хранить в элементе справочника?

если все это только потмоу что надо при открытии элемента видеть его  актуальную цену так что  мешает на форму элемента поместить поле с типом набор записей?

Максим75


Afinogen

эт точно)))
но  сдр. стороны сейчас привыкнут так конструировать, потом фиг  отучишь)

gulnyr

Получается так:
Запрос = Новый Запрос();

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


Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦен.ОсновнойТипЦенПродажи);
Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Краска BC... Challenger BC"));

ВыполнитьВыбрать = Запрос.Выполнить().Выбрать();

Пока ВыполнитьВыбрать.Следующий() Цикл

ДанныеСтрокиСсылка = ВыполнитьВыбрать.СсылкаНомен; 

Если       
Формат(ДанныеСтрокиСсылка.Цены,"ЧЦ=15; ЧДЦ=2") <> Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=2")
Тогда
ДанныеСтрокиОбъект = ДанныеСтрокиСсылка.ПолучитьОбъект();

Сообщить(ДанныеСтрокиОбъект.Цены); //регистр 4000
Сообщить(ВыполнитьВыбрать.Цена);   //реквизит  5400

ДанныеСтрокиОбъект.Цены = Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=2"); //подставляется в реквизит значение регистра   

ДанныеСтрокиОбъект.Записать(); //записывается 

Сообщить(ДанныеСтрокиОбъект.Цены); //регистр  5400
Сообщить(ВыполнитьВыбрать.Цена);   //реквизит 5400

КонецЕсли;

КонецЦикла;

Вроде бы все логично! Но, если вызвать данный код еще раз, то получится так:

Запрос = Новый Запрос();

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


Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦен.ОсновнойТипЦенПродажи);
Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Краска BC... Challenger BC"));

ВыполнитьВыбрать = Запрос.Выполнить().Выбрать();

Пока ВыполнитьВыбрать.Следующий() Цикл

ДанныеСтрокиСсылка = ВыполнитьВыбрать.СсылкаНомен; 

Если       
Формат(ДанныеСтрокиСсылка.Цены,"ЧЦ=15; ЧДЦ=2") <> Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=2")
Тогда
ДанныеСтрокиОбъект = ДанныеСтрокиСсылка.ПолучитьОбъект();

Сообщить(ДанныеСтрокиОбъект.Цены); //регистр 5400
Сообщить(ВыполнитьВыбрать.Цена);   //реквизит  4000

ДанныеСтрокиОбъект.Цены = Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=2"); //подставляется в реквизит значение регистра   

ДанныеСтрокиОбъект.Записать(); //записывается 

Сообщить(ДанныеСтрокиОбъект.Цены); //регистр  4000
Сообщить(ВыполнитьВыбрать.Цена);   //реквизит 4000

КонецЕсли;

КонецЦикла;

Что здесь происходит? Почему меняется значение срез последних, если мы не меняем значение регистра?

gulnyr

Метод: ДанныеСтрокиОбъект.Записать(); меняет значение срезпоследних. Как будто срез последних становится срез первых :dfbsdfbsdf: Почему так? Как сделать правильно?

Максим75

gulnyr, я Вам выделил, посмотрите.

ДанныеСтрокиСсылка = ВыполнитьВыбрать.СсылкаНомен;  - это ссылка на справочник.
   
    Если       
        Формат(ДанныеСтрокиСсылка.Цены,"ЧЦ=15; ЧДЦ=2") <> Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=2")
        Тогда
        ДанныеСтрокиОбъект = ДанныеСтрокиСсылка.ПолучитьОбъект();  -  это получаете объект Справочник.
       
        Сообщить(ДанныеСтрокиОбъект.Цены); //регистр 5400
        Сообщить(ВыполнитьВыбрать.Цена);   //реквизит  4000

        ДанныеСтрокиОбъект.Цены = Формат(ВыполнитьВыбрать.Цена,"ЧЦ=15; ЧДЦ=2"); //подставляется в реквизит значение регистра   

        ДанныеСтрокиОбъект.Записать(); //записывается    -  а это записывается объект Справочник
       
        Сообщить(ДанныеСтрокиОбъект.Цены); //регистр  4000  -  и здесь уже читаете записанный объект Справочник.
        Сообщить(ВыполнитьВыбрать.Цена);   //реквизит 4000

gulnyr

Максим75, это я понял. Вопрос был в том, почему у виртуального регистра сведения срезпоследних меняется цена при каждом вызове данного кода.
В этом коде значение регистра сведения срезпоследних например 4000, а при следующем вызове этого же кода становится 5400, затем опять 4000 и опять 5400. И так бесконечно. Мы же здесь не трогаем регистр, а только справочник

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск