Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
11 дек 2024, 21:43

Контроль остатков: в результате запроса не находится строка

Автор KaffLime, 12 дек 2021, 23:07

0 Пользователей и 1 гость просматривают эту тему.

KaffLime

В начале цикла инициализация переменной НайденнаяСтрока. Однако она получает тип "Неопределено". Т.е. возвращаемое значение функции "Найти" - "Неопределено". Вопрос что здесь не так. Вроде бы с параметрами функции все нормально. В первом параметре значение наименования товара (я проверил при отладке), а второе значение - название колонки, в которой происходит поиск.

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

Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ТоварыНаСкладахОстатки.Товар КАК Товар,
               | ТоварыНаСкладахОстатки.Склад КАК Склад,
   |    ТоварыНаСкладахОстатки.МОЛ КАК МОЛ,
               | -ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
               |ИЗ
               | РегистрНакопления.ТоварыНаСкладах.Остатки(
               | &Дата,
   |            МОЛ = &МОЛ
               | И Склад = &Склад
   | И Товар В (&СписокТоваров)) КАК ТоварыНаСкладахОстатки";

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

СписокТоваров = новый СписокЗначений;
СписокТоваров.ЗагрузитьЗначения(Товар.ВыгрузитьКолонку("Товар"));
Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров);

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

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


Для Каждого ТекСтрокаТовар из Товар Цикл
НайденнаяСтрока = тзРезультатЗапроса.Найти(ТекСтрокаТовар.Товар.Наименование, "Товар");
НаличиеТовара = НайденнаяСтрока.КоличествоОстаток - ТекСтрокаТовар.Количество;

//Если НайденнаяСтрока = Неопределено Тогда
// Сообщить("На Складе не осталось товара " + ТекСтрокаТовар.Товар.Наименование);
// Отказ = Истина;
// Прервать;
//КонецЕсли;

Если НаличиеТовара >= 0 Тогда
// регистр ТоварыНаСкладах Расход
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовар.Товар;
Движение.Склад = Склад;
Движение.МОЛ = МОЛ;
Движение.Количество = ТекСтрокаТовар.Количество;

// регистр продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовар.Товар;
Движение.Продавец = МОЛ;
Движение.Стоимость = ТекСтрокаТовар.Стоимость;
Иначе
Сообщить("Недостаточно товара на складе - " + ТекСтрокаТовар.Товар.Наименование + " в количестве " + НаличиеТовара + " " + ТекСтрокаТовар.Товар.ЕдиницаИзмерения);
Отказ = Истина;
КонецЕсли
КонецЦикла


КонецПроцедуры


DmitriyF

Цитата: KaffLime от 12 дек 2021, 23:07В начале цикла инициализация переменной НайденнаяСтрока. Однако она получает тип "Неопределено". Т.е. возвращаемое значение функции "Найти" - "Неопределено". Вопрос что здесь не так. Вроде бы с параметрами функции все нормально. В первом параметре значение наименования товара (я проверил при отладке), а второе значение - название колонки, в которой происходит поиск.

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

Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ТоварыНаСкладахОстатки.Товар КАК Товар,
               | ТоварыНаСкладахОстатки.Склад КАК Склад,
   |    ТоварыНаСкладахОстатки.МОЛ КАК МОЛ,
               | -ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
               |ИЗ
               | РегистрНакопления.ТоварыНаСкладах.Остатки(
               | &Дата,
   |            МОЛ = &МОЛ
               | И Склад = &Склад
   | И Товар В (&СписокТоваров)) КАК ТоварыНаСкладахОстатки";

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

СписокТоваров = новый СписокЗначений;
СписокТоваров.ЗагрузитьЗначения(Товар.ВыгрузитьКолонку("Товар"));
Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров);

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

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


Для Каждого ТекСтрокаТовар из Товар Цикл
НайденнаяСтрока = тзРезультатЗапроса.Найти(ТекСтрокаТовар.Товар.Наименование, "Товар");
НаличиеТовара = НайденнаяСтрока.КоличествоОстаток - ТекСтрокаТовар.Количество;

//Если НайденнаяСтрока = Неопределено Тогда
// Сообщить("На Складе не осталось товара " + ТекСтрокаТовар.Товар.Наименование);
// Отказ = Истина;
// Прервать;
//КонецЕсли;

Если НаличиеТовара >= 0 Тогда
// регистр ТоварыНаСкладах Расход
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовар.Товар;
Движение.Склад = Склад;
Движение.МОЛ = МОЛ;
Движение.Количество = ТекСтрокаТовар.Количество;

// регистр продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовар.Товар;
Движение.Продавец = МОЛ;
Движение.Стоимость = ТекСтрокаТовар.Стоимость;
Иначе
Сообщить("Недостаточно товара на складе - " + ТекСтрокаТовар.Товар.Наименование + " в количестве " + НаличиеТовара + " " + ТекСтрокаТовар.Товар.ЕдиницаИзмерения);
Отказ = Истина;
КонецЕсли
КонецЦикла


КонецПроцедуры


