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

Добавление записей в Регистр Накопления

Автор Juli1000, 11 дек 2009, 00:37

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

Juli1000

Всем здравствуйте! Помогите пожалуйста со следующей проблемой.
Необходимо добавить записи в Регистр Накопления в середине алгоритма с дальнейшей возможностью
использования записанных данных. Традиционный способ:

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

не позволил этого сделать. Пробовала использовать метод:

Движения.РасположенияТоваров.Записать();

но возникает ошибка "не установлен Отбор". Можно ли что-то исправить или надо как-то иначе написать?

ППП

Может лучше паралельно с записью в регистр накопления сохранять данные в других временных, вспомогательных переменных  для использования в расчетах внутри алгоритма..
smo

Slin

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

Juli1000

ППП, не хочется вдаваться в детали алгоритма, но к сожалению во временных переменных хранить не получится. Я уже думала об этом варианте.
Slin, модуль большой, но кусок, где идёт работа с регистрами следующий:

// освобождение наименее заполненных полок
Для каждого ТекСтрока Из ПодходящиеПолки Цикл
ТекПолка = ТекСтрока.НомерПолки;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|   РасположенияТоваровОстатки.НомерПолки,
|   РасположенияТоваровОстатки.КоличествоОстаток Как Количество,
|   РасположенияТоваровОстатки.Наименование,
|   РасположенияТоваровОстатки.Артикул
|ИЗ
|   РегистрНакопления.РасположенияТоваров.Остатки КАК РасположенияТоваровОстатки
|ГДЕ
|   РасположенияТоваровОстатки.НомерПолки = &НомерПолки";

Запрос.УстановитьПараметр("НомерПолки", ТекПолка);

Результат = Запрос.Выполнить().Выгрузить();

Для каждого Строка Из Результат Цикл                           
ТекАртикул = Строка.Артикул;
Количество = Строка.Количество;

// функция из глобального модуля, где тоже нужны данные, которые записываю в регистр.               
Размещение = МодульФункцийРазмещения.РазмещениеОборачивоемость(ТекАртикул,Количество);
                     
// Совершаем необходимые для расчётов проводки документов.   
// регистр РасположенияТоваров Приход, добавляем товары на новые полки      
Для Каждого ТекСтрокаРазмещение Из Размещение Цикл
   Движение = Движения.РасположенияТоваров.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.НомерПолки = ТекСтрокаРазмещение.НомерПолки;
   Движение.Наименование = ТекНаименование;
   Движение.Артикул = ТекАртикул;
   Движение.Количество = ТекСтрокаРазмещение.Количество;
КонецЦикла;
//Движения.РасположенияТоваров.Записать();         

// регистр ЗаполненностьПолок Приход
// используются данные, записанные в предыдущий регистр
Для Каждого ТекСтрокаРазмещение Из Размещение Цикл
   Движение = Движения.ЗаполненностьПолок.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.НомерПолки = ТекСтрокаРазмещение.НомерПолки;
   Регистр = РегистрыНакопления.РасположенияТоваров;
   ВыборкаИзРег = Регистр.Выбрать();
   ЗанятВес = 0;
   ЗанятОбъём = 0;
   Пока ВыборкаИзРег.Следующий() Цикл
      Если ТекСтрокаРазмещение.НомерПолки = ВыборкаИзРег.НомерПолки Тогда
         ТекАртикул = ВыборкаИзРег.Артикул;
         ТекКол = выборкаИзРег.Количество;
         ТекВес = Справочники.СписокТоваров.НайтиПоРеквизиту("АртикулТовара",ТекАртикул).Вес;
         ТекОбъём = Справочники.СписокТоваров.НайтиПоРеквизиту("АртикулТовара",ТекАртикул).Объём;
         ЗанятВес = ТекКол*ТекВес;
         ЗанятОбъём = ТекКол*ТекОбъём;
      КонецЕсли;
   КонецЦикла;
   Движение.Вес = ЗанятВес;
   Движение.Объём = ЗанятОбъём;
КонецЦикла;

Ошибки:
1. если оставить текст, как сейчас, то ошибку никакую не выдаёт, но в регистр и не записывает, в ВыборкаИзРег нет соответствующей строки;
2. если добавить строку
Движения.РасположенияТоваров.Записать();
после проводки по соответствующему регистру, то ошибка:
{Документ.ДокументНаПеремещение.Форма.ФормаДокумента(253)}: Ошибка при вызове метода контекста (Записать): Ошибка записи! Не установлен отбор по регистратору (Регистр накопления: Расположения товаров).


Боня

Юля, Slin живет в Омске или еще хуже - только он сможет вам ответить.. и то наверно в понедельник. Судя по тому, что мне остальные в асю пишут - все чего-то отмечают ) сори )

Juli1000

Спасибо за информацию :)
Когда я исправлю все ошибки, тоже буду отмечать:)

Admin

А я согласен. Пусть Юля сама на все отвечает.

Ахалай-Махалай! Юля становится Главным модератором!!!
Подпись

Juli1000

Нет, нет, нет! :) Я против! срочно ищу повод "сделать ноги" и дать другим возможность поковыряться в задаче:)

Belgafood

А поздно! Все спать легли! ты остаешься дежурной!
Подпись

Slin

Странная ошибка, скорее всего из-за релиза платформы
у меня вот все работает - при добавление записи регистратор не проставляет, но записывает как положено
Исправляется ошибка просто:
После
Движение = Движения.РасположенияТоваров.Добавить();
Запиши вручную регистратор
Движение.Регистратор = ЭтотОбъект.Ссылка;

Если не поможет, попробуй перед записью добавить
Движения.РасположенияТоваров.Отбор.Регистратор = ЭтотОбъект.Ссылка;

хотя у меня эта строчка не прокатила, в любом случае посмотри в отладчике перед записью значение
Движения.РасположенияТоваров.Отбор.Регистратор - должен быть этот документ

Ах да, еще
В 8.1 движения записываются автоматически после выполнения процедуры "обработка проведения". Если вы хотите сохранять промежуточные записи, это нужно делать вручную. Впрочем, я думаю, что это уже понятно :)

Теги:

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

Рейтинг@Mail.ru

Поиск