Имя: Пароль:
1C
1С v8
Обход запроса
, ,
0 CalvinKlein
 
27.09.11
21:24
Привет всем, подскажите, пожалуйста, не могу уже который час найти ошибку. Дела запрос с итогами, обхожу сначала по группировкам, потом делаю выбрать и он пишет что ошибка "Значение не является значением объектного типа..." Раньше делал нормально все работала, в чем может быть ошибка, помогите пожалуйста?


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

     
      Результат = Запрос.Выполнить();
      ВыборкаЗаписей = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
     
      Пока ВыборкаЗаписей.Следующий() Цикл
         
          ТекСебеСтоимость = 0;
         
          Если (НЕ ВыборкаЗаписей.Услуга) тогда
             
              ДетальнаяВыборка = ВыборкаЗаписей.Выбрать();
1 CalvinKlein
 
27.09.11
21:25
Хотя в консоле запросов смотрю все как надо...А когда обращаюсь ДетальнаяВыборка.Количество допустим, выдает ошибку(
2 wade25
 
27.09.11
21:38
Посмотри может где встречается NULL и из этого косяк...
3 Мимохожий Однако
 
27.09.11
21:42
Можно обрамить Попыткой Исключением и включить после Исключения шлагбаум отладчика,чтобы посмотреть в момент ошибки.
4 Ненавижу 1С
 
гуру
27.09.11
22:04
(0) ошибка в коде, который ты не показал нам ((
5 CalvinKlein
 
27.09.11
22:07
Извиняюсь, но там все вроде норм...Вот весь код, все равно не работает =(


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

     
      Результат = Запрос.Выполнить();
      ВыборкаЗаписей = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
     
      Пока ВыборкаЗаписей.Следующий() Цикл
         
          ТекСебеСтоимость = 0;
         
          Если (НЕ ВыборкаЗаписей.Услуга) тогда
             
              ДетальнаяВыборка = ВыборкаЗаписей.Выбрать();
             
              Если (ДетальнаяВыборка.Количество > ДетальнаяВыборка.КоличествоОстаток) тогда
                   Сообщение = Новый СообщениеПользователю;
                   Сообщение.Текст = "Не хватает "+ДетальнаяВыборка.Номенклатура+" в количество "
                                           +ДетальнаяВыборка.КоличествоОстаток-ДетальнаяВыборка.Количество+" из партии "+
                                               ДетальнаяВыборка.Партия;
                   Сообщение.Сообщить();
                   Отказ = Истина;
               КонецЕсли;
               
               Если Отказ тогда
                   Продолжить;
               КонецЕсли;
               
               ТекСебеСтоимость = ДетальнаяВыборка.Количество*(ДетальнаяВыборка.СуммаОстаток/ДетальнаяВыборка.КоличествоОстаток);
               
               Движение = Движения.ОстаткиНоменклатуры.Добавить();
               Движение.Период = Дата;
               Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
               Движение.Партия = ДетальнаяВыборка.Партия;
               Движение.Номенклатура = ДетальнаяВыборка.Номенклатура;
               Движение.Количество = ДетальнаяВыборка.Количество;
               Движение.Стоимость = ТекСебеСтоимость;
             
          КонецЕсли;
         
          //Регистр Продаж.
          Движение = Движения.Продажи.Добавить();
          Движение.Период = Дата;
          Движение.Номенклатура = ВыборкаЗаписей.Номенклатура;
          Движение.Себестоимость = ТекСебеСтоимость;
          Движение.Выручка = ВыборкаЗаписей.Сумма;
          Движение.Количество = ВыборкаЗаписей.Количество;
      КонецЦикла;
6 CalvinKlein
 
27.09.11
22:08
на этой строчке выдает ошибку

Если (ДетальнаяВыборка.Количество > ДетальнаяВыборка.КоличествоОстаток) тогда
7 zak555
 
27.09.11
22:10
(5) док может проводиться оперативно и неопреративно ?
8 CalvinKlein
 
27.09.11
22:13
(7) Да
9 wade25
 
27.09.11
22:14
Это задача к специалисту чтоли? =)
10 zak555
 
27.09.11
22:14
(8) тогда остатки проверяй в конце проведения при оперативном
11 CalvinKlein
 
27.09.11
22:15
причем в консоле запросов все ок...
12 aleks11
 
27.09.11
22:17
Может ДетальнаяВыборка.Следующий ?
13 CalvinKlein
 
27.09.11
22:18
(9) так точно) Вот отсюда пример http://www.ax-online.ru/Exams/AttPlatf/Task-1.3.aspx
(10) Остатки есть, меня смущает, на самом верхнем уровне у КоличествоОстатки и СуммаОстатки стоит NULL, когда смотрю через дебагер...
14 CalvinKlein
 
27.09.11
22:20
(12)точно! Спасибо большое!
Запомню раз и на всегда...
15 zak555
 
27.09.11
22:22
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга

это не надо заменить на
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга на
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга КАК НоменклатураУслуга

???
16 wade25
 
27.09.11
22:23
ТС, вот, полезно тебе будет =)
http://chistov.spb.ru/forum/4-637-1
17 CalvinKlein
 
27.09.11
22:25
(15) Решение выше.Все равно спасибо!
Вопрос на вскидку, кто-нибудь сдавал спеца? Сколько на экзамене задач?
(16) Спасибо!
18 wade25
 
27.09.11
22:27
19 zak555
 
27.09.11
22:32
(16) я думаю, что доверять

http://chistov.spb.ru/forum/4-175-5524-16-1256139412

нельзя, ибо есть строчка :

Если Выборка.Номенклатура.Тип = Перечисления.ТипыНоменклатуры.Товар Тогда


а это г@внокод
20 wade25
 
27.09.11
22:35
(19) Там много вариантов решения =)
21 zak555
 
27.09.11
22:35
(20) у автора написано, что спец
22 zak555
 
27.09.11
22:37
а где текст этой задачи ?
23 wade25
 
27.09.11
22:41
24 wade25
 
27.09.11
22:42
+(23) Вот так лучше

Задача 1.3.

Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.
Складской учет товаров не ведется.
При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ.
В документе «Расходная накладная», а табличной части для каждого товара пользователь указывает партию, которую необходимо списать. В том случае, если товара по указанной партии не хватает, документ не проводится и выводится соответствующее сообщение о нехватке.
Необходимо построить отчет по анализу продаж товаров за период и остаткам товара на указанную дату.
Продажи с 01.01.2010 по 31.03.2010
Номенклатура    Кол- во    Себест-стъ    Продажа    Прибыль    Интервал    Срок
Куртка замшевая    3    300    620    320    10    20
Портсигар    3    30    50    20    разовая    50
Доставка    1        100    100    разовая    

Прибыль рассчитывается как:
«Сумма продаж» - «Себестоимость»
Интервал - расчетный показатель средний интервал отгрузок (в днях). Он рассчитывается как:
«Дата первой отгрузки» - «Дата последней отгрузки» / «количество отгрузок»
В том случае, когда отгрузка была только одна, то в колонке Интервал выводится «разовая».
Срок - расчетный показатель срок последней отгрузки (в днях), определяющий, как давно прошла последняя отгрузка. Он рассчитывается как: Конец периода отчета» - «Дата последнего документа отгрузки»
Остатки товаров на 01.01.2010
Номенклатура    Партия    Кол-во    Стоимость
Куртка замшевая        4    350
   Прих. Накладная №1    2    250
   Прих. Накладная №2    2    100
Портсигар        6    65
   Прих. Накладная №1    5    50
   Прих. Накладная №3    1    15
25 CalvinKlein
 
27.09.11
22:43
26 CalvinKlein
 
27.09.11
22:43
27 zak555
 
27.09.11
22:44
28 zak555
 
27.09.11
22:44
а пользователь может не указать партию ?
29 CalvinKlein
 
27.09.11
22:47
наверное да, если это услуга
30 zak555
 
28.09.11
02:13
что-то похоже делал, только хз - рабочее или нет =)




Процедура ОбработкаПроведения(Отказ, Режим)
   
   Движения.ОстаткиНоменклатуры.Записывать    = Истина;
   Движения.СтоимостьНоменклатуры.Записывать    = Истина;
   Движения.Продажи.Записывать                = Истина;
   
   МенеджерВТ = Новый МенеджерВременныхТаблиц;

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

   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   Запрос.Выполнить();
   
   ПарамПеречисления = Перечисления.ВидыНоменклатуры.Товар;

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

           // регистр СтоимостьНоменклатуры Расход
           Движение = Движения.СтоимостьНоменклатуры.Добавить();
           Движение.ВидДвижения        = ВидДвиженияНакопления.Расход;
           Движение.Период            = Дата;
           Движение.Номенклатура        = ВыборкаДетальныеЗаписи.Номенклатура;
           Движение.Партия            = ВыборкаДетальныеЗаписи.Партия;
           Движение.Стоимость            = СтоимостьТовара * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
           
       КонецЕсли;
       
       // регистр Продажи
       Движение = Движения.Продажи.Добавить();
       Движение.Период                = Дата;
       Движение.Номенклатура            = ВыборкаДетальныеЗаписи.Номенклатура;
       Движение.Количество            = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
       Движение.Себестоимость            = СтоимостьТовара * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
       Движение.Выручка                = ВыборкаДетальныеЗаписи.СуммаВДокументе;

   КонецЦикла;

   Движения.Записать();

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

       ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
       Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
           
           Сообщение = Новый СообщениеПользователю();
           Сообщение.Текст = "Не хватает " + Строка(ВыборкаДетальныеЗаписи.КоличествоОстаток) + " товара "
               + Строка(ВыборкаДетальныеЗаписи.Номенклатура) + " из партии " + Строка(ВыборкаДетальныеЗаписи.Партия);
           Сообщение.Сообщить();
           
           Отказ = Истина;            
       КонецЦикла;        
       
   КонецЕсли;
КонецПроцедуры
31 zak555
 
28.09.11
09:00
где ж критики ? =)
32 zak555
 
28.09.11
09:49
МенеджерВТ = Новый МенеджерВременныхТаблиц;

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

Запрос.УстановитьПараметр("ВидНоменклатуры",    ПарамПеречисления);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Выполнить();

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;    
Запрос.Текст =
   "ВЫБРАТЬ
   |    НоменклатураПартииДокумента.Номенклатура,
   |    НоменклатураПартииДокумента.ВидНоменклатуры,
   |    НоменклатураПартииДокумента.Партия,
   |    НоменклатураПартииДокумента.КоличествоВДокументе,
   |    НоменклатураПартииДокумента.СуммаВДокументе,
   |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК Количество,
   |    ЕСТЬNULL(СтоимостьНоменклатурыОстатки.СтоимостьОстаток, 0) КАК Стоимость
   |ИЗ
   |    НоменклатураПартииДокумента КАК НоменклатураПартииДокумента
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( &МоментВремени
   |                ,
   |                Номенклатура В (ВЫБРАТЬ НоменклатураТоварСПартией.Номенклатура
   |                                ИЗ НоменклатураТоварСПартией)
   |                        
   |                    И Партия В (ВЫБРАТЬ НоменклатураТоварСПартией.Партия
   |                                ИЗ НоменклатураТоварСПартией)
   |                        ) КАК ОстаткиНоменклатурыОстатки
   |
   |        ПО НоменклатураПартииДокумента.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
   |            И НоменклатураПартииДокумента.Партия = ОстаткиНоменклатурыОстатки.Партия
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.Остатки( &МоментВремени
   |                ,
   |                Номенклатура В (ВЫБРАТЬ НоменклатураТоварСПартией.Номенклатура
   |                                ИЗ НоменклатураТоварСПартией)
   |
   |                    И Партия В (ВЫБРАТЬ НоменклатураТоварСПартией.Партия
   |                                ИЗ НоменклатураТоварСПартией)
   |                        ) КАК СтоимостьНоменклатурыОстатки
   |        ПО НоменклатураПартииДокумента.Номенклатура = СтоимостьНоменклатурыОстатки.Номенклатура
   |            И НоменклатураПартииДокумента.Партия = СтоимостьНоменклатурыОстатки.Партия"
   ;


Запрос.УстановитьПараметр("МоментВремени",        МоментВремени());
33 zak555
 
28.09.11
10:02
вот наверное оптимальнее -)


Процедура ОбработкаПроведения(Отказ, Режим)

Движения.ОстаткиНоменклатуры.Записывать    = Истина;
Движения.СтоимостьНоменклатуры.Записывать    = Истина;
Движения.Продажи.Записывать                = Истина;

МенеджерВТ = Новый МенеджерВременныхТаблиц;

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

Запрос.УстановитьПараметр("ВидНоменклатуры",    ПарамПеречисления);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Выполнить();

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


Запрос.УстановитьПараметр("ГраницаБезЭтогоДокумента", Новый Граница(Дата, ТипГраницы.НеВключая));

Движения.ОстаткиНоменклатуры.    БлокироватьДляИзменения = Истина;
Движения.СтоимостьНоменклатуры.    БлокироватьДляИзменения = Истина;
//очищать теперь не надо будет (!)
//Движения.ОстаткиНоменклатуры.    Очистить();
//Движения.СтоимостьНоменклатуры.    Очистить();

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

       // регистр СтоимостьНоменклатуры Расход
       Движение = Движения.СтоимостьНоменклатуры.Добавить();
       Движение.ВидДвижения        = ВидДвиженияНакопления.Расход;
       Движение.Период            = Дата;
       Движение.Номенклатура        = ВыборкаДетальныеЗаписи.Номенклатура;
       Движение.Партия            = ВыборкаДетальныеЗаписи.Партия;
       Движение.Стоимость            = СтоимостьТовара * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
       
   КонецЕсли;
   
   // регистр Продажи
   Движение = Движения.Продажи.Добавить();
   Движение.Период                = Дата;
   Движение.Номенклатура            = ВыборкаДетальныеЗаписи.Номенклатура;
   Движение.Количество            = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
   Движение.Себестоимость            = СтоимостьТовара * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
   Движение.Выручка                = ВыборкаДетальныеЗаписи.СуммаВДокументе;

КонецЦикла;

Движения.Записать();

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

   ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       
       Сообщение = Новый СообщениеПользователю();
       Сообщение.Текст = "Не хватает " + Строка(ВыборкаДетальныеЗаписи.КоличествоОстаток) + " товара "
           + Строка(ВыборкаДетальныеЗаписи.Номенклатура) + " из партии " + Строка(ВыборкаДетальныеЗаписи.Партия);
       Сообщение.Сообщить();
       
       Отказ = Истина;            
   КонецЦикла;        
   
КонецЕсли;
КонецПроцедуры
34 zak555
 
28.09.11
10:07
не
ТидГраницы.НеВключая
а
ВидГраницы.НеВключая
35 CalvinKlein
 
28.09.11
14:17
(33) Сложнова-то) А зачем ты разграничения делал для оперативного и не оперативного, какая логика?
36 zak555
 
28.09.11
18:42
(35) так пойми : зачем 1с в принципе зачем ввела это понятие
37 zak555
 
29.09.11
00:04
так и не было комментаторов
38 kuza2000
 
29.09.11
00:23
(5) чет я не пойму...
Вроде после

             ДетальнаяВыборка = ВыборкаЗаписей.Выбрать();

ДетальнаяВыборка имеет тип ВыборкаИзРезультатаЗапроса, соответственно ее надо обходить ДетальнаяВыборка.Следующий() и т.д...
Программист всегда исправляет последнюю ошибку.