Вход | Регистрация


1С:Предприятие ::

Метки: 

Проблемы с регистром сведений "Цены номенклатуры".

Я
   bplmeddy
 
22.08.18 - 10:54
Добрый день. При получении записи о цене товара из регистра сведений "Цены номенклатуры" (Режим записи: независимый, Переодичность: в пределах дня) получаю почему то последнюю цену на ранний период чем текущая дата.

Например:
Вчера установлена цена 100, сегодня установили 200, после чего при попытке получить последнюю цену, возвращается почему-то 100 а не 200. Подскажите пожалуйста, в чем может быть загвоздка ? Буду очень благодарен за помощь.

ПЫ.СЫ. Заказчик говорит что возможно причина в том что регистр сделали "кэшевый", но что это за зверь - не в курсе, в интернете информации по данному типу не нашёл.
 
 
   yzimin
 
1 - 22.08.18 - 10:56
Граница, ВидГраницы.Включая?
   Casey1984
 
2 - 22.08.18 - 10:56
Регистр сделали "кэшевый", но что это за зверь я тоже не знаю)

При получении записи о цене товара из регистра сведений "Цены номенклатуры" - а как получаешь? А записи то в списке регистра есть?
   bplmeddy
 
3 - 22.08.18 - 10:57
(2) Записи добавляються.
Пробовал получать как запросом (СрезПоследних, так и через отбор по структуре и ПолучитьПоследнее() )
   Casey1984
 
4 - 22.08.18 - 10:59
Нужен пример)
   bplmeddy
 
5 - 22.08.18 - 10:59
(1) Об этом не подумал, сейчас попробую.
   bplmeddy
 
6 - 22.08.18 - 11:01
(4)
Запрос.Текст = "ВЫБРАТЬ
                           |    ВЫБОР
                           |        КОГДА ЗапасыОстатки.КоличествоОстаток = 0
                           |            ТОГДА ЗапасыОстатки.СуммаОстаток
                           |        ИНАЧЕ ЗапасыОстатки.СуммаОстаток / ЗапасыОстатки.КоличествоОстаток
                           |    КОНЕЦ КАК Себестоимость
                           |ИЗ
                           |    РегистрНакопления.Запасы.Остатки(&ТекДата, Номенклатура = &Номен) КАК ЗапасыОстатки
                           |;
                           |
                           ////////////////////////////////////////////////////////////////////////////////

                           |ВЫБРАТЬ
                           |    ЦеныНоменклатурыСрезПоследних.Цена
                           |ИЗ
                           |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                           |            &ТекДата,
                           |            ВидЦен = &ВидЦены
                           |                И Номенклатура = &Номен) КАК ЦеныНоменклатурыСрезПоследних";
            Запрос.УстановитьПараметр("ТекДата",КонецДня(ТекущаяДата()));
            Запрос.УстановитьПараметр("Номен",Номен);
            Запрос.УстановитьПараметр("ВидЦены",ТипЦены);
   bplmeddy
 
7 - 22.08.18 - 11:06
(1) (5) Так тоже не помогло:
Запрос.УстановитьПараметр("ТекДата",Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая));
   Buster007
 
8 - 22.08.18 - 11:10
ищи проблемы в установке параметров
   unregistered
 
9 - 22.08.18 - 11:11
(0) > регистр сделали "кэшевый"

Нет такого. Или ты не верно понял заказчика, или он что-то другое имел ввиду.

Если подразумевали, что для регистра была включена галка "Разрешить итоги срез последних" (и/или срез первых), то для случая получения данных среза с указанием конкретного значения параметра "Период", таблицы итогов не используются (хранятся только самые последние/первые срезы). Но можете на всякий случай пересчитать итоги по регистру.
   bplmeddy
 
10 - 22.08.18 - 11:13
(8) Параметры устанавливаются корректно.
 
 Рекламное место пустует
   bplmeddy
 
11 - 22.08.18 - 11:13
(9) Цитирую заказчика: "Там кэшевый регистр с ценами делали. Может в нем проблема..."
   Cyberhawk
 
12 - 22.08.18 - 11:14
С заказчиком и разбирайся. Смысл ты сюда пришел со своими цитатами?
   unregistered
 
13 - 22.08.18 - 11:15
(11) > " кэшевый регистр"

Таких регистров в платформе 1С не существует. Надеюсь, ты это знаешь ;)
   yzimin
 
14 - 22.08.18 - 11:15
(6) Откуда вызывается этот код? Из какого именно модуля?
А если в консоли запросов?
   bplmeddy
 
15 - 22.08.18 - 11:16
(13) Знаю, но мало ли, вдруг это не лыжи не едут, а я просто идиот )
   bplmeddy
 
16 - 22.08.18 - 11:17
(12) А грубить то зачем? Мне кажется что форум создан для помощи и советов ? Если лично Вам не интересно - Вас никто не заставляет читать и тем более отвечать в данной ветке.
   unregistered
 
17 - 22.08.18 - 11:17
(10) > Параметры устанавливаются корректно

Значит данные некорректные или не там смотришь.

В противном случае придется вызывать батюшку, чтобы серверную осветил.
   bplmeddy
 
18 - 22.08.18 - 11:18
(14) Из менеджера записей регистра сведений. В процедуре "ПередЗаписью".
   unregistered
 
19 - 22.08.18 - 11:20
(16) По сути в (12) верно сказано. Если заказчик какую-то муть несёт, то лучше для начала у него уточнить - что именно он имел ввиду, а не на форуме пытаться телепатов искать. Телепаты сейчас все в отпуске - лето ведь.
   bplmeddy
 
20 - 22.08.18 - 11:20
   yzimin
 
21 - 22.08.18 - 11:20
(18) ну тогда всё правильно, данные ещё не записаны
   Cyberhawk
 
22 - 22.08.18 - 11:21
(16) Ты баклан?
   bplmeddy
 
23 - 22.08.18 - 11:22
(21) Не правильно.
Данные записаны, они в регистре есть (пример в (0) ). Там есть 2 цены, 100 и 200. При установке новой цены вызывается проверка, и на выхлопе вместо 200 (которая записана в регистре - проверял) получаю 100 за вчерашний день.
   yzimin
 
24 - 22.08.18 - 11:25
покажи полностью весь код
   bplmeddy
 
25 - 22.08.18 - 11:25
(19) Я и не спорю но, во первых - заказчик не всегда адекватен и не всегда может объяснить что он имеет ввиду. Что ему наплели программисты то и повторяет мне. Во вторых - можно же нормально, культурно общаться.
Хотя судя по (22) , нет, нельзя.
   Eiffil123
 
26 - 22.08.18 - 11:26
(20) у тебя может разные характеристики номенклатуры?

Еще закладку прочее посмотри - включен ли флаг ведения итогов по регистру
   bplmeddy
 
27 - 22.08.18 - 11:27
(24)
    //Проверим на разлет цен в пределах значение константы

    Для Каждого НовЗап Из ЭтотОбъект Цикл
        Номен = НовЗап.Номенклатура;
        ТипЦены = НовЗап.ВидЦен;
        Если ТипЦены.ТипВидаЦен = Перечисления.ТипыВидовЦен.Статический Тогда
            КонстПроцИзменЦены = Константы.GS_ПроцентИзмененияНовойЦены.Получить();
            
            //Теперь проверим что себестоимость больше любой из статических цен(по каждой строке набора записей).

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

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

            МассивРезультатов = Запрос.ВыполнитьПакет();
            Выборка1 = МассивРезультатов[0].Выбрать();
            Выборка2 = МассивРезультатов[1].Выбрать();
            Пока Выборка1.Следующий() Цикл
                ЦенаСеб = Выборка1.Себестоимость;
                //ЦенаСтарая = Рез.Цена;

            КонецЦикла;
            Пока Выборка2.Следующий() Цикл
                ЦенаСтарая = Выборка2.Цена;
            КонецЦикла;
   bplmeddy
 
28 - 22.08.18 - 11:28
   unregistered
 
29 - 22.08.18 - 11:29
(23) И тем не менее.
С вероятностью 99.9% проблема либо во входящих данных (параметрах и условиях отбора в запросе), либо в самих данных.
Смотри отладчиком какие значения параметров передаются.
Может у вас там есть номенклатуры или типы цен с одинаковыми наименованиями. Ты смотришь данные по одному типу цены, а на самом деле передается в запрос другой.
Кроме того в регистре есть еще другие измерения (Характеристика), которые не указаны в запросе почему-то.
   Eiffil123
 
30 - 22.08.18 - 11:31
(28) В регистре есть характеристика. Нужно проверить, пустая она во всем регистре или нет? Если она не используется, то должна быть во всех записях пустая ссылка (не должно быть двух значений - пустая ссылка и неопределено).

Ну и как вариант - выгрузить регистр в xml, очистить и загрузить.
   yzimin
 
31 - 22.08.18 - 11:32
(28) ЛОЛ, так у тебя итоги отключены
   unregistered
 
32 - 22.08.18 - 11:32
(27) Жесть какая.... Успокойте меня - скажите, что не Вы автор этого бреда.
   Eiffil123
 
33 - 22.08.18 - 11:33
(31) это регистр сведений. правильно, что отключены, для данного запроса они не играют никакой роли
 
 
   bplmeddy
 
34 - 22.08.18 - 11:33
(32) Нет, не автор. Попросили исправить баг.
   Eiffil123
 
35 - 22.08.18 - 11:34
(32) вы не любите запросы в цикле?)
   unregistered
 
36 - 22.08.18 - 11:35
(31) А нафига они должны быть включены? Включение итогов в регистрах сведений - весьма сомнительная потребность, которая должна использоваться только тогда, когда это реально необходимо. То есть когда подавляющая часть запросов к регистру делается через срез последних/первых и без указания параметра "Период" (то есть к актуальному срезу). В остальных случаях итоги в РС нафиг не нужны.
   bplmeddy
 
37 - 22.08.18 - 11:37
(29) Я так-же склонялся к этой мысли, но меня разубедило то что данные все таки получаются, на этот-же товар, этот-же вид цен, но только "вчерашние".
   bplmeddy
 
38 - 22.08.18 - 11:38
(37) Кроме того, по данному товару в регистре вообще нет ни одной записи с указанием характеристик.
   unregistered
 
39 - 22.08.18 - 11:40
(35) И это тоже.
   Eiffil123
 
40 - 22.08.18 - 11:40
(38) а тип реквизита у характеристики в регистре сведений случайно не составной?
   catena
 
41 - 22.08.18 - 11:41
(38)Отсутствие характеристик проверяли глазками или тип поля сравнивался?
   Eiffil123
 
42 - 22.08.18 - 11:41
(39) а как же расчетные задачи, где нужно в цикле рассчитывать суммы по записям регистров расчета в зависимости от категории(порядка)?
   bplmeddy
 
43 - 22.08.18 - 11:42
(40) Нет:
СправочникСсылка.ХарактеристикиНоменклатуры
   unregistered
 
44 - 22.08.18 - 11:42
(38) > в регистре вообще нет ни одной записи с указанием характеристик

Уверен? Характеристика стопудово имеет составной тип данных.
Запись с пустой ссылкой в качестве значения характеристики и запись со значение НЕОПРЕДЕЛЕНО в качестве значения характеристики - это две разные записи.
   bplmeddy
 
45 - 22.08.18 - 11:42
(44) (43)
   Eiffil123
 
46 - 22.08.18 - 11:44
(43) сделай запрос к регистру, выбери из таблицы РегистрСведений.ЦеныНоменклатуры поля "Номенклатура" и "Характеристика", на условиях отбор по этой номенклатуре и на закладке "Объединения/псевдонимы" укажи флаг "Без дублей". Сколько записей покажет? Нужно, чтобы была одна запись.
   bplmeddy
 
47 - 22.08.18 - 11:45
(44) Хорошо, допустим Вы правы. Как тогда объяснить то, что завтра вызвав эту же процедуру, я все таки получу 200?
   unregistered
 
48 - 22.08.18 - 11:51
(42) Это обусловлено самой задачей - наличие зависимости одного вида расчета от другого (нельзя рассчитать премию процентом от оклада, который еще не посчитан и данных по которому в базе тупо не существует ещё - запрос делать не к чему). А сам оклад может быть посчитан только после получения данных из таблиц фактических периодов, которые будут сформированы и получены только после записи наборов, вытесняемых и вытесняющих друг друга по периоду (отработают механизмы вытеснения и заполнятся таблицы периодов).
   catena
 
49 - 22.08.18 - 11:51
Отдельно в консоли что дает этот запрос:

|ВЫБРАТЬ
                           |    ЦеныНоменклатурыСрезПоследних.Цена
                           |ИЗ
                           |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                           |            &ТекДата,
                           |            ВидЦен = &ВидЦены
                           |                И Номенклатура = &Номен) КАК ЦеныНоменклатурыСрезПоследних";
 
 Рекламное место пустует
   hhhh
 
50 - 22.08.18 - 11:56
(47) номенклатуру ту смотришь?
   yzimin
 
51 - 22.08.18 - 11:57
(18) А с чего такая уверенность, что данные точно есть в ПередЗаписью?

Если попробовать в коде перед            
МассивРезультатов = Запрос.ВыполнитьПакет();
сделать запрос не к срезу, а обычной таблице, там точно эти данные есть?
   bplmeddy
 
52 - 22.08.18 - 12:01
(51) Данные точно есть. В "ПередЗаписью" передается только новые данные (неважно истинно новые или после редактирования) Запрос же обращается к уже существующим данным. Добавь я сейчас хоть 100 записей с ценами, я все равно получу только последнюю запись на вчерашний день но ни одной из 100 записей за сегодня. Вот это основная проблема.
   yzimin
 
53 - 22.08.18 - 12:09
(52) в этой же процедуре сделай запрос к основной таблице регистра

