Утро доброе всем! Помогите пожалуйста упростить процедуру, пытаюсь избавиться от ВТ, но получается ахинея какая-то(((

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

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

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

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

  Движения.СтоимостьТовара.Записать();
 Движения.ТоварыНаСкладах.Записать();

 Результат = Запрос2.Выполнить();

 Выборка = Результат.Выбрать();

 Пока Выборка.Следующий() Цикл
  Если Выборка.Количество = 0 Тогда
   Стоимость = 0;
   Иначе
   СтоимостьТовара = Выборка.Стоимость / Выборка.Количество;

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

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

   Запрос3.УстановитьПараметр("Склад", Склад);
   Результат = Запрос3.Выполнить();
   Выборка = Результат.Выбрать();

   Пока Выборка.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "Не хватает "+Строка(-Выборка.КоличествоОстаток)+" единиц товара """+Выборка.Номенклатура+"""";
    Сообщение.Сообщить();
    Отказ = Истина;

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

КонецПроцедуры
---
Сам запрос объединенный, если просто объединять, то как-то так будет выглядеть:

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

Допустим, если есть алгоритм, который отменяет проведение документа, то, по-уму, в начале нужно выполнить его, а уже потом огород городить! :)
---
1. Для очистки движений документа в типовых конфигурациях есть процедура:

```1c
    ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
```

2. все запросы можно объединить в один пакетный запрос. При этом менеджер ВТ будет не нужен.
---
kansler, а можете помочь?? я вот тут именно и встала((
---
Сам запрос объединенный, если просто объединять, то как-то так будет выглядеть:

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