Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: В чем проблема?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Vofka
Привет!

Есть код:




...
ТабЧасть.ВыбратьСтроки();
Пока ТабЧасть.ПолучитьСтроку()=1 Цикл

ТекстЗапроса = ТекстЗапроса + "
|Условие(РегТовар = ТабЧасть.Товар);
|";

Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;

Если Запрос.Группировка("РегТовар") < 1 Тогда
Сообщить("Нет остатков товара "+ТабЧасть.Товар);
ФлагОтказа = 1;
Продолжить;
КонецЕсли;


Пока Запрос.Группировка("РегТовар")>0 Цикл

Если Запрос.КоличествоКонОст < ТабЧасть.Количество Тогда
НеХватает = ТабЧасть.Количество - Запрос.КоличествоКонОст;
Сообщить("Недостаточно товара "+Запрос.РегТовар+" в количестве "+НеХватает);
ФлагОтказа = 1;
Иначе
НадоСписать = Запрос.КоличествоКонОст;
Если ФлагОтказа = 0 Тогда
...



Доходя до первого КонецЕсли, значение Запрос.Выполнить(ТекстЗапроса) = 1. Как только перешагиваю на строчку Если Запрос.Группировка("РегТовар") < 1 Тогда, то значение Запрос.Выполнить(ТекстЗапроса) становится равным 0. Почему так получается?
Acid
А где у тебя в тексте запроса Группировка?
Vofka


ТекстЗапроса = "
|Период с ТекДата по ТекДата;
|РегТовар = Регистр.ТоварыНаСкладе.Товар;
|Партия = Регистр.ТоварыНаСкладе.Партия;
|РегКоличество = Регистр.ТоварыНаСкладе.Количество;
|РегСумма = Регистр.ТоварыНаСкладе.Сумма;
|Функция КоличествоКонОст = КонОст(РегКоличество);
|Функция СуммаКонОст = КонОст(РегСумма);
|Группировка РегТовар без групп без упорядочивания;
|Группировка Партия Упорядочить По Партия.ДатаДок;
|";


-------------------------------------------------------------------------------

и ещё такой вопрос сразу smile.gif :



СписокТовара = Создатьобъект("СписокЗначений");

Рег=СоздатьОбъект("Регистр.ТоварыНаСкладе");

Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ТекущийДокумент());

Рег.ВыгрузитьИтоги(СписокПартий);


Так выгружает всё из регистра. Но мне надо чтобы выбиралось для определённого товара. Делаю так:



СписокТовара = Создатьобъект("СписокЗначений");
ИтогиРегистра=СоздатьОбъект("ТаблицаЗначений");

ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
СписокТовара.ДобавитьЗначение(Товар);
КонецЦикла;

Рег=СоздатьОбъект("Регистр.ТоварыНаСкладе");
// Измерения: Товар, Склад; Ресурсы: Количество, Сумма

Рег.УстановитьЗначениеФильтра("Товар",СписокТовара);

Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ТекущийДокумент());

Рег.ВыгрузитьИтоги(СписокПартий);


Не работает: выгружает пустоту sad.gif

ЗЫ. Надо по регистру Товары получить остатки определённого товара на определённый момент времени.
ЗЫ2. Не запросом!
Fynjy
УстановитьЗначениеФильтра(<Идентиф>,<Значен>,<Вариант>)
<Вариант> - необязательный параметр. Число: 0 - не фильтровать; 1 - фильтровать по значению; 2 - искать вхождение. Значение по умолчанию 1. Для варианта ''2'' :
- если параметр <Значен> - это группа справочника, то осуществляется проверка вхождения в группу;
- если параметр <Значен> - это простой элемент справочника или другой тип значения, то осуществляется просто фильтрация по значению;
- для списка значений осуществляется проверка вхождения в список;
- если пустое значение или пустой список значений, то условие не проверяется.
Vofka
Цитата
УстановитьЗначениеФильтра(<Идентиф>,<Значен>,<Вариант>)
<Вариант> - необязательный параметр. Число: 0 - не фильтровать; 1 - фильтровать по значению; 2 - искать вхождение. Значение по умолчанию 1. Для варианта ''2'' :
- если параметр <Значен> - это группа справочника, то осуществляется проверка вхождения в группу;
- если параметр <Значен> - это простой элемент справочника или другой тип значения, то осуществляется просто фильтрация по значению;
- для списка значений осуществляется проверка вхождения в список;
- если пустое значение или пустой список значений, то условие не проверяется.

Блин, и читал ведь это! smile.gif

ЗЫ. вопрос с группировкой остается открытым
Fynjy
По второму вопросу - весь код большая жесть ...
Эта пять адназначна:
ТекстЗапроса = ТекстЗапроса + "
|Условие(РегТовар = ТабЧасть.Товар);
|";

Нужно не формировать текст запроса динамически, а получить условие фильтра и затем только выполнять запрос ...
|Условие(РегТовар В МассивТоваров);
...
Vofka
Цитата
По второму вопросу - весь код большая жесть ...

Ну это я 7 решил вспомнить немножко. Хочу сделать списание с контролем остатка. В общем-то по другому как сделать - пока не думал. Наверное есть вариант, как-то через таблицы значений "конвертировать" результат запроса.

Как я щас делаю: перебираю табличную часть, формирую запрос по данному элементу и сравниваю количество в документе с количеством в остатках.

Если я выполню общий запрос сразу по нескольким товарам, тогда надо будет его выгрузить в балицу значений и при переборе табличной части документа надо будет как-то искать в этой таблице нужный товар? Можно в нескольких словах как это в 7 сделать?