сам код (27) находится в модуле менеджере регистра или вызывает другой модуль?
   _KaA
 
54 - 22.08.18 - 12:11
(52)
Кажется у вас УНФ. В этой конфе можно получить цену типовым способом:
Цена = УправлениеНебольшойФирмойСервер.ПолучитьЦенуНоменклатурыПоВидуЦен(СтруктураДанные);

Не каких кешей быть не может, максимум что могли накрутить так это общий модуль сделать с "ПовтИспр", но для цен это перебор...
   bplmeddy
 
55 - 22.08.18 - 12:12
(53) Да, в модуле менеджера записей, в процедура "ПередЗаписью".
   hhhh
 
56 - 22.08.18 - 12:12
(52) ну вы на эту же дату пишете или на следующую? Потому что если на эту же дату, то существующая запись стирается предварительно. И вы действительно увидите вчерашнюю.
   bplmeddy
 
57 - 22.08.18 - 12:13
(54) Да, действительно забыл указать, конфигурация УНФ + Автосервис.

А с таким методом получения цены ещё не сталкивался, если честно. Сейчас попробую.
СтруктураДанные - передается через структуру номенклатура, вид цены, правильно ?
   _KaA
 
58 - 22.08.18 - 12:14
(57)
см. форму документа РасходнаяНакладная процедуру ПолучитьДанныеНоменклатураПриИзменении()
   _KaA
 
59 - 22.08.18 - 12:15
+ к (58) возможно для новых цен не взводиться актуальность или имеет место быть какой то отбор по валюте?
   bplmeddy
 
60 - 22.08.18 - 12:18
(56) Блин, это похоже на ответ. Если переодичность указана в пределах дня, при добавлении новой записи они могут замещать старые в пределах текущего периода, соответственно до окончания ввода новых записей, их не существует за текущий период, и система выдает последние. То есть, по логике, решение данной проблемы только в уменьшении переодичности к примеру до секунды. Поправьте меня если я не прав.
   _KaA
 
61 - 22.08.18 - 12:21
(60) А можно узнать постановку задачи? Не один из пунктиков а всю задачу, которую вы делаете?
   bplmeddy
 
62 - 22.08.18 - 12:24
(61) Есть некая константа - ПроцентИзмененияЦены.
При любой новой записи цены в регистр сведений, система должна проверить отклонения новой цены от старой (такого же типа) и в случае превышения значения константы - отказ=истина. Например была цена 100 ставим 49 - превышение значения на 50%, отказ записи.
   bplmeddy
 
63 - 22.08.18 - 12:26
То что я описал в (60) имеет право на жизнь или я ошибаюсь ?
   bplmeddy
 
64 - 22.08.18 - 12:30
(63) Подскажите пожалуйста.
   yzimin
 
65 - 22.08.18 - 12:34
(63) Построй запрос к основной таблице запроса и проверь
   unregistered
 
66 - 22.08.18 - 12:43
(60) Изменение периодичности регистра - не лучшее решение, имеющее далеко идущие последствия, которые вы потом устанете разгребать.
   unregistered
 
67 - 22.08.18 - 12:45
Автор! Ты же тут всех 100 раз убеждал, что проверил наличие данных. А как и где ты их проверял? Должен был в отладчике в момент выполнения "проблемного" кода. А по всей видимости делал это ДО или ПОСЛЕ выполнения кода.
   unregistered
 
68 - 22.08.18 - 12:49
Поставь точку останова перед выполнением запроса и получи данные о цене объектным методом
РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("Номенклатура, ВидЦен", Номен, НовЗап.ВидЦен)).Цена
   Eiffil123
 
69 - 22.08.18 - 13:03
(62) ну теперь кажется становится ясно.

Тебе нужно в модуле набора записей в процедуре ПередЗаписью получать по отбору запросом записи в регистре.


!!! Из отбора, а не из ЭтотОбъект, т.к. при очистке записей В ЭтотОбъект записей не будут и они успешно удаляются.
   bplmeddy
 
70 - 22.08.18 - 13:08
(68) http://i.piccy.info/i9/e767584efff09fc92dba6e2b6053c262/1534932435/60804/1248074/Cena1.jpg

8000 -было установлено вчера. Сегодня с утра поставил 500, запись в регистре есть, но получаю 8000 вместо 500.
   Eiffil123
 
71 - 22.08.18 - 14:31
(70) дата и время на сервере 1С какие сейчас?
   hhhh
 
72 - 22.08.18 - 15:57
(70) это в какой момент картинка?
   hhhh
 
73 - 22.08.18 - 16:01
(70) ну всё понятно, тему можно закрывать.



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует