8.х Программным образом получить значение регистра накопления

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Sergey-911, 2 авг 2010.

  1. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Доброго времени суток уважаемые!
    Необходимо программным образом получить значение регистра накопления - «Остатки».
    В случае регистра сведений есть удобная функция:
    Код:
    //Получить актуальные значения ресурсов регистра сведений
    ЗначенияРесурсов=РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата,Отбор);
    
    
    В случае же регистра накопления применить данную, или аналогичную функцию я не смог. Вышел из положения при помощи выполнения запроса:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |ОстаткиОстаткиИОбороты.КоличествоБроньКонечныйОстаток
    |ИЗ
    |РегистрНакопления.Остатки.ОстаткиИОбороты КАК ОстаткиОстаткиИОбороты
    |ГДЕ
    |ОстаткиОстаткиИОбороты.Номенклатура = &Номенклатура
    |СГРУППИРОВАТЬ ПО
    |КоличествоБроньКонечныйОстаток";
    
    //Получить текущую строку табличной части
    СтрокаТабличнойЧасти=ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;
    
    // Параметры запроса
    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    //Обрабатываем результат запроса
    Пока Выборка.Следующий() Цикл
    Номенклатура = Выборка.КоличествоБроньКонечныйОстаток;
    КонецЦикла;
    
    //Сообщить(Номенклатура);
    СтрокаТабличнойЧасти.Количество=Номенклатура;
    
    
    Но должна же быть, как и в случае регистра сведений, аналогичная функция, чтобы не заморачиваться с запросами. :unsure:
  2. sharik1c
    Offline

    sharik1c Опытный в 1С

    Регистрация:
    7 июл 2010
    Сообщения:
    56
    Симпатии:
    0
    Баллы:
    26
    РегистрыНакопления.ИмяРегистра.Остатки(<МоментВремени>, <Отбор>, <Измерения>, <Ресурсы>)
    Структуру отбора иногда описывать нуднее чем запрос
  3. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Спасибо sharik1c
    Регистр у меня называется Остатки. Измерения - Номенклатура (тип данных - СправочникСсылка.Номенклатура - строка). Ресурсы - КоличествоФакт и КоличествоБронь (тип данных - число). Попробовал написать:
    Код:
    Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти=ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;
    СтрокаТабличнойЧасти.Количество=РегистрыНакопления.Остатки.Остатки(Дата, Элемент.Значение, Номенклатура, КоличествоБронь);
    КонецПроцедуры
    
    
    При выполнении данного кода выдается ошибка параметра 2 в строке:
    Код:
    СтрокаТабличнойЧасти.Количество=РегистрыНакопления.Остатки.Остатки(Дата, Элемент.Значение, Номенклатура, КоличествоБронь);
    
    
    В инете поискал, ответа так и не нашел. Параметры попробовал указать в скобках и без. В общем - так и не разобрался.
    sharik1c, помоги еще раз плиз. Я в 1С только начинаю программировать.
  4. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Попробовал еще так:
    Код:
    Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти=ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;
    Отбор=Новый Структура("Номенклатура",Элемент.Значение);
    СтрокаТабличнойЧасти.Количество=РегистрыНакопления.Остатки.Остатки(Дата, Отбор, "Номенклатура", "КоличествоБронь");
    КонецПроцедуры
    
    
    Результат почему-то во всех случаях 0, хотя это не так. Но ошибки во время выполнения кода не отображаются. :unsure:
  5. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Это потому что возвращаемое значение ТаблицаЗначений. Почитайте в синтакс-помощнике про этот метод
  6. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    И я бы советовал Переименовать регистр Остатки как нить по другому. например ОстаткиНаСкладах.
  7. TopicStarter Overlay
    Sergey-911
    Offline

    Sergey-911

    Регистрация:
    1 авг 2007
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    sharik1c, has, Draco
    Огромное Вам спасибо, впрочем, как и всем посетителям сайта. :smile:
    На всякий случай работающий код (если в нем есть ошибки - буду признателен, если укажите на них):
    Код:
    //В поиске "РегистрыНакопления Остатки"
    СтрокаТабличнойЧасти=ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;
    Остатки = РегистрыНакопления.Остатки;
    Фильтр = Новый Структура;
    Фильтр.Вставить("Номенклатура",СтрокаТабличнойЧасти.Номенклатура);
    ТабОстатков = Остатки.Остатки(Дата,Фильтр, "Номенклатура", "КоличествоБронь");
    //Результат (Для избежания ошибки в случае пустого массива)
    Если ТабОстатков.Количество()<>0 Тогда  
    КоличествоФакт = ТабОстатков[0].КоличествоБронь;
    Иначе
    КоличествоФакт=0;	
    КонецЕсли;	
    СтрокаТабличнойЧасти.Количество=КоличествоФакт;	
    
    
    Еще, хочу знать, какой вариант работает предпочтительнее и работает быстрее, данный, или с запросом, описанный выше? :unsure:
  8. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!
    Работать будет быстрее второй запрос, хотя бы потому что Вы тут используете виртуальный регистр Остатки, а в том запросе регистр ОстаткиИОбороты. К тому же во втором запросе стоит параметр Дата, что немного уменьшит количество перебираемых итогом.
    Однако если сделать первый и второй запрос идентичными, то я в скорости разницы не замечал, но 1 код понятен и нагляден, к тому же сложный запрос можно написать только первым способом, и, в нагрузку, Запрос Вы отчетливо видите и точно не засунете случайно в цикл в отличии от второго варианта :unsure:

Поделиться этой страницей