А зачем вы наименование передаете? Передайте ссылку на кон
Цитата: KaffLime от 12 дек 2021, 23:07В начале цикла инициализация переменной НайденнаяСтрока. Однако она получает тип "Неопределено". Т.е. возвращаемое значение функции "Найти" - "Неопределено". Вопрос что здесь не так. Вроде бы с параметрами функции все нормально. В первом параметре значение наименования товара (я проверил при отладке), а второе значение - название колонки, в которой происходит поиск.

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

Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ТоварыНаСкладахОстатки.Товар КАК Товар,
               | ТоварыНаСкладахОстатки.Склад КАК Склад,
   |    ТоварыНаСкладахОстатки.МОЛ КАК МОЛ,
               | -ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
               |ИЗ
               | РегистрНакопления.ТоварыНаСкладах.Остатки(
               | &Дата,
   |            МОЛ = &МОЛ
               | И Склад = &Склад
   | И Товар В (&СписокТоваров)) КАК ТоварыНаСкладахОстатки";

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

СписокТоваров = новый СписокЗначений;
СписокТоваров.ЗагрузитьЗначения(Товар.ВыгрузитьКолонку("Товар"));
Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров);

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

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


Для Каждого ТекСтрокаТовар из Товар Цикл
НайденнаяСтрока = тзРезультатЗапроса.Найти(ТекСтрокаТовар.Товар.Наименование, "Товар");
НаличиеТовара = НайденнаяСтрока.КоличествоОстаток - ТекСтрокаТовар.Количество;

//Если НайденнаяСтрока = Неопределено Тогда
// Сообщить("На Складе не осталось товара " + ТекСтрокаТовар.Товар.Наименование);
// Отказ = Истина;
// Прервать;
//КонецЕсли;

Если НаличиеТовара >= 0 Тогда
// регистр ТоварыНаСкладах Расход
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовар.Товар;
Движение.Склад = Склад;
Движение.МОЛ = МОЛ;
Движение.Количество = ТекСтрокаТовар.Количество;

// регистр продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовар.Товар;
Движение.Продавец = МОЛ;
Движение.Стоимость = ТекСтрокаТовар.Стоимость;
Иначе
Сообщить("Недостаточно товара на складе - " + ТекСтрокаТовар.Товар.Наименование + " в количестве " + НаличиеТовара + " " + ТекСтрокаТовар.Товар.ЕдиницаИзмерения);
Отказ = Истина;
КонецЕсли
КонецЦикла


КонецПроцедуры


А у вас в табличной части есть наименование товар?

LexaK

KaffLime, так в колонке "Товар" надо искать именно Товар а не Наименование!

попробуйте так
        НайденнаяСтрока = тзРезультатЗапроса.Найти(ТекСтрокаТовар.Товар, "Товар");
если помогло нажмите: Спасибо!

KaffLime

Цитата: LexaK от 13 дек 2021, 10:27KaffLime, так в колонке "Товар" надо искать именно Товар а не Наименование!

попробуйте так
        НайденнаяСтрока = тзРезультатЗапроса.Найти(ТекСтрокаТовар.Товар, "Товар");

Там как раз было без наименования, просто я пытался решить проблему и добавил наименование в надежде, что это поможет. Проблема как была, так и осталась. А перед отправкой на форум забыл убрать. Т.е. без наименования тоже не работает

KaffLime


KaffLime

DmitriyF, если вы про тзРезультатЗапроса, то я прикрепил изображение к ответу на свой вопрос

DmitriyF

Вот выгрузил ты результат запроса, а зачем обходишь в цикле табличную часть?

LexaK

KaffLime, ааа, такое тоже может быть, если товар/остаток не найден - значит его нет!
попробуйте такую обработку данной ситуации
добавлены строчки со знаком //+
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
   
НетОстатка = Новый Структура("КоличествоОстаток", 0);//+
    Для Каждого ТекСтрокаТовар из Товар Цикл
        НайденнаяСтрока = тзРезультатЗапроса.Найти(ТекСтрокаТовар.Товар, "Товар");
Если НайденнаяСтрока = Неопределено Тогда //+
НайденнаяСтрока = НетОстатка;
КонецЕсли;
        НаличиеТовара = НайденнаяСтрока.КоличествоОстаток - ТекСтрокаТовар.Количество;
        ...       

если помогло нажмите: Спасибо!

KaffLime

DmitriyF, вы про "Товар"? Я сам не знаю, это задание  в универе. Преподаватель вот такой код нам и предоставил, с ошибкой, я так понимаю. Нужно как-то получить фактическое количество товара и то количество, которое нужно отнять. Второе это ТекСтрокаТовар.Количество и в нем действительно нужное значение, а как первое получить я не особо разобрался

KaffLime

LexaK, для тестирования я сначала провожу документ приходнаяНаклодная, т.е. добавляю пару товаров. Затем я уже провожу документ РеализацияТовара, продавая 2 добавленных товара, при чем 1 я продаю так, чтобы у меня еще остались товары на складе после его продажи, а второй так, чтобы на складе этого товара не хватало (здесь и должно появиться сообщение о том, что товара недостаточно). Так что, по идее, значения "Неопределено" быть не может

Похожие темы (5)

Рейтинг@Mail.ru

Поиск