Добрый день. Делаю контроль остатков и столкнулся с непонятностью, допустим нужно укомплектовать 4 номенклатуры системных блоков, 2 из них комплектуются нормально, следущие два вылетают с ошибкой, хотя остатки комплектующих в норме.
вот отрывок кода с остатками:
// 1. Получение запросом данных документа
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
|ПОМЕСТИТЬ Товары
|ИЗ
| Документ.СборкаПК.Комплектующие КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество
|ИЗ
| Товары КАК Товары";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
// 2. Формирование движений-расход регистра
Движения.ОстаткиТоваров.Очистить();
ВыборкаТовары = РезультатЗапроса.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаТовары.Номенклатура;
Движение.Количество = ВыборкаТовары.Количество;
КонецЦикла;
// 3. Запись движений в БД
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Записать();
// 4. Запрос, получающий отрицательные остатки из регистра
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| ПРЕДСТАВЛЕНИЕССЫЛКИ(Остатки.Номенклатура) КАК НоменклатураПредставление,
| -Остатки.КоличествоОстаток КАК Дефецит
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура
| ИЗ
| Товары КАК Товары)) КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток < 0";
ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);
РезультатЗапроса = Запрос.Выполнить();
// 5. Вывод сообщений о недостатке товаров
Если Не РезультатЗапроса.Пустой() Тогда
Отказ = Истина;
ВыборкаОшибки = РезультатЗапроса.Выбрать();
Пока ВыборкаОшибки.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товара "+ВыборкаОшибки.НоменклатураПредставление+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.";
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.СборкаПК.МодульОбъекта(80)}: Поле объекта не обнаружено (Дефицит)
Сообщение.Текст = "Товара "+ВыборкаОшибки.НоменклатураПредставление+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.";
Evgeniux @ Сегодня, 16:37
,
Грамматика? КАК ДефЕцит в запросе и ВыборкаОшибки.ДефИцит
MATEVI @ Сегодня, 19:23
,
Спасибо, исправил, но эта ошибка относилась больше к выводу сообщения пользователю. Если раньше выводилось, что просто чего-то не хватает, то сейчас выводится конкретная позиция.
На всякий случай привожу весь код процедуры:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр ОстаткиТоваров Расход
// Движения.ОстаткиТоваров.Записывать = Истина;
// 1. Получение запросом данных документа
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
|ПОМЕСТИТЬ Товары
|ИЗ
| Документ.СборкаПК.Комплектующие КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество
|ИЗ
| Товары КАК Товары";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
// 2. Формирование движений-расход регистра
Движения.ОстаткиТоваров.Очистить();
ВыборкаТовары = РезультатЗапроса.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаТовары.Номенклатура;
Движение.Количество = ВыборкаТовары.Количество;
КонецЦикла;
// 3. Запись движений в БД
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Записать();
// 4. Запрос, получающий отрицательные остатки из регистра
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| ПРЕДСТАВЛЕНИЕССЫЛКИ(Остатки.Номенклатура) КАК НоменклатураПредставление,
| -Остатки.КоличествоОстаток КАК Дефицит
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура
| ИЗ
| Товары КАК Товары)) КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток < 0";
ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);
РезультатЗапроса = Запрос.Выполнить();
// 5. Вывод сообщений о недостатке товаров
Если Не РезультатЗапроса.Пустой() Тогда
Отказ = Истина;
ВыборкаОшибки = РезультатЗапроса.Выбрать();
Пока ВыборкаОшибки.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товара "+ВыборкаОшибки.НоменклатураПредставление+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.";
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
Для Каждого ТекСтрокаКомплектующие Из Комплектующие Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаКомплектующие.Номенклатура;
Движение.Склад = Склад;
Движение.Серийник = ТекСтрокаКомплектующие.СерийныйНомер;
Движение.Количество = ТекСтрокаКомплектующие.Количество;
КонецЦикла;
// регистр ОстаткиТоваров Приход
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого ТекСтрокаСобранныйПК Из СобранныйПК Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСобранныйПК.Номенклатура;
Движение.Склад = Склад;
Движение.Серийник = ТекСтрокаСобранныйПК.Серия;
Движение.Количество = ТекСтрокаСобранныйПК.Количество;
КонецЦикла;
// регистр ОтветственныеЛица Приход
Движения.ОтветственныеЛица.Записывать = Истина;
Для Каждого ТекСтрокаОтветственныеЛица Из СНТ Цикл
Движение = Движения.ОтветственныеЛица.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Сборщик = ТекСтрокаОтветственныеЛица.Сборка;
Движение.Настройщик = ТекСтрокаОтветственныеЛица.Настройка;
Движение.Тестировщик = ТекСтрокаОтветственныеЛица.Тесты;
Движение.Количество = ТекСтрокаОтветственныеЛица.СборкаКоличество;
Движение.НастройкаКоличество = ТекСтрокаОтветственныеЛица.НастройкаКоличество;
Движение.ТестКоличество = ТекСтрокаОтветственныеЛица.ТестыКоличество;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua