Имя: Пароль:
1C
1С v8
Не корректно работает ПолучитьПоследнее для регистра сведений
0 themister
 
06.09.12
17:59
Доброго дня!
Господа, столкнулся со следующей проблемой: решил сделать печать прайса всей имеющейся в наличии номенклатуры. И все бы ничего, но в функции формирования макета, я не могу получить срез последних цен. Хотя в других случаях использование функции получения цен работает стабильно. Привожу код самой функции формирования цен (выполняется на сервере):


// Рассчет розничной цены
Функция РасчитатьРозничнуюЦену(Номенклатура) Экспорт
   БазоваяЦена = ПолучитьСрезЦен(Номенклатура);
   
   Если Номенклатура.Наценка = 0 Тогда
       Наценка = Номенклатура.Родитель.Наценка;
   Иначе
       Наценка = Номенклатура.Наценка;
   КонецЕсли;
   
   РозничнаяЦена = БазоваяЦена * (1 + Наценка / 100);
   Возврат Окр(РозничнаяЦена, -2);
КонецФункции

Функция ПолучитьСрезЦен(Номенклатура) Экспорт
   Цены = РегистрыСведений.ЦеныНаНоменклатуру;
   Отбор = Новый Структура("Номенклатура", Номенклатура);
   ЗначенияРесурсов = Цены.ПолучитьПоследнее(ТекущаяДата(), Отбор);  // <-- НЕ РАБОТАЕТ ЕСЛИ ВЫЗЫВАЮТ ИЗ МАКЕТА
   Возврат ЗначенияРесурсов.Цена;
КонецФункции


А вот и код процедуры формирования макета прайса:

Процедура ПечатьПрайс(ТабДок, Ссылка) Экспорт
   //{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
   Макет = Документы.ПечатьЦенников.ПолучитьМакет("Прайс");
   ТабДок.Очистить();
   
   Номенклатура = Справочники.Номенклатура.Выбрать();
   
   ТекущаяСтрока = 1;
   Пока Номенклатура.Следующий() Цикл    
       Если Номенклатура.ЭтоГруппа Тогда
           Продолжить;
       КонецЕсли;
       
       Запрос = Новый Запрос;
   
       Запрос.Текст ="ВЫБРАТЬ
                     |    ОстаткиНаСкладахОстатки.КоличествоОстаток Как ТекущийОстаток
                     |ИЗ
                     |    РегистрНакопления.ОстаткиНаСкладах.Остатки КАК ОстаткиНаСкладахОстатки
                     |ГДЕ
                     |    ОстаткиНаСкладахОстатки.Номенклатура = &Номенклатура";
                     
       Запрос.УстановитьПараметр("Номенклатура", Номенклатура.Ссылка);
       Выборка = Запрос.Выполнить().Выбрать();
       
       ТекущийОстаток = 0;
       Если Выборка.Следующий() Тогда
           ТекущийОстаток = Выборка.ТекущийОстаток;
       КонецЕсли;
       
       Если ТекущийОстаток = 0 Тогда
           Продолжить;
       КонецЕсли;
       
       Секция = Макет.ПолучитьОбласть("R1C1:R1C5");
       Секция.Область("R1C1").Текст = ТекущаяСтрока;
       Секция.Область("R1C2").Текст = Номенклатура.Код;
       Секция.Область("R1C3").Текст = Номенклатура.Наименование;
       Секция.Область("R1C4").Текст = ТекущийОстаток;
       Секция.Область("R1C5").Текст = НаСервере.РасчитатьРозничнуюЦену(Номенклатура);  // <-- ВОТ ЗДЕСЬ Я НЕ МОГУ ПОЛУЧИТЬ ЦЕНУ
       ТабДок.Вывести(Секция);
       
       // переходим на следующую строку
       ТекущаяСтрока = ТекущаяСтрока + 1;
   КонецЦикла;
   //}}
КонецПроцедуры


Ничего не могу понять. Буду благодарен за помощь!
(1С версии 8.2, своя конфигурация)
1 DrShad
 
06.09.12
18:03
за такой код нужно наказывать
2 DrShad
 
06.09.12
18:08
у тя что ни одной типовой нету? смотри как там реализована печать и делай нормально
3 Wobland
 
06.09.12
18:09
>ЕСЛИ ВЫЗЫВАЮТ ИЗ МАКЕТА
тяжёлое наследие семёрки?
4 Wobland
 
06.09.12
18:10
>Процедура ПечатьПрайс(ТабДок, Ссылка)
всю к чертям
5 Wobland
 