ЗЫ. это замечание конечно принято smile.gif , но вопрос был не о том
Fynjy
Только выгрузить в список значений.
Vofka
И что это даст? Нужно ж Товар и КоличествоОстаток. А в списке значений только или товар или остаток. Или я чего-то не понимаю
alex1c
Думаю где-то так:


спТовары=СоздатьОбъект("СписокЗначений");
ВыгрузитьТабличнуюЧасть(спТовары,"Товар");

Рег=СоздатьОбъект("Регистр.ТоварыНаСкладе");
Рег.УстановитьЗначениеФильтра("Товар",спТовары,2);
// выбираем итоги
Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ТекущийДокумент());

Рег.ВыгрузитьИтоги(тбИтоги,1,1);
тбИтоги.Сортировать("Товар*");

ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ВсегоСписать = ДокСп.Кво;// * Коэффициент;
ОсталосьСписать = ВсегоСписать;

НС=0;
Если тбИтоги.НайтиЗначение(Товар,НС,"Товар")=1 Тогда
тбИтоги.ПолучитьСтрокуПоНомеру(НС);
Иначе
тбИтоги.ВыбратьСтроки();
тбИтоги.ПолучитьСтроку();
КонецЕсли;

Пока тбИтоги.Товар = Товар Цикл
ОстатокТовара = тбИтоги.ОстатокТовара;
СписываемыйОстатокТовара = Мин(ОсталосьСписать, ОстатокТовара);

// тут списываем и готово

тбИтоги.ОстатокТовара = тбИтоги.ОстатокТовара - СписываемыйОстатокТовара;
Если тбИтоги.ПолучитьСтроку()=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;

Vofka
У меня получилось где-то так smile.gif :


Процедура ОбработкаПроведения()

ФлагОтказа = 0;
ТабЗначИтоги = СоздатьОбъект("ТаблицаЗначений");
ТЗТабЧасть = СоздатьОбъект("ТаблицаЗначений");
ТабЗначИтогиСвернуто = СоздатьОбъект("ТаблицаЗначений");

спТовары=СоздатьОбъект("СписокЗначений");
ВыгрузитьТабличнуюЧасть(спТовары,"Товар");

Рег=СоздатьОбъект("Регистр.ТоварыНаСкладе");
Рег.УстановитьЗначениеФильтра("Товар",спТовары,2);

Рег.ВременныйРасчет();
РассчитатьРегистрыНа(ТекущийДокумент());

Рег.ВыгрузитьИтоги(ТабЗначИтоги,1,1);
ТабЗначИтоги.Сортировать("Товар*");

ВыгрузитьТабличнуюЧасть(ТЗТабЧасть);
ТЗТабЧасть.Свернуть("Товар", "Количество, Сумма");

ТабЗначИтоги.Выгрузить(ТабЗначИтогиСвернуто,,,"Товар, Количество, Сумма");
ТабЗначИтогиСвернуто.Свернуть("Товар", "Количество, Сумма");

ТЗТабЧасть.ВыбратьСтроки();

Пока ТЗТабЧасть.ПолучитьСтроку()=1 Цикл
ВсегоСписать = ТЗТабЧасть.Количество;
ОсталосьСписать = ВсегоСписать;

НС=0;
НК=0;

Если ТабЗначИтогиСвернуто.НайтиЗначение(ТЗТабЧасть.Товар, НС, НК)=1 Тогда
ТабЗначИтогиСвернуто.ПолучитьСтрокуПоНомеру(НС);
Если ТабЗначИтогиСвернуто.Количество < ТЗТабЧасть.Количество Тогда
НеХватает = ТЗТабЧасть.Количество - ТабЗначИтогиСвернуто.Количество;
Сообщить("Не хватает товара "+ТЗТабЧасть.Товар+" в количествое "+НеХватает, "!");
ФлагОтказа = 1;
КонецЕсли;
Иначе
Сообщить("По товару "+ТЗТабЧасть.Товар+" остаток = 0", "!");
ФлагОтказа = 1;
КонецЕсли;

Если ФлагОтказа <> 1 Тогда

НС=0;

Если ТабЗначИтоги.НайтиЗначение(ТЗТабЧасть.Товар,НС,"Товар")=1 Тогда
ТабЗначИтоги.ПолучитьСтрокуПоНомеру(НС);
КонецЕсли;

а = 1;
Пока ТабЗначИтоги.Товар = ТЗТабЧасть.Товар Цикл

ОстатокТовара = ТабЗначИтоги.Количество;
СписываемыйОстатокТовара = Мин(ОсталосьСписать, ОстатокТовара);

Регистр.ТоварыНаСкладе.ПривязыватьСтроку(а);
Регистр.ТоварыНаСкладе.Товар = ТабЗначИтоги.Товар;
Регистр.ТоварыНаСкладе.Партия = ТабЗначИтоги.Партия;
Регистр.ТоварыНаСкладе.Количество = СписываемыйОстатокТовара;
Регистр.ТоварыНаСкладе.Сумма = ТабЗначИтоги.Сумма / ТабЗначИтоги.Количество * СписываемыйОстатокТовара;
Регистр.ТоварыНаСкладе.ДвижениеРасходВыполнить();

ОсталосьСписать = ОсталосьСписать - СписываемыйОстатокТовара;

Если ОсталосьСписать = 0 Тогда
Прервать;
КонецЕсли;

НС = НС+1;
ТабЗначИтоги.ПолучитьСтрокуПоНомеру(НС);
а = а+1;

КонецЦикла;

КонецЕсли;
КонецЦикла;

Если ФлагОтказа = 1 Тогда
Сообщить("Документ не проведён!", "!!!");
СтатусВозврата(0);
КонецЕсли;

КонецПроцедуры
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.