Имя: Пароль:
1C
1С v8
Проблемы с регистром сведений "Цены номенклатуры".
, ,
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) ну всё понятно, тему можно закрывать.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший