|
Проблемы с регистром сведений "Цены номенклатуры". | ☑ | ||
---|---|---|---|---|
0
bplmeddy
22.08.18
✎
10:54
|
Добрый день. При получении записи о цене товара из регистра сведений "Цены номенклатуры" (Режим записи: независимый, Переодичность: в пределах дня) получаю почему то последнюю цену на ранний период чем текущая дата.
Например: Вчера установлена цена 100, сегодня установили 200, после чего при попытке получить последнюю цену, возвращается почему-то 100 а не 200. Подскажите пожалуйста, в чем может быть загвоздка ? Буду очень благодарен за помощь. ПЫ.СЫ. Заказчик говорит что возможно причина в том что регистр сделали "кэшевый", но что это за зверь - не в курсе, в интернете информации по данному типу не нашёл. |
|||
1
yzimin
22.08.18
✎
10:56
|
Граница, ВидГраницы.Включая?
|
|||
2
Casey1984
22.08.18
✎
10:56
|
Регистр сделали "кэшевый", но что это за зверь я тоже не знаю)
При получении записи о цене товара из регистра сведений "Цены номенклатуры" - а как получаешь? А записи то в списке регистра есть? |
|||
3
bplmeddy
22.08.18
✎
10:57
|
(2) Записи добавляються.
Пробовал получать как запросом (СрезПоследних, так и через отбор по структуре и ПолучитьПоследнее() ) |
|||
4
Casey1984
22.08.18
✎
10:59
|
Нужен пример)
|
|||
5
bplmeddy
22.08.18
✎
10:59
|
(1) Об этом не подумал, сейчас попробую.
|
|||
6
bplmeddy
22.08.18
✎
11:01
|
(4)
Запрос.Текст = "ВЫБРАТЬ | ВЫБОР | КОГДА ЗапасыОстатки.КоличествоОстаток = 0 | ТОГДА ЗапасыОстатки.СуммаОстаток | ИНАЧЕ ЗапасыОстатки.СуммаОстаток / ЗапасыОстатки.КоличествоОстаток | КОНЕЦ КАК Себестоимость |ИЗ | РегистрНакопления.Запасы.Остатки(&ТекДата, Номенклатура = &Номен) КАК ЗапасыОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | &ТекДата, | ВидЦен = &ВидЦены | И Номенклатура = &Номен) КАК ЦеныНоменклатурыСрезПоследних"; Запрос.УстановитьПараметр("ТекДата",КонецДня(ТекущаяДата())); Запрос.УстановитьПараметр("Номен",Номен); Запрос.УстановитьПараметр("ВидЦены",ТипЦены); |
|||
7
bplmeddy
22.08.18
✎
11:06
|
(1) (5) Так тоже не помогло:
Запрос.УстановитьПараметр("ТекДата",Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая)); |
|||
8
Buster007
22.08.18
✎
11:10
|
ищи проблемы в установке параметров
|
|||
9
unregistered
22.08.18
✎
11:11
|
(0) > регистр сделали "кэшевый"
Нет такого. Или ты не верно понял заказчика, или он что-то другое имел ввиду. Если подразумевали, что для регистра была включена галка "Разрешить итоги срез последних" (и/или срез первых), то для случая получения данных среза с указанием конкретного значения параметра "Период", таблицы итогов не используются (хранятся только самые последние/первые срезы). Но можете на всякий случай пересчитать итоги по регистру. |
|||
10
bplmeddy
22.08.18
✎
11:13
|
(8) Параметры устанавливаются корректно.
|
|||
11
bplmeddy
22.08.18
✎
11:13
|
(9) Цитирую заказчика: "Там кэшевый регистр с ценами делали. Может в нем проблема..."
|
|||
12
Cyberhawk
22.08.18
✎
11:14
|
С заказчиком и разбирайся. Смысл ты сюда пришел со своими цитатами?
|
|||
13
unregistered
22.08.18
✎
11:15
|
(11) > " кэшевый регистр"
Таких регистров в платформе 1С не существует. Надеюсь, ты это знаешь ;) |
|||
14
yzimin
22.08.18
✎
11:15
|
(6) Откуда вызывается этот код? Из какого именно модуля?
А если в консоли запросов? |
|||
15
bplmeddy
22.08.18
✎
11:16
|
(13) Знаю, но мало ли, вдруг это не лыжи не едут, а я просто идиот )
|
|||
16
bplmeddy
22.08.18
✎
11:17
|
(12) А грубить то зачем? Мне кажется что форум создан для помощи и советов ? Если лично Вам не интересно - Вас никто не заставляет читать и тем более отвечать в данной ветке.
|
|||
17
unregistered
22.08.18
✎
11:17
|
(10) > Параметры устанавливаются корректно
Значит данные некорректные или не там смотришь. В противном случае придется вызывать батюшку, чтобы серверную осветил. |
|||
18
bplmeddy
22.08.18
✎
11:18
|
(14) Из менеджера записей регистра сведений. В процедуре "ПередЗаписью".
|
|||
19
unregistered
22.08.18
✎
11:20
|
(16) По сути в (12) верно сказано. Если заказчик какую-то муть несёт, то лучше для начала у него уточнить - что именно он имел ввиду, а не на форуме пытаться телепатов искать. Телепаты сейчас все в отпуске - лето ведь.
|
|||
20
bplmeddy
22.08.18
✎
11:20
|
||||
21
yzimin
22.08.18
✎
11:20
|
(18) ну тогда всё правильно, данные ещё не записаны
|
|||
22
Cyberhawk
22.08.18
✎
11:21
|
(16) Ты баклан?
|
|||
23
bplmeddy
22.08.18
✎
11:22
|
(21) Не правильно.
Данные записаны, они в регистре есть (пример в (0) ). Там есть 2 цены, 100 и 200. При установке новой цены вызывается проверка, и на выхлопе вместо 200 (которая записана в регистре - проверял) получаю 100 за вчерашний день. |
|||
24
yzimin
22.08.18
✎
11:25
|
покажи полностью весь код
|
|||
25
bplmeddy
22.08.18
✎
11:25
|
(19) Я и не спорю но, во первых - заказчик не всегда адекватен и не всегда может объяснить что он имеет ввиду. Что ему наплели программисты то и повторяет мне. Во вторых - можно же нормально, культурно общаться.
Хотя судя по (22) , нет, нельзя. |
|||
26
Eiffil123
22.08.18
✎
11:26
|
(20) у тебя может разные характеристики номенклатуры?
Еще закладку прочее посмотри - включен ли флаг ведения итогов по регистру |
|||
27
bplmeddy
22.08.18
✎
11:27
|
(24)
//Проверим на разлет цен в пределах значение константы Для Каждого НовЗап Из ЭтотОбъект Цикл Номен = НовЗап.Номенклатура; ТипЦены = НовЗап.ВидЦен; Если ТипЦены.ТипВидаЦен = Перечисления.ТипыВидовЦен.Статический Тогда КонстПроцИзменЦены = Константы.GS_ПроцентИзмененияНовойЦены.Получить(); //Теперь проверим что себестоимость больше любой из статических цен(по каждой строке набора записей). Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВЫБОР | КОГДА ЗапасыОстатки.КоличествоОстаток = 0 | ТОГДА ЗапасыОстатки.СуммаОстаток | ИНАЧЕ ЗапасыОстатки.СуммаОстаток / ЗапасыОстатки.КоличествоОстаток | КОНЕЦ КАК Себестоимость |ИЗ | РегистрНакопления.Запасы.Остатки(&ТекДата, Номенклатура = &Номен) КАК ЗапасыОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | &ТекДата, | ВидЦен = &ВидЦены | И Номенклатура = &Номен) КАК ЦеныНоменклатурыСрезПоследних"; Запрос.УстановитьПараметр("ТекДата",Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая)); Запрос.УстановитьПараметр("Номен",Номен); Запрос.УстановитьПараметр("ВидЦены",ТипЦены); //Рез = Запрос.Выполнить().Выбрать(); МассивРезультатов = Запрос.ВыполнитьПакет(); Выборка1 = МассивРезультатов[0].Выбрать(); Выборка2 = МассивРезультатов[1].Выбрать(); Пока Выборка1.Следующий() Цикл ЦенаСеб = Выборка1.Себестоимость; //ЦенаСтарая = Рез.Цена; КонецЦикла; Пока Выборка2.Следующий() Цикл ЦенаСтарая = Выборка2.Цена; КонецЦикла; |
|||
28
bplmeddy
22.08.18
✎
11:28
|
||||
29
unregistered
22.08.18
✎
11:29
|
(23) И тем не менее.
С вероятностью 99.9% проблема либо во входящих данных (параметрах и условиях отбора в запросе), либо в самих данных. Смотри отладчиком какие значения параметров передаются. Может у вас там есть номенклатуры или типы цен с одинаковыми наименованиями. Ты смотришь данные по одному типу цены, а на самом деле передается в запрос другой. Кроме того в регистре есть еще другие измерения (Характеристика), которые не указаны в запросе почему-то. |
|||
30
Eiffil123
22.08.18
✎
11:31
|
(28) В регистре есть характеристика. Нужно проверить, пустая она во всем регистре или нет? Если она не используется, то должна быть во всех записях пустая ссылка (не должно быть двух значений - пустая ссылка и неопределено).
Ну и как вариант - выгрузить регистр в xml, очистить и загрузить. |
|||
31
yzimin
22.08.18
✎
11:32
|
(28) ЛОЛ, так у тебя итоги отключены
|
|||
32
unregistered
22.08.18
✎
11:32
|
(27) Жесть какая.... Успокойте меня - скажите, что не Вы автор этого бреда.
|
|||
33
Eiffil123
22.08.18
✎
11:33
|
(31) это регистр сведений. правильно, что отключены, для данного запроса они не играют никакой роли
|
|||
34
bplmeddy
22.08.18
✎
11:33
|
(32) Нет, не автор. Попросили исправить баг.
|
|||
35
Eiffil123
22.08.18
✎
11:34
|
(32) вы не любите запросы в цикле?)
|
|||
36
unregistered
22.08.18
✎
11:35
|
(31) А нафига они должны быть включены? Включение итогов в регистрах сведений - весьма сомнительная потребность, которая должна использоваться только тогда, когда это реально необходимо. То есть когда подавляющая часть запросов к регистру делается через срез последних/первых и без указания параметра "Период" (то есть к актуальному срезу). В остальных случаях итоги в РС нафиг не нужны.
|
|||
37
bplmeddy
22.08.18
✎
11:37
|
(29) Я так-же склонялся к этой мысли, но меня разубедило то что данные все таки получаются, на этот-же товар, этот-же вид цен, но только "вчерашние".
|
|||
38
bplmeddy
22.08.18
✎
11:38
|
(37) Кроме того, по данному товару в регистре вообще нет ни одной записи с указанием характеристик.
|
|||
39
unregistered
22.08.18
✎
11:40
|
(35) И это тоже.
|
|||
40
Eiffil123
22.08.18
✎
11:40
|
(38) а тип реквизита у характеристики в регистре сведений случайно не составной?
|
|||
41
catena
22.08.18
✎
11:41
|
(38)Отсутствие характеристик проверяли глазками или тип поля сравнивался?
|
|||
42
Eiffil123
22.08.18
✎
11:41
|
(39) а как же расчетные задачи, где нужно в цикле рассчитывать суммы по записям регистров расчета в зависимости от категории(порядка)?
|
|||
43
bplmeddy
22.08.18
✎
11:42
|
(40) Нет:
СправочникСсылка.ХарактеристикиНоменклатуры |
|||
44
unregistered
22.08.18
✎
11:42
|
(38) > в регистре вообще нет ни одной записи с указанием характеристик
Уверен? Характеристика стопудово имеет составной тип данных. Запись с пустой ссылкой в качестве значения характеристики и запись со значение НЕОПРЕДЕЛЕНО в качестве значения характеристики - это две разные записи. |
|||
45
bplmeddy
22.08.18
✎
11:42
|
(44) (43)
|
|||
46
Eiffil123
22.08.18
✎
11:44
|
(43) сделай запрос к регистру, выбери из таблицы РегистрСведений.ЦеныНоменклатуры поля "Номенклатура" и "Характеристика", на условиях отбор по этой номенклатуре и на закладке "Объединения/псевдонимы" укажи флаг "Без дублей". Сколько записей покажет? Нужно, чтобы была одна запись.
|
|||
47
bplmeddy
22.08.18
✎
11:45
|
(44) Хорошо, допустим Вы правы. Как тогда объяснить то, что завтра вызвав эту же процедуру, я все таки получу 200?
|
|||
48
unregistered
22.08.18
✎
11:51
|
(42) Это обусловлено самой задачей - наличие зависимости одного вида расчета от другого (нельзя рассчитать премию процентом от оклада, который еще не посчитан и данных по которому в базе тупо не существует ещё - запрос делать не к чему). А сам оклад может быть посчитан только после получения данных из таблиц фактических периодов, которые будут сформированы и получены только после записи наборов, вытесняемых и вытесняющих друг друга по периоду (отработают механизмы вытеснения и заполнятся таблицы периодов).
|
|||
49
catena
22.08.18
✎
11:51
|
Отдельно в консоли что дает этот запрос:
|ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | &ТекДата, | ВидЦен = &ВидЦены | И Номенклатура = &Номен) КАК ЦеныНоменклатурыСрезПоследних"; |
|||
50
hhhh
22.08.18
✎
11:56
|
(47) номенклатуру ту смотришь?
|
|||
51
yzimin
22.08.18
✎
11:57
|
(18) А с чего такая уверенность, что данные точно есть в ПередЗаписью?
Если попробовать в коде перед МассивРезультатов = Запрос.ВыполнитьПакет(); сделать запрос не к срезу, а обычной таблице, там точно эти данные есть? |
|||
52
bplmeddy
22.08.18
✎
12:01
|
(51) Данные точно есть. В "ПередЗаписью" передается только новые данные (неважно истинно новые или после редактирования) Запрос же обращается к уже существующим данным. Добавь я сейчас хоть 100 записей с ценами, я все равно получу только последнюю запись на вчерашний день но ни одной из 100 записей за сегодня. Вот это основная проблема.
|
|||
53
yzimin
22.08.18
✎
12:09
|
(52) в этой же процедуре сделай запрос к основной таблице регистра
сам код (27) находится в модуле менеджере регистра или вызывает другой модуль? |
|||
54
_KaA
22.08.18
✎
12:11
|
(52)
Кажется у вас УНФ. В этой конфе можно получить цену типовым способом: Цена = УправлениеНебольшойФирмойСервер.ПолучитьЦенуНоменклатурыПоВидуЦен(СтруктураДанные); Не каких кешей быть не может, максимум что могли накрутить так это общий модуль сделать с "ПовтИспр", но для цен это перебор... |
|||
55
bplmeddy
22.08.18
✎
12:12
|
(53) Да, в модуле менеджера записей, в процедура "ПередЗаписью".
|
|||
56
hhhh
22.08.18
✎
12:12
|
(52) ну вы на эту же дату пишете или на следующую? Потому что если на эту же дату, то существующая запись стирается предварительно. И вы действительно увидите вчерашнюю.
|
|||
57
bplmeddy
22.08.18
✎
12:13
|
(54) Да, действительно забыл указать, конфигурация УНФ + Автосервис.
А с таким методом получения цены ещё не сталкивался, если честно. Сейчас попробую. СтруктураДанные - передается через структуру номенклатура, вид цены, правильно ? |
|||
58
_KaA
22.08.18
✎
12:14
|
(57)
см. форму документа РасходнаяНакладная процедуру ПолучитьДанныеНоменклатураПриИзменении() |
|||
59
_KaA
22.08.18
✎
12:15
|
+ к (58) возможно для новых цен не взводиться актуальность или имеет место быть какой то отбор по валюте?
|
|||
60
bplmeddy
22.08.18
✎
12:18
|
(56) Блин, это похоже на ответ. Если переодичность указана в пределах дня, при добавлении новой записи они могут замещать старые в пределах текущего периода, соответственно до окончания ввода новых записей, их не существует за текущий период, и система выдает последние. То есть, по логике, решение данной проблемы только в уменьшении переодичности к примеру до секунды. Поправьте меня если я не прав.
|
|||
61
_KaA
22.08.18
✎
12:21
|
(60) А можно узнать постановку задачи? Не один из пунктиков а всю задачу, которую вы делаете?
|
|||
62
bplmeddy
22.08.18
✎
12:24
|
(61) Есть некая константа - ПроцентИзмененияЦены.
При любой новой записи цены в регистр сведений, система должна проверить отклонения новой цены от старой (такого же типа) и в случае превышения значения константы - отказ=истина. Например была цена 100 ставим 49 - превышение значения на 50%, отказ записи. |
|||
63
bplmeddy
22.08.18
✎
12:26
|
То что я описал в (60) имеет право на жизнь или я ошибаюсь ?
|
|||
64
bplmeddy
22.08.18
✎
12:30
|
(63) Подскажите пожалуйста.
|
|||
65
yzimin
22.08.18
✎
12:34
|
(63) Построй запрос к основной таблице запроса и проверь
|
|||
66
unregistered
22.08.18
✎
12:43
|
(60) Изменение периодичности регистра - не лучшее решение, имеющее далеко идущие последствия, которые вы потом устанете разгребать.
|
|||
67
unregistered
22.08.18
✎
12:45
|
Автор! Ты же тут всех 100 раз убеждал, что проверил наличие данных. А как и где ты их проверял? Должен был в отладчике в момент выполнения "проблемного" кода. А по всей видимости делал это ДО или ПОСЛЕ выполнения кода.
|
|||
68
unregistered
22.08.18
✎
12:49
|
Поставь точку останова перед выполнением запроса и получи данные о цене объектным методом
РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("Номенклатура, ВидЦен", Номен, НовЗап.ВидЦен)).Цена |
|||
69
Eiffil123
22.08.18
✎
13:03
|
(62) ну теперь кажется становится ясно.
Тебе нужно в модуле набора записей в процедуре ПередЗаписью получать по отбору запросом записи в регистре. !!! Из отбора, а не из ЭтотОбъект, т.к. при очистке записей В ЭтотОбъект записей не будут и они успешно удаляются. |
|||
70
bplmeddy
22.08.18
✎
13:08
|
(68) http://i.piccy.info/i9/e767584efff09fc92dba6e2b6053c262/1534932435/60804/1248074/Cena1.jpg
8000 -было установлено вчера. Сегодня с утра поставил 500, запись в регистре есть, но получаю 8000 вместо 500. |
|||
71
Eiffil123
22.08.18
✎
14:31
|
(70) дата и время на сервере 1С какие сейчас?
|
|||
72
hhhh
22.08.18
✎
15:57
|
(70) это в какой момент картинка?
|
|||
73
hhhh
22.08.18
✎
16:01
|
(70) ну всё понятно, тему можно закрывать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |