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

Остатки товара в форме списка справочника на определённую дату

Автор Сергей_1, 05 ноя 2012, 21:06

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

Сергей_1

Остатки товара в форме списка справочника на определённую дату
У меня есть в форме списка для подбора в табличной части реквизит "Текст", там в сфойствах формула:  ОстатокТовараНаСкладе() , она вызывает из модуля

Функция ОстатокТовараНаСкладе()
   Если Склад.Выбран()=1 Тогда
      Возврат Формат(Регистр.ОстаткиТоваров.Остаток(Фирма,ТекущийЭлемент(),Склад,"ОстатокТовара"),"Ч6.1");
   Иначе
      Возврат Формат(Регистр.ОстаткиТоваров.СводныйОстаток(Фирма,ТекущийЭлемент(),,"ОстатокТовара"),"Ч6.1");
   КонецЕсли;
КонецФункции

и на против каждого товара я вижу остаток.
Но я хочу сделать ещё одну колонку, остаток на определённую дату (чтобы видеть в подборе, сколько было скажем 10 дней назад)
Пробывал

Функция НачОстаток() 
   Возврат Формат(Запрос.Товар),"Ч6.1");
   СпецРег = СоздатьОбъект("Регистры");
   Рег = СпецРег.ОстаткиТоваров;
   Рег.ВременныйРасчет();
   СпецРег.РассчитатьРегистрыНа(ДатаНачДвиж);
   Рег.Товар = ТекущийЭлемент();
   Рег.Фирма = Фирма;
   Если Склад.Выбран()=1 Тогда
      Рег.Склад = Склад;
   КонецЕсли;
   Рег.ОстаткиПолучить();
   ТекОстаток = Рег.ОстатокТовара;
      Возврат Формат(ТекОстаток,"Ч6.1");
КонецФункции

Это работает, но ОООЧЕНЬ медленно, пока каждая строка пересчитает свой регистр... Подскажите, как можно поступить?

Herby

возможно прямой запрос к базе быстрее будет работать, но не факт что намного быстрее.. пробовать надо.
временной расчет тяжелый, здесь ничего не придумаешь.

но уменьшить время все равно можно, вот эти операции выполняйте единожды, при открытии справочника или при смене даты, на которую вам нужно показать остатки:
   
   // спецРег и Рег сделайте глобальными переменными модуля формы списка справочника
   СпецРег = СоздатьОбъект("Регистры");
   Рег = СпецРег.ОстаткиТоваров;
   Рег.ВременныйРасчет();
   СпецРег.РассчитатьРегистрыНа(ДатаНачДвиж);

а в функции НачОстаток() пусть выполняются только непосредственно методы по получению остатка.
В вашем же варианте, создание объекта регистра и временной расчет выполняется каждый раз для каждого товара, на что уходит не мало времени.

Сергей_1

Хо-го! Заработало! В разы быстрее! Спасибо:) Сейчас ещё попробую от туда выдернуть движения (чтоб сразу показывало сколько приходило и уходило).
Я пытался при открытии формы пересчитать регистры, но не допёр переменными обозначить их:(
Добавлено: 06 ноя 2012, 12:09


Не пойму почему не срабатывает смена даты: на форме поле ввода ДатаНач, в нём формула СменаДатыНачала(), а в модуле

Процедура СменаДатыНачала()
   ДатаНачПамять=ДатаНач;
КонецПроцедуры

Вот эта ДатаНачПамять не меняется после смены ДатаНач

Herby

а что это за "ДатаНачПамять"? она во временном расчете регистра участвует или где? 

Сергей_1

Упс, простите, запарился уже, другую переменную смотр...
Добавлено: 06 ноя 2012, 21:12


Цитата: Herby от 06 ноя 2012, 09:43
   // спецРег и Рег сделайте глобальными переменными модуля формы списка справочника
   СпецРег = СоздатьОбъект("Регистры");
   Рег = СпецРег.ОстаткиТоваров;
   Рег.ВременныйРасчет();
   СпецРег.РассчитатьРегистрыНа(ДатаНачДвиж);

А я могу сюда же добавить примерно следущее:
Рег.ВыбратьДвижения(ДатаНачДвиж,ДатаКон );

А в функциях
   Пока Рег.ПолучитьДвижение() >
???

Herby

смотря что хотите сделать. если выбираете движения для каждого товара, то нет.
для каждого товара нужно устанавливать свой фильтр и потом открывать выборку

Сергей_1

Это получатся такие тормоза...
А запрос создать один раз, а потом с него выбирать получится?

Herby

из запроса данные вытягиваются быстро, но а сам запрос вы в какой момент будете выполнять?
при открытии? и будет справочник открываться "полчаса".

а показывать приход/расход в справочнике очень обязательно или вы делаете так... для общего развития?

Сергей_1

Цитата: Herby от 08 ноя 2012, 08:51а показывать приход/расход в справочнике очень обязательно или вы делаете так... для общего развития?
Удобней работать будет. Я открываю подбор, и вижу сколько было скажем 10 дней назад, сколько пришло-ушло, и по этим движениям решаю сколько надо дозаказать.

Herby

а если создать механизм автоматического заказа/дозаказа?

Теги:

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

Рейтинг@Mail.ru

Поиск