Всем доброго дня.
Занимаюсь изучением программирования/конфигурирования 1с и для этого с нуля пишу свою конфигурацию, дабы глубже вникнуть.
возникла следующая ситуация:
Остатки на складе хранятся не только в разрезе номенклатуры но и в разрезе цен закупки и счета закупа.
т.е. регистр накопления имеет следующие реквизиты:

Номенклатура
Цена
СредстваЗакупки

И измерение
Количество.

В проводимом документе в табличной части так же есть эти реквизиты.
Для проведения документа и проверки остатков решил воспользоваться новым методом, т.е. списываем а потом смотрим что ушло в минус. Родился следующий код:

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

    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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

    РезультатЗапроса = Запрос.Выполнить();
    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    **************

    //тут располагается мудреный код движения по регистрам

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

    //После проведения проверяем остатки по номенклатуре которую списывали. елси ушли в минус то отменяем проведение.
    Движения.Записать();//добавил для новой методики проверки остатков

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

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

Проблема данного кода заключается в следующем. Предположим на складе есть:

|Номенклатура|ЦенаЗакупа|СчетЗакупа |количество|
| Стул | 11.20 |Основной | 5 |
| Стул | 15 |Не Основной | 1 |

Если АктВыполненыхРабот содержит стулья по одной цене, то все отрабатывает корректно. при этом не важно одной строчкой или несколькими строками. все пересчитывается.
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула

Понимаю что проблема где то есть ) но пока не могу ее найти. взываю к вашему опыту.
---
Всем спасибо. Нашел ошибку.
Вот этот вот цикл все портил

"Пока ВыборкаДетальныеЗаписи.Следующий() Цикл"

Убрал его и все заработало как надо.
Около часа тестировал разными комбинациями, все отрабатывает корректно. Этот цикл запускал движения по регистрам столько раз сколько строк в табличной части.
---
```1c
    |СГРУППИРОВАТЬ ПО
    | АктВыполненыхРаботЗИП.Номенклатура,
    | АктВыполненыхРаботЗИП.ЦенаЗакупки,
    | АктВыполненыхРаботЗИП.СчетЗакупа
```

--------------------
вот это лишнее | АктВыполненыхРаботЗИП.ЦенаЗакупки,
---
не факт, точной структуры ведь нет
---
хм. а разве если я буду группировать по ценам, не получится так что будет сгруппирована разная номенклатура с одинаковой ценой. пример. стул по три рубля две штуки и чайник по три рубля одна штука. в итоге у меня есть три непонятно чего.
---
Видимо, проводки получаются не такие как задумано. Попробуйте отключить контроль и посмотреть действительно ли остатки уходят в минус.
---
закоментировал весь код проверки на остатки. оставил только проводки.

получилось следующее.
Остатки:
стул 11,20 в колличестве 5 штук
стул 15.00 в колличестве 1 штука

списываю:
стул 11,20 в колличестве 6 штук
стул 15,00 в колличестве 2 штука

на остатках:
стул 11,20 в колличестве -1 штук
стул 15,00 в колличестве -1 штука

Но есть одна интересная фишка.
Если закомментировать только строку
"Отказ = Истина; "
получается что то странное.

Остатки:
стул 11,20 в колличестве 5 штук
стул 15.00 в колличестве 1 штука

списываю:
стул 11,20 в колличестве 6 штук
стул 15,00 в колличестве 2 штука

на остатках:
стул 11,20 в колличестве -7 штук
стул 15,00 в колличестве -3 штука
---
Все логично, нет отказа - значит новые движения добавились в базу, еще раз перепроведете, получите еще больший минус.

(1) а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула
Косячит процедура списания. Списывает все с одной цены, проверяйте свой код.
---
нет, не логично. Было 5 стульев. Один списал. Стало -6.
---
Вот тут ничего не понятно, приложите скриншот, где видно структуру регистра

т.е. регистр накопления имеет следующие реквизиты:

Номенклатура
Цена
СредстваЗакупки

И измерение
Количество.
---
А вообще, как я понял, то остатки хранятся в разрезе цен, а при проверке получаете их только по номенклатуре.
---
Всем спасибо. Нашел ошибку.
Вот этот вот цикл все портил

"Пока ВыборкаДетальныеЗаписи.Следующий() Цикл"

Убрал его и все заработало как надо.
Около часа тестировал разными комбинациями, все отрабатывает корректно. Этот цикл запускал движения по регистрам столько раз сколько строк в табличной части.
---
ошибка точно не в "Пока ВыборкаДетальныеЗаписи.Следующий() Цикл", а в "//тут располагается мудреный код движения по регистрам".
Как можно по одной записи из выборки "Правильно" сделать движения?
Тут 2 вариант: или там движения строились не на основании данных из выборки, или движения совсем не правильные.
---
в коде два запроса. Первый выбирает данные из документа и помещает во временную таблицу. Все данные. Затем выполняется проводка документа, не на основании выборки а как это бы выпооеялось, если бы проверки на остатки не было вообще. После этого запускается второй запрос, который берет номенклатуру из временной таблицы и проверяет ее остатки в регистре накопления.
Так что ошибка как раз в той строке, которую я указал.
---
Затем выполняется проводка документа, не на основании выборки а как это бы выпооеялось, если бы проверки на остатки не было вообще
Вот о чем я и подразумевал под первым вариантом. Движения делались не на основании выборки из запроса. Тогда смысла первого запроса? Он тогда совсем не нужен, а не просто проход выборки.
---
смысл первой выборки в том, что бы не делать проверку отрицательных остатков по всему регистру, а только ту номенклатуру, что учавствовала в конкретном документе. Иначе возникнет следующая ситуация, что если на складе из ща какой либо ошибки возникнет отрицательный остаток по одной номенклатуре, то больше не получится провести ни ни один документ, так как эта, сбойная номенклатура всегда будет попадать во вторую выборку.
---
да не используете первую выборку совсем. Во всяком случае в приведенном коде. Движения делаете без учета первой выборки. Первая выборка просто для красоты. Из запроса используете только ВТ для последующего запроса. С таким же успехом можно было ВТ делать сразу во втором запросе и первый запрос просто не нужен был бы.