06.09.12
18:11
получаешь запросом таблицу вида Номенклатура|Остаток|Цена (если цена какая-то хитрая, рассчитываешь колонку отдельно). выводишь таблицу красиво в ТабДок
6 themister
 
06.09.12
18:11
Нет, нету ))
Я вообще 1С использую не в профессиональных целях, я свою конфигурацию написал для своего маленького бизнеса )))

но по теме: почему в если из формы вызываю ф-цию РасчитатьРозничнуюЦену(Номенклатура) все ОК, если из Процедура ПечатьПрайс(ТабДок, Ссылка) то не работает?
7 Reset
 
06.09.12
18:11
Секция.Область("R1C5").Текст = НаСервере.РасчитатьРозничнуюЦену(Номенклатура.ССЫЛКА);  // <-- ВОТ ЗДЕСЬ Я НЕ МОГУ ПОЛУЧИТЬ ЦЕНУ
8 themister
 
06.09.12
18:12
Можно запрос, если не сложно. Не сильно в них волоку..
9 Wobland
 
06.09.12
18:12
а ещё есть СКД
10 Reset
 
06.09.12
18:12
Но весть код архибредовый
11 Reset
 
06.09.12
18:12
весь
12 Wobland
 
06.09.12
18:12
(8) учись, это очень нужно. ну или найми специалиста
13 themister
 
06.09.12
18:14
Учился бы, если бы это была моя специализация. А так изучаю 1С по мере доработки функционала.
14 Reset
 
06.09.12
18:14
(6) Потому что во втором случае ты не ссылку на номенклатуру передаешь, а выборку
15 Reset
 
06.09.12
18:15
Не называл бы выборку номенклатурой, не ошибся бы
16 Wobland
 
06.09.12
18:15
(13) в общем, надо всё удалять и делать по новой
17 themister
 
06.09.12
18:16
т.е. передать в качестве параметра Номенклатура.Ссылка?
18 Reset
 
06.09.12
18:17
(17) -> (7)
19 Wobland
 
06.09.12
18:20
простейшая иллюстрация работы с ТабДоком. это если не хочется СКД

Пакет доступен по ссылке: http://disk.tom.ru/67xsqht
20 themister
 
06.09.12
18:20
(18) Извиняюсь, не заметил сразу Ваш ответ. Действительно помогло.

А как можно сделать не так коряво, на будущее ))
21 Reset
 
06.09.12
18:21
(20) --> (16) :)
22 themister
 
06.09.12
18:22
(19) Я пока еще не очень догоняю как соединить Номенклатуру (Справочник) и Цены (Регистр) и там же выбрать то что есть в наличии из Остатков (регистр)
23 themister
 
06.09.12
18:22
(20) :)))
24 Reset
 
06.09.12
18:23
(22) Запрос на остатки, левое соединение на цены
25 vmv
 
06.09.12
18:26
хотел нахамить, прочтя сабж, но человек вежлив и делает первые шаги, надеюсь взлетит когда-нибудь - главное стараться.

По сути ничего не скажу - такой код вызывает у меня слезы, а когда я реву - не могу думать
26 Wobland
 
06.09.12
18:27
(22) черновой набросок, для понимания того, что имеется в виду:

"ВЫБРАТЬ
|    спрНоменклатура.Ссылка,
|    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Поле1,
|    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Поле2
|ИЗ
|    Справочник.Номенклатура КАК спрНоменклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
|        ПО спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
|        ПО спрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
|ГДЕ
|    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) > 0"
27 Reset
 
06.09.12
18:29
(26) Если проверяется на>0, справочник не нужен, достаточно просто остатки взять
28 themister
 
06.09.12
18:29
ребята, я конечно понимаю что код никакой, но я не программист! )))
29 themister
 
06.09.12
18:30
Всем большое СПАСИБО!
30 Reset
 
06.09.12
18:32
вот покороче
ВЫБРАТЬ
   Остатки.Номенклатура,
   Остатки.Номенклатура.Код,
   Остатки.КоличествоОстаток,

   ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
   РегистрНакопления.ОстаткиНаСкладах.Остатки КАК Остатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНаНоменклатуру.СрезПоследних КАК Цены        
ПО Остатки.Номенклатура = Цены.Номенклатура
31 Wobland
 
06.09.12
18:33
(27) а отрицательные остатки? но согласен, да
(30) а где священный ЕСТЬNULL?
32 Reset
 
06.09.12
18:33
isNull конечно на цену добавить
33 Reset
 
06.09.12
18:34
(31) Забыл ;]
34 Wobland
 
06.09.12
18:35
(29) что, уже доходить начало? или полностью дошло?
35 themister
 
06.09.12
19:10
(34) да, дошло. а благодаря (30) я въехал в соединение )