При проведении документа Отчет о розничных продажах программа выдает ошибку
Некорректно заполнена колонка "Количество" в строке 1 списка "Товары". Указанное количество превышает остаток. Остаток: 0; Не хватает: N.
Далее документ не проводится. Возможно возникает при проведении на других видах документов.
Описание ошибки :
Общий модуль УчетТоваров содержит процедуру
Процедура СписатьОстаткиТоваровИСообщитьОбОшибке(ТаблицаСписаниеПоОстаткам, ТаблицаОстатки, ТаблицаСписанныеТовары, ТаблицаВыпущеннаяПродукция, СпособОценкиМПЗПоСредней, КонтролироватьОстаток, Реквизиты, Отказ)
ТаблицаОшибок = ТаблицаОшибокСписанияТоваров();
ПараметрыСписания = НовыйПараметрыСписанияТоваров();
ПараметрыСписания.Регистратор = Реквизиты.Регистратор;
ПараметрыСписания.Организация = Реквизиты.Организация;
ПараметрыСписания.Период = Реквизиты.Период;
ПараметрыСписания.Подразделение = Реквизиты.Подразделение;
ПараметрыСписания.СпособОценкиМПЗПоСредней = СпособОценкиМПЗПоСредней;
СписатьОстаткиТоваров(ТаблицаСписаниеПоОстаткам, ТаблицаОстатки, ТаблицаСписанныеТовары, ТаблицаВыпущеннаяПродукция, ТаблицаОшибок, ПараметрыСписания);
Если ТаблицаОшибок.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаОшибки Из ТаблицаОшибок Цикл
Если Не КонтролироватьОстаток И Не БухгалтерскийУчетПовтИсп.СчетУчетаКомиссионногоТовара(СтрокаОшибки.СчетУчета) Тогда
Продолжить;
КонецЕсли;
Если БухгалтерскийУчетПереопределяемый.ДокументЯвляетсяРазукомплектацией(Реквизиты.Регистратор) Тогда
ВывестиСообщениеОбОшибке(
ТаблицаОшибок.Итог("Количество"),
ТаблицаОшибок.Итог("КоличествоОсталосьПогасить"),
Реквизиты.Регистратор,,,,Отказ);
Иначе
Для Каждого СтрокаТаблицыОшибок Из ТаблицаОшибок Цикл
ВывестиСообщениеОбОшибке(
СтрокаТаблицыОшибок.Количество,
СтрокаТаблицыОшибок.КоличествоОсталосьПогасить,
Реквизиты.Регистратор,
СтрокаТаблицыОшибок.ИмяСписка,
СтрокаТаблицыОшибок.СинонимСписка,
СтрокаТаблицыОшибок.НомерСтроки,
Отказ);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
как видно параметр КонтролироватьОстаток присутствует, далее по тексту идет вызов процедуры СписатьОстаткиТоваров
СписатьОстаткиТоваров(ТаблицаСписаниеПоОстаткам, ТаблицаОстатки, ТаблицаСписанныеТовары, ТаблицаВыпущеннаяПродукция, ТаблицаОшибок, ПараметрыСписания);
но при этом параметр КонтролироватьОстаток почему то не передается ! И это приводит к возникновению ошибки. В более ранних релизах передавался.
Для исправления ситуации необходимо внести исправление в процедуру СписатьОстаткиТоваров .
Текст исправленой процедуры :
Процедура СписатьОстаткиТоваров(ТаблицаСписаниеПоОстаткам, ТаблицаОстатки, ТаблицаСписанныеТовары, ТаблицаВыпущеннаяПродукция, ТаблицаОшибок, ПараметрыСписания)
// Исправление 3.0.96.35
ИспользуетсяОтложенноеПроведение = ПроведениеСервер.ИспользуетсяОтложенноеПроведение(ПараметрыСписания.Организация, ПараметрыСписания.Период);
КонтролироватьОстаток = НЕ БухгалтерскийУчетПереопределяемый.ОтключитьКонтрольОтрицательныхОстатков()
И НЕ ИспользуетсяОтложенноеПроведение;
// Исправление 3.0.96.35
ЕстьКолонкаВозвратПоТекущемуДокументу = ТаблицаСписаниеПоОстаткам.Колонки.Найти("ВозвратПоТекущемуДокументу") <> Неопределено;
ПустойСклад = Справочники.Склады.ПустаяСсылка();
УчетВыпускаПродукцииПоДаннымПродаж = УчетнаяПолитика.УчетВыпускаПродукцииПоДаннымПродаж(
ПараметрыСписания.Организация, ПараметрыСписания.Период);
СчетаУчетаПродукцииДляВыпуска = РасчетВыпускаПоДаннымПродаж.СчетаУчетаПродукцииДляВыпуска();
Для каждого СтрокаДокумента Из ТаблицаСписаниеПоОстаткам Цикл
КоличествоОсталосьПогасить = СтрокаДокумента.Количество;
ЭтоПродажаПоКоторойБылВозврат = Ложь;
// Если по этой продаже был возврат, то пометим это
Если ЕстьКолонкаВозвратПоТекущемуДокументу
И СтрокаДокумента.ВозвратПоТекущемуДокументу Тогда
ЭтоПродажаПоКоторойБылВозврат = Истина;
КонецЕсли;
Если ТаблицаОстатки.Количество() <> 0 Тогда
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", СтрокаДокумента.Номенклатура);
ПараметрыОтбора.Вставить("СчетУчета", СтрокаДокумента.СчетУчета);
Если ЗначениеЗаполнено(СтрокаДокумента.ДокументОприходования) Тогда
Если (НЕ ПараметрыСписания.СпособОценкиМПЗПоСредней ИЛИ БухгалтерскийУчетПовтИсп.СчетУчетаКомиссионногоТовара(СтрокаДокумента.СчетУчета))
И БухгалтерскийУчет.НаСчетеВедетсяПартионныйУчет(СтрокаДокумента.СчетУчета) Тогда
ПараметрыОтбора.Вставить("ДокументОприходования", СтрокаДокумента.ДокументОприходования);
КонецЕсли;
КонецЕсли;
ПартииОстатков = ТаблицаОстатки.Скопировать(ПараметрыОтбора);
ПартииОстатков.Сортировать("ДокументОприходованияДата, ДокументОприходования", Новый СравнениеЗначений);
Для каждого СтрокаПартии Из ПартииОстатков Цикл
Если КоличествоОсталосьПогасить <= 0 Тогда
Прервать;
КонецЕсли;
Если СтрокаПартии.КоличествоПоСкладу <= 0
ИЛИ СтрокаПартии.Количество <= 0 Тогда
Продолжить;
КонецЕсли;
Если БухгалтерскийУчет.ВедетсяУчетПоСкладам(СтрокаДокумента.СчетУчета) Тогда
Если СтрокаПартии.Склад <> СтрокаДокумента.Склад
И НЕ СтрокаПартии.Склад = ПустойСклад Тогда // пустые склады могут остаться со времени, когда не было учета по складам
Продолжить;
КонецЕсли;
КонецЕсли;
Количество = Мин(СтрокаПартии.КоличествоПоСкладу, КоличествоОсталосьПогасить);
Стоимость = Окр(СтрокаПартии.Стоимость * Количество / СтрокаПартии.Количество, 2, 1);
СтоимостьНУ = Окр(СтрокаПартии.СтоимостьНУ * Количество / СтрокаПартии.Количество, 2, 1);
СтоимостьПР = Окр(СтрокаПартии.СтоимостьПР * Количество / СтрокаПартии.Количество, 2, 1);
СтоимостьВР = Окр(СтрокаПартии.СтоимостьВР * Количество / СтрокаПартии.Количество, 2, 1);
Если (СтрокаПартии.Стоимость = СтрокаПартии.СтоимостьНУ + СтрокаПартии.СтоимостьВР + СтрокаПартии.СтоимостьПР)
И (Стоимость <> СтоимостьНУ + СтоимостьВР + СтоимостьПР) Тогда
СтоимостьВР = Стоимость - СтоимостьНУ - СтоимостьПР;
КонецЕсли;
КоличествоОсталосьПогасить = КоличествоОсталосьПогасить - Количество;
Если НЕ ЭтоПродажаПоКоторойБылВозврат Тогда
СтрокаТаблицыОстатки = ТаблицаОстатки.Найти(СтрокаПартии.НомерСтроки, "НомерСтроки");
СтрокаТаблицыОстатки.Количество = СтрокаТаблицыОстатки.Количество - Количество;
СтрокаТаблицыОстатки.Стоимость = СтрокаТаблицыОстатки.Стоимость - Стоимость;
СтрокаТаблицыОстатки.СтоимостьНУ = СтрокаТаблицыОстатки.СтоимостьНУ - СтоимостьНУ;
СтрокаТаблицыОстатки.СтоимостьПР = СтрокаТаблицыОстатки.СтоимостьПР - СтоимостьПР;
СтрокаТаблицыОстатки.СтоимостьВР = СтрокаТаблицыОстатки.СтоимостьВР - СтоимостьВР;
СтрокаТаблицыОстатки.КоличествоПоСкладу = СтрокаТаблицыОстатки.КоличествоПоСкладу - Количество;
КонецЕсли;
СписаннаяПартия = ТаблицаСписанныеТовары.Добавить();
ЗаполнитьЗначенияСвойств(СписаннаяПартия, СтрокаДокумента);
СписаннаяПартия.Подразделение = СтрокаПартии.Подразделение;
СписаннаяПартия.Партия = СтрокаПартии.ДокументОприходования;
СписаннаяПартия.Склад = СтрокаПартии.Склад;
СписаннаяПартия.Количество = Количество;
СписаннаяПартия.СуммаСписания = Стоимость;
СписаннаяПартия.СуммаСписанияНУ = СтоимостьНУ;
СписаннаяПартия.СуммаСписанияПР = СтоимостьПР;
СписаннаяПартия.СуммаСписанияВР = СтоимостьВР;
СписаннаяПартия.СуммаКорСписанияНУ = СтоимостьНУ;
СписаннаяПартия.СуммаКорСписанияПР = СтоимостьПР;
СписаннаяПартия.СуммаКорСписанияВР = СтоимостьВР;
Если НЕ ТаблицаСписанныеТовары.Колонки.Найти("РассчитатьСебестоимостьПоТекущимПродажам") = Неопределено
И СписаннаяПартия.РассчитатьСебестоимостьПоТекущимПродажам Тогда
СписаннаяПартия.РассчитатьСебестоимостьПоТекущимПродажам = Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если УчетВыпускаПродукцииПоДаннымПродаж
И ТаблицаВыпущеннаяПродукция <> Неопределено
И КоличествоОсталосьПогасить > 0
И МожноВыпуститьПродукциюПриСписании(ПараметрыСписания.Регистратор, СтрокаДокумента, СчетаУчетаПродукцииДляВыпуска) Тогда
СведенияОПродукции = СведенияОПродукцииДляВыпуска(СтрокаДокумента.Номенклатура, КоличествоОсталосьПогасить, ПараметрыСписания.Период);
Если ЗначениеЗаполнено(СведенияОПродукции.Спецификация) Тогда
ВыпуститьПродукциюИСписать(СтрокаДокумента, СведенияОПродукции, ТаблицаСписанныеТовары, ТаблицаВыпущеннаяПродукция, ПараметрыСписания);
КоличествоОсталосьПогасить = 0;
КонецЕсли;
КонецЕсли;
// Несписанное количество добавим отдельной строкой в таблицу списанных партий.
Если КоличествоОсталосьПогасить > 0 Тогда
СписаннаяПартия = ТаблицаСписанныеТовары.Добавить();
ЗаполнитьЗначенияСвойств(СписаннаяПартия, СтрокаДокумента);
СписаннаяПартия.СчетУчета = СтрокаДокумента.СчетУчета;
СписаннаяПартия.Подразделение = ПараметрыСписания.Подразделение;
СписаннаяПартия.Количество = КоличествоОсталосьПогасить;
КонецЕсли;
// Если не хватает товара для списания, то зарегистрируем ошибку в таблице ошибок.
// Будет ли продолжено выполнение или пользователю будет выдано сообщение решит код, который вызвал эту процедуру.
// Например, сообщения об ошибке может и не быть, если включена возможность списания без остатков.
// Исправление 3.0.96.35
// добавлена проверка на контроль остатков, условие (И КонтролироватьОстаток)
Если КоличествоОсталосьПогасить > 0 И КонтролироватьОстаток Тогда
ЗарегистрироватьОшибку = Истина;
Если НЕ ТаблицаСписаниеПоОстаткам.Колонки.Найти("ВозвратПоТекущемуДокументу") = Неопределено
И СписаннаяПартия.ВозвратПоТекущемуДокументу Тогда
ЗарегистрироватьОшибку = Ложь;
КонецЕсли;
Если ЗарегистрироватьОшибку Тогда
СтрокаТаблицыОшибок = ТаблицаОшибок.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицыОшибок, СтрокаДокумента);
СтрокаТаблицыОшибок.КоличествоОсталосьПогасить = КоличествоОсталосьПогасить;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Чтобы не менять конфигурацию, берем текст процедуры, добавляем в расширение с аннотацией &Вместо("СписатьОстаткиТоваров") и после этого программа работает исправно.
Готового решения данной проблемы не нашёл, поэтому набросал расширение для исправления данной ситуации.
Все исправления обозначены комментарием // Исправление 3.0.96.35
Ошибка воспроизводится на релизе 3.0.96.5. Надеюсь, в следующем релизе ситуацию исправят.