Имя: Пароль:
1C
1С v8
Ошибка запроса
0 Альбатрос
 
07.05.13
10:09
Уважаемые, задача такая: перебрать за определенный период номенклатуру в документах прихода в НТТ, посмотреть по этой номенклатуре остатки в регистре ТоварыНТТ и заполнить переоценку.

Мой вариант:

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

   Результат = Запрос.Выполнить();
   
   Если Результат.Пустой() тогда
       Сообщить("Создание переоценки: ошибка обработки!!! Не верно передан период!");
       Возврат;
   КонецЕсли;
   
   Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока Выборка.Следующий() цикл
        Склад = Выборка.Склад;
        Записи = Выборка.Выбрать();
        Пока Записи.Следующий() цикл
           ДатаПрихода = Записи.ДатаПрихода;
           Организация = Записи.Организация;
           ДокПереоценки = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
           ДокПереоценки.Дата = ДатаПрихода+60;
           ДокПереоценки.ВидОперации = Перечисления.ВидыОперацийПереоценкаТоваровВРознице.ПереоценкаВНТТ;
           ДокПереоценки.Организация = Организация;
           ДокПереоценки.Склад = Склад;
           ДокПереоценки.Комментарий = "Создан автоматически";
           СтрокаПереоценки = ДокПереоценки.Товары.Добавить();
           СтрокаПереоценки.Номенклатура = Записи.Номенклатура;
           СтрокаПереоценки.Количество = Записи.Количество;
           СтрокаПереоценки.ЦенаВРозницеСтарая = Записи.ЦенаВРегистре;
           СтрокаПереоценки.ЦенаВРознице = Записи.ЦенаВРознице;
               
       КонецЦикла;
       ДокПереоценки.Записать();
       КонецЦикла;


Некорректно работает, создается документ переоценки только с одной строчкой, а документов прихода за обрабатываемый период куча. Где я ошибся?
1 braynt
 
07.05.13
10:11
а итоги зачем?
2 Альбатрос
 
07.05.13
10:11
Все, сообразил =) Сам дурак )))
3 kosts
 
07.05.13
10:11
Перенеси в первый цикл
ДокПереоценки = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
4 Альбатрос
 
07.05.13
10:12
(3) ага )
5 Альбатрос
 
07.05.13
10:12
(1) Я так понял, выборка по группировкам работать так не будет, не?
6 Альбатрос
 
13.05.13
11:56
Задача изменилась. Нужно создать документ переоценки на конец дня, когда был приход. При этом включит в один документ переоценки позиции со всех док-ов поступления в разрезе склада.

Переработал запрос. Работает неправильно:

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

       КонецЦикла;
   КонецЦикла;
   


В результате за период выборки создаются документы только по одному складу. Как сделать обход группировок,т чтоб создавались для всех?
7 sttt
 
13.05.13
12:07
Склад = Выборка.Склад;
       ЗаписиПоДате = Склад.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ДатаПрихода");
8 Альбатрос
 
13.05.13
12:15
(7) не идет, метод "выбрать" не обнаружен.
Тип значения "Склад" = СправочникСсылка.Склад
9 sttt
 
13.05.13
12:20
ошибся))
10 Альбатрос
 
13.05.13
12:23
(9) а жаль )))
11 Альбатрос
 
13.05.13
12:26
Вообщем, хочу получить такое:
-Склад1
---Дата1
------ДетальныеЗаписи
---Дата2
------ДетальныеЗаписи
-Склад2
---Дата1
------ДетальныеЗаписи
---Дата3
------ДетальныеЗаписи

Ну и так же обходить. То есть получить первый склад, получить первую дату, получить список номенклатуры на эту дату, получить вторую дату и т.д и т.п.

Надеюсь, доступно объяснил =)
12 zak555
 
13.05.13
12:29
зачем ты перебираешь документы поступлений ?
13 Ёпрст
 
13.05.13
12:29
(6)
записывать документ в конце вестимо
14 Альбатрос
 
13.05.13
12:32
(12) Потому что в док-ах есть реквизит "Переоценять", на основе которого обработка понимает, что его нужно переоценить
15 zladenuw
 
13.05.13
12:33
в запросе сортировку. по склад, ДатаПрихода
16 Альбатрос
 
13.05.13
12:35
(13) Запись док-та стоит в правильном месте, после перебора товара за дату.
17 Альбатрос
 
13.05.13
12:36
(15) Хм... не вижу связи, но щас попробую
18 Ёпрст
 
13.05.13
12:38
(16) а чего не устраивает тогда ?
Новый документ где хоть создаешь ?

Надеюсь, в обходе первой группировке по складу ?
19 Ёпрст
 
13.05.13
12:38
или по дате (хз, где тебе именно надо - по складам или датам доки лепить)
20 Альбатрос
 
13.05.13
12:39
(18) В обходе по дате. Он и создает по дате, только почему-то только на один склад
21 Альбатрос
 
13.05.13
12:40
(15) Сортировка не помогла
22 sttt
 
13.05.13
12:45
(20) в отладчике посмотри, есть ли у тебя несколько складов...
23 Альбатрос
 
13.05.13
12:50
Мля, может я хренова объяснил?
Допустим:
1янв - поступление1 - склад Основной
1янв - поступление2 - склад Основной
1янв - поступление3 - склад Вторичный
2янв - поступление4 - склад Основной
2янв - поступление5 - склад Вторичный
2янв - поступление6 - склад Вторичный

Я хочу, чтоб создалось:
На 1янв
Переоценка1 по складу основной с товаром из пост-ния 1 и 2
Переоценка2 по складу Вторичный с товаром из пост-ния 3
На 2янв
Переоценка3 по складу основной с товаром из пост-ния 4
Переоценка4 по складу Вторичный с товаром из пост-ния 5 и 6

А у меня получаются только переоценка 1 и 3
24 Альбатрос
 
13.05.13
12:53
(22) В отладчике на выборке 2 строки всего
В том и дело, если убрать итоги по ДатаПрихода и соответственно обход по ним, то получаю корректировки по каждому складу. С обходом по датам корректировки только по одному =(
25 sttt
 
13.05.13
12:55
в тз выгрузи
26 Альбатрос
 
13.05.13
12:58
(24) Не, наврал: 5 разных складов в "выборка". Странно...
27 Альбатрос
 
13.05.13
13:05
Мужики, прошу прощения за отнятое время!
Всему виной вот эти 2 условия:
               Если Записи.ЦенаВРегистре = Записи.ЦенаВРознице тогда
                   Продолжить;
               КонецЕсли;

       Если ДокПереоценки.Товары.Количество() >0 тогда
           ДокПереоценки.Записать();
       КонецЕсли;

Спасибо большое за помощь!!!