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

Отбор строк справочника сравнивая их с регистром

Автор Feramount, 01 ноя 2012, 09:38

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

Feramount

Процедура Вывести()
СписокНоменклатуры = СоздатьОбъект("Справочник.Номенклатура");
СписокОстатков = СоздатьОбъект("Регистр.ОстаткиТМЦ");
СписокНоменклатуры.ВыбратьЭлементы();
СчетчикНоменклатуры=0;
Пока СписокНоменклатуры.ПолучитьЭлемент()=1 Цикл
КоличествоТовараНаСкладе = 0;
КоличествоТовараНаСкладе = КоличествоТовараНаСкладе + СписокОстатков.Остаток(,СписокНоменклатуры.ТекущийЭлемент(),,, "Количество");   
Если КоличествоТовараНаСкладе>0 Тогда
ИмяФайлаНоменклатуры="СправочникНоменклатуры/"+Строка(СчетчикНоменклатуры)+".СправочникНоменклатуры.txt";
Если ЗначениеВФайл(ИмяФайлаНоменклатуры, СписокНоменклатуры.ТекущийЭлемент())=0 Тогда
Предупреждение("Ошибка сохранения.");
Прервать;
КонецЕсли;
СчетчикНоменклатуры=СчетчикНоменклатуры+1;
КонецЕсли;
КонецЦикла;
Предупреждение("Сохранено "+СчетчикНоменклатуры+" строк.");
КонецПроцедуры

Постоянно количество товара равно 0, хотя товар на складе присутствует. В чем ошибка?

Yura063

КоличествоТовараНаСкладе у вас внутри цикла! Он у вас постоянно сбрасывается! Вынесите за цикл!
Помогли, отблагодари!

Feramount

Не помогло. Там обнуление роли не играло, потому что значение все равно складывалось из предыдущего и нового остатка и сразу же после этого сравнивалось.

Yura063

А вообще просто используйте запрос по этому регистру, там есть ссылка на номенклатуру! так что и не надо прогонять по элементам номенклатуры!;)
Добавлено: 01 ноя 2012, 10:03


так вы потом записываете в фаил?
Помогли, отблагодари!

Feramount

Возможно глупый ответ, но я с запросами не умею работать, поэтому делаю именно так)))
И да я записываю каждый элемент в отдельный файл.

Herby

Цитата: Feramount от 01 ноя 2012, 10:05
Возможно глупый ответ, но я с запросами не умею работать, поэтому делаю именно так)))
И да я записываю каждый элемент в отдельный файл.

У вас нули потому что вы используете метод Остаток() и не указываете в нем все измерения (по-моему, у Вас измерение склад не указан). Если вы используете этот метод, то нужно указывать все измерения, иначе используйте метод СводныйОстаток()

Feramount

Цитата: Herby от 01 ноя 2012, 10:13У вас нули потому что вы используете метод Остаток() и не указываете в нем все измерения (по-моему, у Вас измерение склад не указан). Если вы используете этот метод, то нужно указывать все измерения, иначе используйте метод СводныйОстаток()

Вот сделал со складами все равно показывает 0. Измерения регистра ОстаткиТМЦ (Фирма, номенклатура, склад, ЦенаПрод)
Процедура Вывести()
СписокНоменклатуры = СоздатьОбъект("Справочник.Номенклатура");
СписокОстатков = СоздатьОбъект("Регистр.ОстаткиТМЦ");
СписокСкладов = СоздатьОбъект("Справочник.Склады");
СписокНоменклатуры.ВыбратьЭлементы();
СписокСкладов.ВыбратьЭлементы();
СчетчикНоменклатуры=0;
Пока СписокНоменклатуры.ПолучитьЭлемент()=1 Цикл
КоличествоТовараНаСкладе = 0;
Пока СписокСкладов.ПолучитьЭлемент()=1 Цикл
КоличествоТовараНаСкладе = СписокОстатков.Остаток(,СписокНоменклатуры.ТекущийЭлемент(),СписокСкладов.ТекущийЭлемент(),, "Количество");
КонецЦикла;
Если КоличествоТовараНаСкладе>0 Тогда
ИмяФайлаНоменклатуры="СправочникНоменклатуры/"+Строка(СчетчикНоменклатуры)+".СправочникНоменклатуры.txt";
Если ЗначениеВФайл(ИмяФайлаНоменклатуры, СписокНоменклатуры.ТекущийЭлемент())=0 Тогда
Предупреждение("Ошибка сохранения.");
Прервать;
КонецЕсли;
СчетчикНоменклатуры=СчетчикНоменклатуры+1;
КонецЕсли;
КонецЦикла;
Предупреждение("Сохранено "+СчетчикНоменклатуры+" строк.");
КонецПроцедуры

Со сводными остатками не разобрался. Можно поподробнее.

Herby

Цитата: Feramount от 01 ноя 2012, 12:10Остаток(,СписокНоменклатуры.ТекущийЭлемент(),СписокСкладов.ТекущийЭлемент(),, "Количество")

склад указали, а остальные измерения? я же написал, что нужно все измерения указывать.
а про метод СводныйОстаток() читайте в справке, в ней доходчиво написано.
в вашем варианте, чтобы без нулей нужно использовать метод СводныйОстаток, т.е.

КоличествоТовараНаСкладе =  СписокОстатков.СводныйОстаток(,СписокНоменклатуры.ТекущийЭлемент(),,, "Количество");

это будет количество в разрезе всех складов (по всем складам, а не по конкретному), и в разрезе всех измерений, которые вы не указываете.

и приучайтесь правильно называть переменные. просто когда читаешь код и встречаешь "СписокСкладов", "СписокТоваров", "СписокОстатков", то так и кажется, что имеешь дело с объектом "СписокЗначений".

если это справочник товары, то лучше и называть переменную, например "спрТоваров", но ни как не "СписокТоваров" и тд. и тп.





Feramount

Цитата: Herby от 01 ноя 2012, 12:23склад указали, а остальные измерения? я же написал, что нужно все измерения указывать.
а про метод СводныйОстаток() читайте в справке, в ней доходчиво написано.
в вашем варианте, чтобы без нулей нужно использовать метод СводныйОстаток, т.е.

КоличествоТовараНаСкладе =  СписокОстатков.СводныйОстаток(,СписокНоменклатуры.ТекущийЭлемент(),,, "Количество");

это будет количество в разрезе всех складов (по всем складам, а не по конкретному), и в разрезе всех измерений, которые вы не указываете.

и приучайтесь правильно называть переменные. просто когда читаешь код и встречаешь "СписокСкладов", "СписокТоваров", "СписокОстатков", то так и кажется, что имеешь дело с объектом "СписокЗначений".

если это справочник товары, то лучше и называть переменную, например "спрТоваров", но ни как не "СписокТоваров" и тд. и тп.
Спасибо. СводныйОстаток() помог. Скрипт работает.

Теги:

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

Рейтинг@Mail.ru

Поиск