Таблица значений
03.03.2010
13:08
#1
Помогите с работой таблиц значений
есть 2-е таблицы значений с колонками Номенклатура и Количество(число), как вычесть Количество одной таблицы из другой в цикле, чтобы строчка вычитания искалась по номенклатуре?
зы. Комплексная 77
есть 2-е таблицы значений с колонками Номенклатура и Количество(число), как вычесть Количество одной таблицы из другой в цикле, чтобы строчка вычитания искалась по номенклатуре?
зы. Комплексная 77
03.03.2010
14:08
#2
"Самый простой вариант:
Для Стр1 = 1 По Т1.Количество() Цикл
Стр2 = 0;
Если Т2.НайтиЗначение (Т1.ПолучитьЗначение (Стр1, "Номенклатура"), Стр2, "Номенклатура") = 0 Тогда
Продолжить;
КонецЕсли;
Т2.УстановитьЗначение (Т2.ПолучитьЗначение (Стр2, "Количество") - Т1.ПолучитьЗначение (Стр1, "Количество"));
КонецЦикла;
Сложнее, но и быстрее если отсортировать таблицы и обойтись без Поиска значения."
Для Стр1 = 1 По Т1.Количество() Цикл
Стр2 = 0;
Если Т2.НайтиЗначение (Т1.ПолучитьЗначение (Стр1, "Номенклатура"), Стр2, "Номенклатура") = 0 Тогда
Продолжить;
КонецЕсли;
Т2.УстановитьЗначение (Т2.ПолучитьЗначение (Стр2, "Количество") - Т1.ПолучитьЗначение (Стр1, "Количество"));
КонецЦикла;
Сложнее, но и быстрее если отсортировать таблицы и обойтись без Поиска значения."
03.03.2010
14:21
#5
"задача такая, есть непроведенные накладные нужно выбрать из них товар с количеством вычесть из него то что есть на данный момент на складе и запихнуть в приход.
я хочу сделать таб значений товара из накладных и таб значений из регистра остатки, вычесть из таб значений накладных таблицу значений регистра остатков...так корректно будет?
код начала:
ТаблицаНоменклатуры.ВыбратьСтроки();
Пока ТаблицаНоменклатуры.ПолучитьСтроку()=1 Цикл
Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
Рег.ВыбратьИтоги();
Ном=0;
Пока Рег.ПолучитьИтог()=1 Цикл
Тут нужно сравнить по номенклатуре(???)и
ТаблицаНоменклатуры.Количество = ТаблицаНоменклатуры.Количество-Рег.Количество
вот с сравнением у меня загвоздка
ТаблицаНоменклатуры - это созданная таблица из накладных с колонками Номенклатура и Количество"
я хочу сделать таб значений товара из накладных и таб значений из регистра остатки, вычесть из таб значений накладных таблицу значений регистра остатков...так корректно будет?
код начала:
ТаблицаНоменклатуры.ВыбратьСтроки();
Пока ТаблицаНоменклатуры.ПолучитьСтроку()=1 Цикл
Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
Рег.ВыбратьИтоги();
Ном=0;
Пока Рег.ПолучитьИтог()=1 Цикл
Тут нужно сравнить по номенклатуре(???)и
ТаблицаНоменклатуры.Количество = ТаблицаНоменклатуры.Количество-Рег.Количество
вот с сравнением у меня загвоздка
ТаблицаНоменклатуры - это созданная таблица из накладных с колонками Номенклатура и Количество"
03.03.2010
14:35
#6
Ну да. Если вы к таблице Накладной добавите строки из таблицы остатков, только количеству приписав минус, тогда свернув таблицу останется пробежать по ней и выбрать строки со значением > 0
03.03.2010
14:42
#7
т.е. если я делаю цикл выборки из регистра остатки в цикле выборки строк таблицы, то по умолчанию выборка идет по одинаковой номенклатуре? остается только удалить строки с количество<0, так наверно проще будет
03.03.2010
15:55
#8
"Вот что получилось...тока работает некорректно, подскажите где ошибка...количество неправильное выводит в итоге
Процедура Сформировать()
Номенклатура = СоздатьОбъект("Справочник.Номенклатура");
ТаблицаНоменклатуры = СоздатьОбъект("ТаблицаЗначений");
ТаблицаНоменклатуры.НоваяКолонка("Номенклатура","Справочник.Номенклатура",,,,,,);
ТаблицаНоменклатуры.НоваяКолонка("Количество","Число",,,,,,);
ТаблицаНоменклатуры.НоваяКолонка("Цена","Число",,,,,,);
ДокР=СоздатьОбъект("Документ.Реализация");
ДокР.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Пока ДокР.ПолучитьДокумент()=1 Цикл
Если (ДокР.Проведен()=0) и (ДокР.ПометкаУдаления()=0) Тогда
ДокР.ВыбратьСтроки();
Пока ДокР.ПолучитьСтроку() = 1 Цикл
ТаблицаНоменклатуры.НоваяСтрока();
ТаблицаНоменклатуры.Номенклатура = ДокР.Номенклатура;
ТаблицаНоменклатуры.Количество = ДокР.Количество;
ТаблицаНоменклатуры.Цена = ДокР.Цена;
Сообщить("Перебор реализаций " + СокрЛП(ДокР) + ТаблицаНоменклатуры.Номенклатура);
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТаблицаНоменклатуры.Свернуть("Номенклатура", "Количество, Цена");
ТаблицаНоменклатуры.ВыбратьСтроки();
Пока ТаблицаНоменклатуры.ПолучитьСтроку()=1 Цикл
Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
Рег.ВыбратьИтоги();
Ном=0;
Пока Рег.ПолучитьИтог()=1 Цикл
ТаблицаНоменклатуры.Количество = ТаблицаНоменклатуры.Количество-Рег.Количество;
Если ТаблицаНоменклатуры.Количество<=0 Тогда
ТаблицаНоменклатуры.УдалитьСтроку();
КонецЕсли;
КонецЦикла;
КонецЦикла;
ДокВ=СоздатьОбъект("Документ.ПоступлениеТМЦ");
Контрагенты = СоздатьОбъект("Справочник.Контрагенты");
ТочкаНачала = ДатаНачала;
ТочкаКонца = ДатаКонца;
ДокВ.Новый();
ДокВ.ДатаДок = ДатаНачала;
ТаблицаНоменклатуры.ВыбратьСтроки();
Пока ТаблицаНоменклатуры.ПолучитьСтроку() = 1 Цикл
ДокВ.НоваяСтрока();
ДокВ.Номенклатура = ТаблицаНоменклатуры.Номенклатура;
ДокВ.Количество = ТаблицаНоменклатуры.Количество;
ДокВ.Цена = ТаблицаНоменклатуры.Цена;
ДокВ.Сумма = ДокВ.Количество * ДокВ.Цена;
КонецЦикла;
ДокВ.Записать();
Сообщить("Записан новый документ "+ДокВ.Вид()+", №: "+ДокВ.НомерДок+" от "+ДокВ.ДатаДок);
КонецПроцедуры
"
Процедура Сформировать()
Номенклатура = СоздатьОбъект("Справочник.Номенклатура");
ТаблицаНоменклатуры = СоздатьОбъект("ТаблицаЗначений");
ТаблицаНоменклатуры.НоваяКолонка("Номенклатура","Справочник.Номенклатура",,,,,,);
ТаблицаНоменклатуры.НоваяКолонка("Количество","Число",,,,,,);
ТаблицаНоменклатуры.НоваяКолонка("Цена","Число",,,,,,);
ДокР=СоздатьОбъект("Документ.Реализация");
ДокР.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Пока ДокР.ПолучитьДокумент()=1 Цикл
Если (ДокР.Проведен()=0) и (ДокР.ПометкаУдаления()=0) Тогда
ДокР.ВыбратьСтроки();
Пока ДокР.ПолучитьСтроку() = 1 Цикл
ТаблицаНоменклатуры.НоваяСтрока();
ТаблицаНоменклатуры.Номенклатура = ДокР.Номенклатура;
ТаблицаНоменклатуры.Количество = ДокР.Количество;
ТаблицаНоменклатуры.Цена = ДокР.Цена;
Сообщить("Перебор реализаций " + СокрЛП(ДокР) + ТаблицаНоменклатуры.Номенклатура);
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТаблицаНоменклатуры.Свернуть("Номенклатура", "Количество, Цена");
ТаблицаНоменклатуры.ВыбратьСтроки();
Пока ТаблицаНоменклатуры.ПолучитьСтроку()=1 Цикл
Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
Рег.ВыбратьИтоги();
Ном=0;
Пока Рег.ПолучитьИтог()=1 Цикл
ТаблицаНоменклатуры.Количество = ТаблицаНоменклатуры.Количество-Рег.Количество;
Если ТаблицаНоменклатуры.Количество<=0 Тогда
ТаблицаНоменклатуры.УдалитьСтроку();
КонецЕсли;
КонецЦикла;
КонецЦикла;
ДокВ=СоздатьОбъект("Документ.ПоступлениеТМЦ");
Контрагенты = СоздатьОбъект("Справочник.Контрагенты");
ТочкаНачала = ДатаНачала;
ТочкаКонца = ДатаКонца;
ДокВ.Новый();
ДокВ.ДатаДок = ДатаНачала;
ТаблицаНоменклатуры.ВыбратьСтроки();
Пока ТаблицаНоменклатуры.ПолучитьСтроку() = 1 Цикл
ДокВ.НоваяСтрока();
ДокВ.Номенклатура = ТаблицаНоменклатуры.Номенклатура;
ДокВ.Количество = ТаблицаНоменклатуры.Количество;
ДокВ.Цена = ТаблицаНоменклатуры.Цена;
ДокВ.Сумма = ДокВ.Количество * ДокВ.Цена;
КонецЦикла;
ДокВ.Записать();
Сообщить("Записан новый документ "+ДокВ.Вид()+", №: "+ДокВ.НомерДок+" от "+ДокВ.ДатаДок);
КонецПроцедуры
"
03.03.2010
17:35
#9
"Я оставил только часть для сокращения, закомментированое - это типа удалить. Остальное писал навскидку (возможны ошибки
)
> ....
> //ТаблицаНоменклатуры.Свернуть("Номенклатура", "Количество, Цена");
> //ТаблицаНоменклатуры.ВыбратьСтроки();
> //Пока ТаблицаНоменклатуры.ПолучитьСтроку()=1 Цикл
> Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
> Рег.ВыбратьИтоги();
> // Ном=0;
> Пока Рег.ПолучитьИтог()=1 Цикл
> // ТаблицаНоменклатуры.Количество = ТаблицаНоменклатуры.Количество-Рег.Количество;
> // Если ТаблицаНоменклатуры.Количество<=0 Тогда
> // ТаблицаНоменклатуры.УдалитьСтроку();
> // КонецЕсли;
ТаблицаНоменклатуры.НоваяСтрока();
ТаблицаНоменклатуры.Номенклатура = Рег.Номенклатура;
ТаблицаНоменклатуры.Количество = -Рег.Количество;
ТаблицаНоменклатуры.Цена = 0;
> КонецЦикла;
ТаблицаНоменклатуры.Свернуть("Номенклатура", "Количество, Цена");
> //КонецЦикла;
>
>
>
>ДокВ=СоздатьОбъект("Документ.ПоступлениеТМЦ"); > Контрагенты = СоздатьОбъект("Справочник.Контрагенты");
> ....
> ТаблицаНоменклатуры.ВыбратьСтроки();
> Пока ТаблицаНоменклатуры.ПолучитьСтроку() = 1 Цикл
Если ТаблицаНоменклатуры.Количество <= 0 Тогда Продолжить; КонецЕсли;
> ДокВ.НоваяСтрока();
> ДокВ.Номенклатура = ТаблицаНоменклатуры.Номенклатура;
> ДокВ.Количество = ТаблицаНоменклатуры.Количество;
> ДокВ.Цена = ТаблицаНоменклатуры.Цена;
> ДокВ.Сумма = ДокВ.Количество * ДокВ.Цена;
> КонецЦикла;
Если ДокВ.Количество() > 0 Тогда
> ДокВ.Записать();
> Сообщить("Записан новый документ "+ДокВ.Вид()+", №: "+ДокВ.НомерДок+" от "+ДокВ.ДатаДок);
КонецЕсли;
> КонецПроцедуры
>
При этом стоит учесть:
Если в документе у вас несколько строк с одной номенклатурой, то свертка увеличит Цену, что в общем-то не верно. А если учесть, что вы их собираете из разных документов - вероятность такого случая достаточна хорошая. Вывод - Собирать 2 таблицы одна с количеством, другая с ценой. В случае разных цен, можно будет усреднить или еще как-то обработать.
"
> ....
> //ТаблицаНоменклатуры.Свернуть("Номенклатура", "Количество, Цена");
> //ТаблицаНоменклатуры.ВыбратьСтроки();
> //Пока ТаблицаНоменклатуры.ПолучитьСтроку()=1 Цикл
> Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
> Рег.ВыбратьИтоги();
> // Ном=0;
> Пока Рег.ПолучитьИтог()=1 Цикл
> // ТаблицаНоменклатуры.Количество = ТаблицаНоменклатуры.Количество-Рег.Количество;
> // Если ТаблицаНоменклатуры.Количество<=0 Тогда
> // ТаблицаНоменклатуры.УдалитьСтроку();
> // КонецЕсли;
ТаблицаНоменклатуры.НоваяСтрока();
ТаблицаНоменклатуры.Номенклатура = Рег.Номенклатура;
ТаблицаНоменклатуры.Количество = -Рег.Количество;
ТаблицаНоменклатуры.Цена = 0;
> КонецЦикла;
ТаблицаНоменклатуры.Свернуть("Номенклатура", "Количество, Цена");
> //КонецЦикла;
>
>
>
>ДокВ=СоздатьОбъект("Документ.ПоступлениеТМЦ"); > Контрагенты = СоздатьОбъект("Справочник.Контрагенты");
> ....
> ТаблицаНоменклатуры.ВыбратьСтроки();
> Пока ТаблицаНоменклатуры.ПолучитьСтроку() = 1 Цикл
Если ТаблицаНоменклатуры.Количество <= 0 Тогда Продолжить; КонецЕсли;
> ДокВ.НоваяСтрока();
> ДокВ.Номенклатура = ТаблицаНоменклатуры.Номенклатура;
> ДокВ.Количество = ТаблицаНоменклатуры.Количество;
> ДокВ.Цена = ТаблицаНоменклатуры.Цена;
> ДокВ.Сумма = ДокВ.Количество * ДокВ.Цена;
> КонецЦикла;
Если ДокВ.Количество() > 0 Тогда
> ДокВ.Записать();
> Сообщить("Записан новый документ "+ДокВ.Вид()+", №: "+ДокВ.НомерДок+" от "+ДокВ.ДатаДок);
КонецЕсли;
> КонецПроцедуры
>
При этом стоит учесть:
Если в документе у вас несколько строк с одной номенклатурой, то свертка увеличит Цену, что в общем-то не верно. А если учесть, что вы их собираете из разных документов - вероятность такого случая достаточна хорошая. Вывод - Собирать 2 таблицы одна с количеством, другая с ценой. В случае разных цен, можно будет усреднить или еще как-то обработать.
"
ЗиК .292. В своде проводок "обойти" 97 счет1С 8.1 базовая. Релиз 1.6.23.2 Как активировать программу на Windows 7 64-bit???
Читают тему
(гостей: 1)