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

Работа с таблицей значений

Автор TamKar, 28 фев 2011, 23:50

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

TamKar

Кто сможет помочь. Результат запроса я вношу в таблицу значений, потом там сортирую и списываю товар, но движение по расходу не записывается в регистре сведений Товары на Склдае. Выкладываю код. Процедура ОбработкаПроведения(Отказ, Режим)
   
   
      МетодСписания = РегистрыСведений.ПорядокСписания.ПолучитьПоследнее(МоментВремени()).Значения;
      
      Если МетодСписания = Перечисления.Порядок.FIFO Тогда
         ПорядокСписания = "ВОЗР";
      Иначе
         ПорядокСписания = "УБЫВ";
      КонецЕсли;
      
      Запрос = Новый Запрос;
      Запрос.Текст = "ВЫБРАТЬ
                     |   расходнаяНакладнаяТовары.Номенклатура,
                     |   СУММА(расходнаяНакладнаяТовары.Количество) КАК Количество
                     |ПОМЕСТИТЬ ДокТЧ
                     |ИЗ
                     |   Документ.РасходнаяНакладная.Товары КАК расходнаяНакладнаяТовары
                     |ГДЕ
                     |   расходнаяНакладнаяТовары.Ссылка = &ссылка
                     |
                     |СГРУППИРОВАТЬ ПО
                     |   расходнаяНакладнаяТовары.Номенклатура
                     |;
                     |
                     |////////////////////////////////////////////////////////////////////////////////
                     |ВЫБРАТЬ
                     |   ДокТЧ.Номенклатура,
                     |   ДокТЧ.Количество,
                     |   ТоварыНаСкладеОстатки.Партия.Ссылка КАК ПартияСсылка,
                     |   ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                     |   ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СуммаОстаток
                     |ИЗ
                     |   ДокТЧ КАК ДокТЧ
                     |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
                     |            &МоментВремени,
                     |            Номенклатура В
                     |               (ВЫБРАТЬ
                     |                  ДокТЧ.Номенклатура
                     |               ИЗ
                     |                  ДокТЧ КАК ДокТЧ)) КАК ТоварыНаСкладеОстатки
                     |      ПО ДокТЧ.Номенклатура = ТоварыНаСкладеОстатки.Номенклатура
                     |
                     |УПОРЯДОЧИТЬ ПО
                     |   ТоварыНаСкладеОстатки.Партия.МоментВремени,
                     |   ПартияСсылка";
      
      Запрос.УстановитьПараметр("Ссылка", Ссылка);
      Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
      Результат = Запрос.Выполнить();
      
      ТаблицаПроведения = Движения.ТоварыНаСкладе.ВыгрузитьКолонки();
      
      ВыборкаИтоги = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
      
      Пока ВыборкаИтоги.Следующий() Цикл
         Если ВыборкаИтоги.Количество > ВыборкаИтоги.КоличествоОстаток Тогда
            Сообщить("Не хватает номенклатуры " + ВыборкаИтоги.Номенклатура + ", из необходимых "
            + ВыборкаИтоги.Количество + " в наличии есть " + ВыборкаИтоги.КоличествоОстаток);
            Отказ = Истина;
         КонецЕсли;
         
         Если Отказ Тогда
            Продолжить;
         КонецЕсли;
         НужноСписать = ВыборкаИтоги.Количество;
         
         
         
         Выборка = ВыборкаИтоги.Выбрать();
         Пока Выборка.Следующий() И НужноСписать > 0 Цикл
            СписатьСПартии = Мин(НужноСписать, Выборка.КоличествоОстаток);
            Стр = ТаблицаПроведения.Добавить();
            ЗаполнитьЗначенияСвойств(Стр,Выборка,,"Количество");
            Стр.Количество = СписатьСПартии;
            Стр.Сумма = СписатьСПартии / Выборка.КоличествоОстаток * Выборка.СуммаОстаток;
            НужноСписать = НужноСписать - СписатьСПартии;
         КонецЦикла;
      КонецЦикла;
      
      Если Не Отказ Тогда
         Движения.ТоварыНаСкладе.Записывать = Истина;
         ТаблицаПроведения.ЗаполнитьЗначения(Дата, "Период");
         
         ТаблицаПроведения.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход, "ВидДвижения");
         ТаблицаПроведения.ЗаполнитьЗначения(Ссылка, "Регистратор");
         ТаблицаПроведения.ЗаполнитьЗначения(Истина, "Активность");
         
         ТоварыНаСкладе = РегистрыНакопления.ТоварыНаСкладе.СоздатьНаборЗаписей();
         ТоварыНаСкладе.Отбор.Регистратор.Установить(Ссылка);
         ТоварыНаСкладе.Прочитать();
         ТоварыНаСкладе.Загрузить(ТаблицаПроведения);
         ТоварыНаСкладе.Записать();    
         
      КонецЕсли;
      
      ТаблицаПроведения = Товары.Выгрузить();
      ТаблицаПроведения.Свернуть("Номенклатура", "Количество, Сумма");
      ТаблицаПроведения.Колонки.Добавить("Период");
      ТаблицаПроведения.ЗаполнитьЗначения(Дата, "Период");
      ТаблицаПроведения.Колонки.Добавить("Регистратор");
      ТаблицаПроведения.ЗаполнитьЗначения(Ссылка, "Регистратор");
      ТаблицаПроведения.Колонки.Добавить("Активность");
      ТаблицаПроведения.ЗаполнитьЗначения(Истина, "Активность");

        Продажи = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
      Продажи.Отбор.Регистратор.Установить(Ссылка);
      Продажи.Прочитать();
      Продажи.Загрузить(ТаблицаПроведения);
      Продажи.Записать();
   

   КонецПроцедуры

Подскижете что не правильно делаю

cska-fanat-kz

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

Просто вопрос: зачем вам все эти "Выгрузитьколонку()", "СоздатьНаборЗаписей" и т.п.?

Чем вам не нравится стандартнейшее

Движение = Движения.ТоварыНаСкладе.Добавить();
Движение = ВидДвиженияНакопления.Расход;
и т.д...

Поля регистра Регистратор и Активность явно устанавливать не надо - они сами заполнятся...
Если конечно идти через Движения...

Даже если вы и добьетесь что записи в регистр попадут.
Но мне кажется что операция ОТМЕНЫ проведения не сработает.
Процедуру ОбработкаОтменыПроведения тоже придется писать в ручную...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

progmikon

Полностью согласен с cska-fanat-kz(за что ему +1). У вас оптимальный запрос с точки зрения получения остатков, а вот движения....Делайте через "Движения". Код сократиться раза в два. + к тому, мне кажется можно и в одной выборке в оба регистра писать.

Теги:

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

Рейтинг@Mail.ru

Поиск