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

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

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

Оффлайн Feramount

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


Оффлайн Yura063

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

Оффлайн Feramount

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

Оффлайн Yura063

  • *****
  • Сообщений: 1050
  • РЕПУТАЦИЯ: 137
  • КПД: 13%
  • Регистрация: 2010-11-15
  • Сайт: 
  • Профессия: Программист 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 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
152 Сообщений
oleg-x
64 Сообщений
alex0402
60 Сообщений
AIFrame AIFrame
52 Сообщений
wise wise
37 Сообщений
KOI8-R
33 Сообщений
buketov.av buketov.av
28 Сообщений
Alter
22 Сообщений
BuhRust
19 Сообщений
alexandr_ll
19 Сообщений

* Кто онлайн

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

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

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

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

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

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal