Всем доброго дня.
Занимаюсь изучением программирования/конфигурирования 1с и для этого с нуля пишу свою конфигурацию, дабы глубже вникнуть.
возникла следующая ситуация:
Остатки на складе хранятся не только в разрезе номенклатуры но и в разрезе цен закупки и счета закупа.
т.е. регистр накопления имеет следующие реквизиты:
Номенклатура
Цена
СредстваЗакупки
И измерение
Количество.
В проводимом документе в табличной части так же есть эти реквизиты.
Для проведения документа и проверки остатков решил воспользоваться новым методом, т.е. списываем а потом смотрим что ушло в минус. Родился следующий код:
Проблема данного кода заключается в следующем. Предположим на складе есть:
|Номенклатура|ЦенаЗакупа|СчетЗакупа |количество|
| Стул | 11.20 |Основной | 5 |
| Стул | 15 |Не Основной | 1 |
Если АктВыполненыхРабот содержит стулья по одной цене, то все отрабатывает корректно. при этом не важно одной строчкой или несколькими строками. все пересчитывается.
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула
Понимаю что проблема где то есть ) но пока не могу ее найти. взываю к вашему опыту.
Занимаюсь изучением программирования/конфигурирования 1с и для этого с нуля пишу свою конфигурацию, дабы глубже вникнуть.
возникла следующая ситуация:
Остатки на складе хранятся не только в разрезе номенклатуры но и в разрезе цен закупки и счета закупа.
т.е. регистр накопления имеет следующие реквизиты:
Номенклатура
Цена
СредстваЗакупки
И измерение
Количество.
В проводимом документе в табличной части так же есть эти реквизиты.
Для проведения документа и проверки остатков решил воспользоваться новым методом, т.е. списываем а потом смотрим что ушло в минус. Родился следующий код:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| АктВыполненыхРаботЗИП.Номенклатура,
| СУММА(АктВыполненыхРаботЗИП.Колличество) КАК Колличество,
| АктВыполненыхРаботЗИП.ЦенаЗакупки,
| АктВыполненыхРаботЗИП.СчетЗакупа
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.АктВыполненыхРабот.ЗИП КАК АктВыполненыхРаботЗИП
|ГДЕ
| АктВыполненыхРаботЗИП.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| АктВыполненыхРаботЗИП.Номенклатура,
| АктВыполненыхРаботЗИП.ЦенаЗакупки,
| АктВыполненыхРаботЗИП.СчетЗакупа
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДокТЧ.Номенклатура,
| ДокТЧ.Колличество,
| ДокТЧ.ЦенаЗакупки,
| ДокТЧ.СчетЗакупа
|ИЗ
| ДокТЧ КАК ДокТЧ";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Движения.ОстаткиНоменклатуры.Записывать = Истина;
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
**************
//тут располагается мудреный код движения по регистрам
*************
КонецЦикла;
//После проведения проверяем остатки по номенклатуре которую списывали. елси ушли в минус то отменяем проведение.
Движения.Записать();//добавил для новой методики проверки остатков
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.КолличествоОстаток КАК Остаток,
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.СредстваЗакупки,
| ОстаткиНоменклатурыОстатки.Цена
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ КАК ДокТЧ)) КАК ОстаткиНоменклатурыОстатки
|ГДЕ
| ОстаткиНоменклатурыОстатки.КолличествоОстаток < 0";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не хватает товара " + Выборка.Номенклатура + ", после проведения документа остаток составит " + Выборка.Остаток;
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
КонецПроцедуры
ПоказатьПроблема данного кода заключается в следующем. Предположим на складе есть:
|Номенклатура|ЦенаЗакупа|СчетЗакупа |количество|
| Стул | 11.20 |Основной | 5 |
| Стул | 15 |Не Основной | 1 |
Если АктВыполненыхРабот содержит стулья по одной цене, то все отрабатывает корректно. при этом не важно одной строчкой или несколькими строками. все пересчитывается.
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула
Понимаю что проблема где то есть ) но пока не могу ее найти. взываю к вашему опыту.
По теме из базы знаний
- Проверки и исправления учета для правильного формирования книги покупок и книги продаж для Бухгалтерии 3.0 и Бухгалтерии 2.0
- [Расширение] Контроль отрицательных остатков по регистру бухгалтерии при проведении
- Исправление отрицательных остатков по организациям в УТ 11.4, КА 2.4, ЕРП 2.4. Интеркампани, механизм формирования резервов
- Задача на ошибки и неоптимальности при проведении приходной накладной
- Проведение оперативно-не-оперативно
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
закоментировал весь код проверки на остатки. оставил только проводки.
получилось следующее.
Остатки:
стул 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 штука
получилось следующее.
Остатки:
стул 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 штука
(6)Все логично, нет отказа - значит новые движения добавились в базу, еще раз перепроведете, получите еще больший минус.
(1)
Косячит процедура списания. Списывает все с одной цены, проверяйте свой код.
(1)
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула
Косячит процедура списания. Списывает все с одной цены, проверяйте свой код.
Всем спасибо. Нашел ошибку.
Вот этот вот цикл все портил
"Пока ВыборкаДетальныеЗаписи.Следующий() Цикл"
Убрал его и все заработало как надо.
Около часа тестировал разными комбинациями, все отрабатывает корректно. Этот цикл запускал движения по регистрам столько раз сколько строк в табличной части.
Вот этот вот цикл все портил
"Пока ВыборкаДетальныеЗаписи.Следующий() Цикл"
Убрал его и все заработало как надо.
Около часа тестировал разными комбинациями, все отрабатывает корректно. Этот цикл запускал движения по регистрам столько раз сколько строк в табличной части.
(11) ошибка точно не в "Пока ВыборкаДетальныеЗаписи.Следующий() Цикл", а в "//тут располагается мудреный код движения по регистрам".
Как можно по одной записи из выборки "Правильно" сделать движения?
Тут 2 вариант: или там движения строились не на основании данных из выборки, или движения совсем не правильные.
Как можно по одной записи из выборки "Правильно" сделать движения?
Тут 2 вариант: или там движения строились не на основании данных из выборки, или движения совсем не правильные.
(12)в коде два запроса. Первый выбирает данные из документа и помещает во временную таблицу. Все данные. Затем выполняется проводка документа, не на основании выборки а как это бы выпооеялось, если бы проверки на остатки не было вообще. После этого запускается второй запрос, который берет номенклатуру из временной таблицы и проверяет ее остатки в регистре накопления.
Так что ошибка как раз в той строке, которую я указал.
Так что ошибка как раз в той строке, которую я указал.
(13)
Вот о чем я и подразумевал под первым вариантом. Движения делались не на основании выборки из запроса. Тогда смысла первого запроса? Он тогда совсем не нужен, а не просто проход выборки.
Затем выполняется проводка документа, не на основании выборки а как это бы выпооеялось, если бы проверки на остатки не было вообще
Вот о чем я и подразумевал под первым вариантом. Движения делались не на основании выборки из запроса. Тогда смысла первого запроса? Он тогда совсем не нужен, а не просто проход выборки.
(14) смысл первой выборки в том, что бы не делать проверку отрицательных остатков по всему регистру, а только ту номенклатуру, что учавствовала в конкретном документе. Иначе возникнет следующая ситуация, что если на складе из ща какой либо ошибки возникнет отрицательный остаток по одной номенклатуре, то больше не получится провести ни ни один документ, так как эта, сбойная номенклатура всегда будет попадать во вторую выборку.
(15) да не используете первую выборку совсем. Во всяком случае в приведенном коде. Движения делаете без учета первой выборки. Первая выборка просто для красоты. Из запроса используете только ВТ для последующего запроса. С таким же успехом можно было ВТ делать сразу во втором запросе и первый запрос просто не нужен был бы.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот