Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
15 Дек 2017, 03:40
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Отбор строк справочника сравнивая их с регистром  (Прочитано 3575 раз)

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

Оффлайн Feramount

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


Оффлайн Yura063

  • *****
  • Сообщений: 1045
  • РЕПУТАЦИЯ: 136
  • КПД: 13%
  • Регистрация: 2010-11-15
  • Сайт: yuis.ru
  • Профессия: Программист 1С
КоличествоТовараНаСкладе у вас внутри цикла! Он у вас постоянно сбрасывается! Вынесите за цикл!
Помогли, отблагодари!

Оффлайн Feramount

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-10-26
  • Сайт: 
  • Профессия: Программист 7.7
Не помогло. Там обнуление роли не играло, потому что значение все равно складывалось из предыдущего и нового остатка и сразу же после этого сравнивалось.

Оффлайн Yura063

  • *****
  • Сообщений: 1045
  • РЕПУТАЦИЯ: 136
  • КПД: 13%
  • Регистрация: 2010-11-15
  • Сайт: yuis.ru
  • Профессия: Программист 1С
А вообще просто используйте запрос по этому регистру, там есть ссылка на номенклатуру! так что и не надо прогонять по элементам номенклатуры!;)
Добавлено: 01 Ноя 2012, 10:03

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

Оффлайн Feramount

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-10-26
  • Сайт: 
  • Профессия: Программист 7.7
Возможно глупый ответ, но я с запросами не умею работать, поэтому делаю именно так)))
И да я записываю каждый элемент в отдельный файл.

Оффлайн Herby

  • *****
  • Сообщений: 936
  • РЕПУТАЦИЯ: 164
  • КПД: 18%
  • Регистрация: 2010-08-31
  • Сайт: 
  • Профессия: Программист 7.7
Возможно глупый ответ, но я с запросами не умею работать, поэтому делаю именно так)))
И да я записываю каждый элемент в отдельный файл.

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

Оффлайн Feramount

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-10-26
  • Сайт: 
  • Профессия: Программист 7.7
У вас нули потому что вы используете метод Остаток() и не указываете в нем все измерения (по-моему, у Вас измерение склад не указан). Если вы используете этот метод, то нужно указывать все измерения, иначе используйте метод СводныйОстаток()

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

Оффлайн Herby

  • *****
  • Сообщений: 936
  • РЕПУТАЦИЯ: 164
  • КПД: 18%
  • Регистрация: 2010-08-31
  • Сайт: 
  • Профессия: Программист 7.7
Остаток(,СписокНоменклатуры.ТекущийЭлемент(),СписокСкладов.ТекущийЭлемент(),, "Количество")

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

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

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

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

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





Оффлайн Feramount

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-10-26
  • Сайт: 
  • Профессия: Программист 7.7
склад указали, а остальные измерения? я же написал, что нужно все измерения указывать.
а про метод СводныйОстаток() читайте в справке, в ней доходчиво написано.
в вашем варианте, чтобы без нулей нужно использовать метод СводныйОстаток, т.е.

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

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

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

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


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
175 Сообщений
ilyay ilyay
69 Сообщений
oleg-x
48 Сообщений
alex0402
44 Сообщений
andron81_81
38 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
Golickoff Golickoff
31 Сообщений
BuhRust
30 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 179
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal