Реквизит в запросе регистра накопления |
Я |
08.12.09 — 11:10
Как получить что хранится в реквизите регистра накопления через запрос и можно ли в запросе поставить отбор по этому реквизиту? У кого-нибудь есть простой и понятный пример?
1 — 08.12.09 — 11:13
ВЫБРАТЬ
Регистр.Измерение
ИЗ
РегистрНакопления.ТвойРегистр КАК Регистр
ГДЕ
Регистр.ТвойРеквизит = &ТвойРеквизит
2 — 08.12.09 — 11:15
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПартииТоваровНаСкладах.Склад,
СУММА(ПартииТоваровНаСкладах.Стоимость) КАК Стоимость
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
ПартииТоваровНаСкладах.Период МЕЖДУ &НачПериода И &КонПериода
И ПартииТоваровНаСкладах.КодОперации В(&КодОперации)
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладах.Склад
3 — 08.12.09 — 11:19
(0) Не используй виртуальные таблицы, используй таблицу «РегистрНакопления.НазваниеРегистра». Он там будет, можно использовать так же, как и измерение.
4 — 08.12.09 — 11:33
Михей у тебя будет Регистр.<?>ТвойРеквизит = &ТвойРеквизит — поле не найдено!
5 — 08.12.09 — 11:36
(4) чего это?
6 — 08.12.09 — 11:38
(4) Это твой первый запрос?
7 — 08.12.09 — 11:40
Вот допустим у меня регистр накопления: измерение Номенклатура, ресурс Количество, реквизит Контрагент.
Запрос=Новый Запрос;
Запрос.Текст=
«ВЫБРАТЬ
| Регистр.КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.ПартииНоменклатуры.ОстаткиИОбороты КАК Регистр»;
РезультатЗапроса=Запрос.Выполнить();
Для Каждого Партия Из РезультатЗапроса Цикл
Сообщить(Строка(Партия.Контрагент));
КонецЦикла;
Будет ошибка итератора!!!
8 — 08.12.09 — 11:44
-Содержание справки
-1С Предприятие
-Встроенный язык
-Работа с запросами
-Выполнение и работа с запросами во встроенном языке
-Основные приемы работы
9 — 08.12.09 — 11:44
Запрос=Новый Запрос;
Запрос.Текст=
«ВЫБРАТЬ
| Регистр.КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.ПартииНоменклатуры.ОстаткиИОбороты КАК Регистр
| ГДЕ
| Регистр.Контрагент = &Контрагент»;
Запрос.УстановитьПараметр(«Контрагент»,Контрагент);
РезультатЗапроса=Запрос.Выполнить();
Для Каждого Партия Из РезультатЗапроса Цикл
Сообщить(Строка(Партия.КоличествоКонечныйОстаток));
КонецЦикла;
Регистр.<?>Контрагент = &Контрагент»; — поле не найдено! — как предложил михей!
10 — 08.12.09 — 11:46
(9) конечно, откуда в партиях контрагент?
11 — 08.12.09 — 11:47
(9) чукча не читатель, чукча писатель? Сравни свой запрос с запросом михея и найди 10 отличий.
12 — 08.12.09 — 11:50
hhhh — мой последний проверь и результат такой же!
13 — 08.12.09 — 11:54
Запрос=Новый Запрос;
Запрос.Текст=
«ВЫБРАТЬ
| Регистр.Номенклатура
|ИЗ
| РегистрНакопления.ПартииНоменклатуры КАК Регистр
|ГДЕ
| Регистр.Контрагент = &Контрагент»;
Запрос.УстановитьПараметр(«Контрагент»,Контрагент);
РезультатЗапроса=Запрос.Выполнить();
Для Каждого Партия Из РезультатЗапроса Цикл
Сообщить(Строка(Партия.Номенклатура));
КонецЦикла;
ИТЕРАТОР не определен!
14 — 08.12.09 — 11:56
(13) у результатзапроса его и нету, выборку сделай
15 — 08.12.09 — 11:57
Михей как?
16 — 08.12.09 — 11:57
Запрос=Новый Запрос;
Запрос.Текст=
«ВЫБРАТЬ
| Регистр.Номенклатура
|ИЗ
| РегистрНакопления.ПартииНоменклатуры КАК Регистр
|ГДЕ
| Регистр.Контрагент = &Контрагент»;
Запрос.УстановитьПараметр(«Контрагент»,Контрагент);
РезультатЗапроса=Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Номенклатура));
КонецЦикла;
17 — 08.12.09 — 12:00
Реально — выводит номенклатуру!
18 — 08.12.09 — 12:01
Как тогда получить ресурсы (остатки)?
19 — 08.12.09 — 12:02
(18) есе тебе по реквизиту отбор нужен и еще остатки то тока через ЖПО
20 — 08.12.09 — 12:03
?????
21 — 08.12.09 — 12:04
примерно так
ВЫБРАТЬ
СУММА(ВЫБОР
КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) ТОГДА
Регистр.Количество
ИНАЧЕ
— Регистр.Количество
КОНЕЦ) КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ТвойРегистр КАК Регистр
ГДЕ
Регистр.ТвойРеквизит = &ТвойРеквизит
22 — 08.12.09 — 12:09
Запрос=Новый Запрос;
Запрос.Текст=
«ВЫБРАТЬ
|СУММА(ВЫБОР КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) ТОГДА Регистр.Количество ИНАЧЕ -Регистр.Количество КОНЕЦ) КАК Количество
|ИЗ
| РегистрНакопления.ПартииНоменклатуры КАК Регистр
|ГДЕ
| Регистр.Контрагент = &Контрагент»;
Запрос.УстановитьПараметр(«Контрагент»,Контрагент);
РезультатЗапроса=Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Количество));
КонецЦикла;
Выводит правильно!!!
СПАСИБО!!!!!!!!!!!!!!!!! ОГРОМНОЕ!!!!!!!
23 — 08.12.09 — 12:10
А улучшить его никак нельзя?
24 — 08.12.09 — 12:11
(23) вряд ли, ты ж по реквизиту хочешь, а в разрезе него остатки не хранятся
25 — 08.12.09 — 12:13
Да, у нас просто перекинули два измерения в реквизиты (Поставщик, документПрихода) в регистре ПартииНоменклатуры!
Так что я все поправлять буду! Теперь я понял как!
26 — 08.12.09 — 12:37
(25) это они лоханулись.
27 — 08.12.09 — 12:52
Теперь полностью ничего не получается вытащить кроме как одно количество!!!
Как исправить?
28 — 08.12.09 — 12:58
Исправил:
Запрос=Новый Запрос;
Запрос.Текст=
«ВЫБРАТЬ
| СУММА(ВЫБОР
| КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА Регистр.Количество
| ИНАЧЕ -Регистр.Количество
| КОНЕЦ) КАК Количество,
| Регистр.Номенклатура,
| Регистр.ДокументПрихода
|ИЗ
| РегистрНакопления.ПартииНоменклатуры КАК Регистр
|ГДЕ
| Регистр.Контрагент = &Контрагент
| И Регистр.Период МЕЖДУ &ДатаНачала И &ДатаКонца
|
|СГРУППИРОВАТЬ ПО
| Регистр.Номенклатура,
| Регистр.ДокументПрихода»;
Запрос.УстановитьПараметр(«Контрагент»,Контрагент);
Запрос.УстановитьПараметр(«ДатаНачала», НачалоДня(НачПериода));
Запрос.УстановитьПараметр(«ДатаКонца», КонецДня(КонПериода));
РезультатЗапроса=Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.ДокументПрихода));
КонецЦикла;
severbap
29 — 08.12.09 — 13:12
как насчет прихода и расхода?
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
/// Как прочитать записи регистра накопления в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьЗаписиРегистраНакопленияНаСервере() // Получим все записи регистра накопления ЗаказыКлиентов // по организации ООО "Ромашка" за 1 квартал 2014 года, // упорядочив их по возрастанию даты. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыКлиентов.Период, | ЗаказыКлиентов.Регистратор, | ЗаказыКлиентов.НомерСтроки, | ЗаказыКлиентов.Активность, | ЗаказыКлиентов.Контрагент, | ЗаказыКлиентов.Номенклатура, | ЗаказыКлиентов.Количество |ИЗ | РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов |ГДЕ | ЗаказыКлиентов.Активность = Истина И | ЗаказыКлиентов.Организация = &ВыбОрганизация И | ЗаказыКлиентов.Период МЕЖДУ &НачДата И &КонДата |УПОРЯДОЧИТЬ ПО | ЗаказыКлиентов.Период"; Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); // начальная дата - 1 января 2014 года Запрос.УстановитьПараметр("НачДата", '20140101000000'); // конечная дата - 31 марта 2014 года 23 часа 59 минут 59 секунд Запрос.УстановитьПараметр("КонДата", '20140331235959'); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Записи.Период + "] " + Записи.Номенклатура + " " + Записи.Количество + " шт." + " (" + Записи.Регистратор + ")" ); КонецЦикла; КонецПроцедуры /// Как получить обороты по регистру накопления в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьОборотыПоРегиструНапопленияНаСервере() // За получение оборотов по регистру накопления за произвольный период // с заданной периодичностью в различных разрезах аналитики отвечает // виртуальная таблица Обороты, // у неё есть следующие параметры: // 1. Начало периода (включая) // 2. Конец периода (включая) // 3. Периодичность (например, Период, Запись, Год, Месяц...) // 4. Условие (например, Организация = &ВыбОрганизация) // Пример №1 Сообщить("Пример №1"); // Посчитаем сколько и каких продуктов было заказано за 1 квартал // 2014 года в организации ООО "Ромашка". Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыКлиентовОбороты.Номенклатура, | ЗаказыКлиентовОбороты.Организация, | ЗаказыКлиентовОбороты.КоличествоОборот |ИЗ | РегистрНакопления.ЗаказыКлиентов.Обороты( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59), | Период, | Организация = &ВыбОрганизация | ) КАК ЗаказыКлиентовОбороты |УПОРЯДОЧИТЬ ПО | ЗаказыКлиентовОбороты.Номенклатура"; Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "За 1 кв. 2014 года заказали " + Записи.КоличествоОборот + " шт. " + Записи.Номенклатура ); КонецЦикла; // Пример №2 Сообщить("Пример №2"); // Посчитаем сколько бананов было заказано за каждый месяц // в 1 квартале 2014 года в организации "Ромашка". Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыКлиентовОбороты.Период, | ЗаказыКлиентовОбороты.Номенклатура, | ЗаказыКлиентовОбороты.Организация, | ЗаказыКлиентовОбороты.КоличествоОборот |ИЗ | РегистрНакопления.ЗаказыКлиентов.Обороты( | &НачПериод, | &КонПериод, | Месяц, | Организация = &ВыбОрганизация И | Номенклатура = &ВыбНоменклатура | ) КАК ЗаказыКлиентовОбороты |УПОРЯДОЧИТЬ ПО | ЗаказыКлиентовОбороты.Период"; Запрос.УстановитьПараметр("НачПериод", '20140101000000'); Запрос.УстановитьПараметр("КонПериод", '20140331235959'); Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); Запрос.УстановитьПараметр("ВыбНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Банан") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "За " + Формат(Записи.Период, "ДФ=ММММ") + " заказали " + Записи.КоличествоОборот + " шт. " + Записи.Номенклатура ); КонецЦикла; КонецПроцедуры /// Как получить остатки по регистру накопления в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьОстаткиПоРегиструНакопленияНаСервере() // За получение остатков по регистру накопления в разрезе // аналитики отвечает виртуальная таблица Остатки, // у неё есть следующие параметры: // 1. Период, на который считаем остатки, исключая саму дату. // Если нужны остатки на дату включительно - используем // тип Граница (см. пример ниже). // 2. Условие (например, Организация = &ВыбОрганизация) // Получим остатки бананов на основном складе в организации // ООО "Ромашка" на 31 марта 2014 года (включительно) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗапасыЕдыОстатки.Склад, | ЗапасыЕдыОстатки.Номенклатура, | ЗапасыЕдыОстатки.Организация, | ЗапасыЕдыОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ЗапасыЕды.Остатки( | &ВыбДата, | Склад = &ВыбСклад И | Номенклатура = &ВыбНоменклатура | ) КАК ЗапасыЕдыОстатки"; Запрос.УстановитьПараметр("ВыбДата", Новый Граница('20140331235959', ВидГраницы.Включая) ); Запрос.УстановитьПараметр("ВыбСклад", Справочники.Склады.НайтиПоНаименованию("Основной") ); Запрос.УстановитьПараметр("ВыбНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Банан") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "Остатки " + " " + Записи.Номенклатура + " на складе " + Записи.Склад + " на дату " + "31.03.2014 (включительно) " + " составляют " + Записи.КоличествоОстаток + " шт."); КонецЦикла; КонецПроцедуры /// Как получить сразу остатки и обороты по регистру /// накопления в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьСразуОстаткиИОборотыПоРегиструНакопленияНаСервере() // За получение остатков и оборотов за произвольный период // с заданной периодичностью в разрезе аналитики отвечает // виртуальная таблица ОстаткиИОбороты, у неё есть параметры: // 1. Начало периода (включая) // 2. Конец периода (включая) // 3. Периодичность (например, Период, Год, Месяц...) // 4. Метод дополнения периодов (Движение или ДвиженияИГраницыПериода) // 5. Условие (например, Организация = &ВыбОрганизация) // Для примера получим начальный остаток, приход, расход и конечный остаток // банана на всех складах за каждый месяц 2014 года для // организация ООО "Ромашка". Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗапасыЕдыОстаткиИОбороты.Период, | ЗапасыЕдыОстаткиИОбороты.Номенклатура, | ЗапасыЕдыОстаткиИОбороты.Организация, | ЗапасыЕдыОстаткиИОбороты.КоличествоНачальныйОстаток, | ЗапасыЕдыОстаткиИОбороты.КоличествоОборот, | ЗапасыЕдыОстаткиИОбороты.КоличествоПриход, | ЗапасыЕдыОстаткиИОбороты.КоличествоРасход, | ЗапасыЕдыОстаткиИОбороты.КоличествоКонечныйОстаток |ИЗ | РегистрНакопления.ЗапасыЕды.ОстаткиИОбороты( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59), | Месяц, ДвиженияИГраницыПериода, | Организация = &ВыбОрганизация И | Номенклатура = &ВыбНоменклатура | ) КАК ЗапасыЕдыОстаткиИОбороты |УПОРЯДОЧИТЬ ПО | ЗапасыЕдыОстаткиИОбороты.Период"; Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); Запрос.УстановитьПараметр("ВыбНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Банан") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( Формат(Записи.Период, "ДФ=ММММ") + " [" + Записи.Номенклатура + "] " + "нач. остаток " + Записи.КоличествоНачальныйОстаток + " приход " + Записи.КоличествоПриход + ", расход " + Записи.КоличествоРасход + " кон. остаток " + Записи.КоличествоКонечныйОстаток ); КонецЦикла; КонецПроцедуры /// Как найти и изменить программно записи в регистр накопления /// документа (регистратора) в 1с 8.3, 8.2 &НаСервере Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере() // Предположим у нас есть ссылка на проведенный документ // поступления еды № ВМБП-000002 ПоступлениеСсылка = Документы.ПоступлениеЕды.НайтиПоНомеру( "ВМБП-000002", '20141231' ); // Мы значем, что этот документ делает следующие записи // в регистр накопления "ЗапасыЕды": // Приход [Организация, Склад, Номенклатура] [Количество] // Наша задача: найти эти записи и изменить // их (например, удвоим количество поступившего товара) // и записать вместо старых. // Используем объектную технику получения записей, // ведь мы будем их изменять. Поступление = ПоступлениеСсылка.ПолучитьОбъект(); // Получим набор записей этого документа в регистр "ЗапасыЕды". НаборЗаписей = Поступление.Движения.ЗапасыЕды; // Прочитаем записи из базы данных. НаборЗаписей.Прочитать(); Для Каждого Запись Из НаборЗаписей Цикл // Выведем старые значения. Сообщить( "[" + Запись.Организация + ", " + Запись.Склад + ", " + Запись.Номенклатура + "] " + "[" + Запись.Количество + "]" ); // Удвоим количество. Запись.Количество = 2 * Запись.Количество; КонецЦикла; // Добавим новую запись в регистр накопления. НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка"""); НоваяЗапись.Склад = Справочники.Склады.НайтиПоНаименованию("Основной"); НоваяЗапись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Банан"); НоваяЗапись.Период = ТекущаяДата(); НоваяЗапись.Количество = 1000; // Разом запишем набор записей. НаборЗаписей.Записать( Истина // удалим старые записи и запишем вместо них новые ); // Теперь записи регистра ЗапасыЕды по документу № ВМБП-000002, // отличаются от тех, что были записаны документом при проведении. // Чтобы вернуть их к начальному виду - нужно // перепровести документ. КонецПроцедуры /// Как прочитать записи документа в регистр накопления /// запросом в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере() // Этот приём используется, если не требуется изменять // найденные записи. // Предположим у нас есть ссылка на проведенный документ // поступления еды № ВМБП-000002 ПоступлениеСсылка = Документы.ПоступлениеЕды.НайтиПоНомеру( "ВМБП-000002", '20141231' ); // Мы значем, что этот документ делает записи // в регистр накопления "ЗапасыЕды". // Прочитаем эти записи запросом. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗапасыЕды.Период, | ЗапасыЕды.Регистратор, | ЗапасыЕды.НомерСтроки, | ЗапасыЕды.Активность, | ЗапасыЕды.ВидДвижения, | ЗапасыЕды.Склад, | ЗапасыЕды.Номенклатура, | ЗапасыЕды.Организация, | ЗапасыЕды.Количество |ИЗ | РегистрНакопления.ЗапасыЕды КАК ЗапасыЕды |ГДЕ | ЗапасыЕды.Регистратор = &ВыбРегистратор |УПОРЯДОЧИТЬ ПО | ЗапасыЕды.НомерСтроки"; Запрос.УстановитьПараметр( "ВыбРегистратор", ПоступлениеСсылка ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Записи.Организация + ", " + Записи.Склад + ", " + Записи.Номенклатура + "] " + "[" + Записи.Количество + "]" ); КонецЦикла; КонецПроцедуры /// Как создать записи регистра накопления без привязки /// к документу в 1с 8.3, 8.2 &НаСервере Процедура КакСоздатьЗаписиБезДокументаНаСервере() // В нашей тестовой конфигурации нет документа // "ОперацияБух", который присутствует в бухгалтерской базе. Сообщить("Этот пример нельзя выполнить в этой базе."); Возврат; // Записи регистра накопления обязательно // должны быть привязаны к документу, в данном случае // этим документом будет документ "ОперацияБух", // задуманный как раз для ручных операций. Операция = Документы.ОперацияБух.СоздатьДокумент(); Операция.Дата = ТекущаяДата(); Операция.Организация = Справочники.Организации.НайтиПоНаименованию("Милькин В. В. ИП"); Операция.СуммаОперации = 1000; Операция.Содержание = "Ручная операция по регистру накопления ИПДоходы"; Операция.Записать(РежимЗаписиДокумента.Запись); // Затем получаем его набор записей для регистра ИПДоходы НаборЗаписей = Операция.Движения.ИПДоходы; Запись = НаборЗаписей.Добавить(); Запись.Период = Операция.Дата; Запись.Организация = Операция.Организация; // и т.д. заполняем все нужные поля регистра Запись.Сумма = 1000; НаборЗаписей.Записать(Истина); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
1 |
|
22.11.2009, 14:39. Показов 28629. Ответов 11
Вообщем ситуация простая: необходимо переписать типовой отчет «Остатки товаров» так как в регистре накопления убрали из измерений Контрагент и ДокументПрихода, перенесли в реквизиты! Отчет впринципе работает без отбора по этим (Контрагент и ДокументПрихода). Я :google: и толком ничего не нашел как можно реализовать СОЕДИНЕНИЕ такого » » в такой поставленой задачи.??
0 |
0 / 0 / 0 Регистрация: 24.12.2008 Сообщений: 1,399 |
|
22.11.2009, 20:48 |
2 |
Видимо придется делать запрос по движениям с последующей группировкой, что существенно замедлит выполнение. Копать, мне кажется лучше в сторону выбора подходящего регистра — например партий.
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
23.11.2009, 08:30 |
3 |
уже давно определились! Я же написал что поменялся регистр накопления партии номенклатуры, перемещены контрагент и документ прихода в реквизиты … нужно просто переписать запрос в отчете нужно как-то написать что бы при указании партии и поставщика он делал отбор по реквизиту (ведь теперь это не измерение а реквизит — и это усложняет так как я незнаю в какую сторону рыть) :crash:
0 |
0 / 0 / 0 Регистрация: 24.12.2008 Сообщений: 1,399 |
|
23.11.2009, 21:32 |
4 |
Пример: «ВЫБРАТЬ СГРУППИРОВАТЬ ПО Только вот не понятно, зачем вы убрали Партию из измерений регистра партий. По партиям обычно еще и остатки получают.
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
06.12.2009, 14:29 |
5 |
unknown181538 одна партийка должна быть!
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
06.12.2009, 15:41 |
6 |
Ошибка будет, РозничнаяВыручка.<??>Подразделение = &Подразделение — Типа не найдено!
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
07.12.2009, 09:44 |
7 |
как в 8.1 это можно замутить?
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
07.12.2009, 12:45 |
8 |
Код Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | СУММА(ВЫБОР | КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) | ТОГДА Регистр.Количество | ИНАЧЕ -Регистр.Количество | КОНЕЦ) КАК Количество, | Регистр.Номенклатура, | Регистр.ДокументПрихода |ИЗ | РегистрНакопления.ПартииНоменклатуры КАК Регистр |ГДЕ | Регистр.Контрагент = &Контрагент | И Регистр.Период МЕЖДУ &ДатаНачала И &ДатаКонца | |СГРУППИРОВАТЬ ПО | Регистр.Номенклатура, | Регистр.ДокументПрихода"; Запрос.УстановитьПараметр("Контрагент",Контрагент); Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(НачПериода)); Запрос.УстановитьПараметр("ДатаКонца", КонецДня(КонПериода)); РезультатЗапроса=Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Строка(Выборка.ДокументПрихода)); КонецЦикла; как можно замуть с приходом и расходом?
0 |
0 / 0 / 0 Регистрация: 24.12.2008 Сообщений: 1,399 |
|
08.12.2009, 16:28 |
9 |
Ошибка будет, РозничнаяВыручка.<??>Подразделение = &Подразделение Может нету такого реквизита в вашей конфе?
как можно замуть с приходом и расходом? Не понял вопроса.
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
08.12.2009, 17:12 |
10 |
unknown181538 все нормально разобрался, вот только остается понять как надо написать что бы можно было получать начальныйостатокКоличество!
0 |
0 / 0 / 0 Регистрация: 24.12.2008 Сообщений: 1,399 |
|
08.12.2009, 21:06 |
11 |
1)Получить обороты до начальной даты в отдельной таблице и соединить таблицы.
0 |
0 / 0 / 0 Регистрация: 14.09.2007 Сообщений: 428 |
|
09.12.2009, 08:52 |
12 |
:please: счас попробую!
0 |
-
Требуется в запросе получить реквизит регистра накопления:
через выборку его не видит.
Получилось через набор записей с отбором по регистратору, но при наличии одинаковых записей в одном регистраторе выдается последнее.
Помогите или добить набор записей или подскажите другой способ. :unsure: -
Offline
lazy
Модераторы
Команда форума
Модератор- Регистрация:
- 1 сен 2007
- Сообщения:
- 2.127
- Симпатии:
- 4
- Баллы:
- 29
Физически не ощущаю проблемы.
ВЫБРАТЬ ТоварыНаСкладах.КодОперации, ТоварыНаСкладах.Склад, ТоварыНаСкладах.Номенклатура, ТоварыНаСкладах.ХарактеристикаНоменклатуры, ТоварыНаСкладах.СерияНоменклатуры, ТоварыНаСкладах.Качество, ТоварыНаСкладах.Количество ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
Здесь КодОперации — реквизит регистра накопления ТоварыНаСкладах. Успешно выдается при выполнении запроса…
-
Забыл уточнить: регистр накопления обороты)
-
Offline
lazy
Модераторы
Команда форума
Модератор- Регистрация:
- 1 сен 2007
- Сообщения:
- 2.127
- Симпатии:
- 4
- Баллы:
- 29
Хм, не интересовался таким делом, но подозреваю, что тебе придется расчитывать все это дело через группировки.
Т.е. обращаемся непосредственно к таблице регистра, и группируем по интересующим нас измерениям и реквизитам. Через виртуальные таблицы это кажется сделать не поулчится. Т.е. нечто вроде:ВЫБРАТЬ Затраты.Подразделение, Затраты.СтатьяЗатрат КАК СтатьяЗатрат, Затраты.КодОперации, СУММА(Затраты.Сумма) КАК Сумма, Затраты.СписаниеПартий ИЗ РегистрНакопления.Затраты КАК Затраты ГДЕ Затраты.Период МЕЖДУ &ДатаНач И &ДатаКон СГРУППИРОВАТЬ ПО Затраты.Подразделение, Затраты.СтатьяЗатрат, Затраты.КодОперации, Затраты.СписаниеПартий УПОРЯДОЧИТЬ ПО СтатьяЗатрат
-
Лана. Пока забыли. Есть запрос
"ВЫБРАТЬ | ВнеоборотныеАктивыОстаткиИОбороты.ВнеоборотныйАктив КАК ВнеоборотныйАктив, | ВнеоборотныеАктивыОстаткиИОбороты.ЭлементыЗатрат, | ВнеоборотныеАктивыОстаткиИОбороты.Организация, | ВнеоборотныеАктивыОстаткиИОбороты.СчетКВ, | ВнеоборотныеАктивыОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток, | ВнеоборотныеАктивыОстаткиИОбороты.НДСНачальныйОстаток КАК НДСНачальныйОстаток, | ВнеоборотныеАктивыОстаткиИОбороты.СуммаПриход КАК СуммаПриход, | ВнеоборотныеАктивыОстаткиИОбороты.НДСПриход КАК НДСПриход, | ВнеоборотныеАктивыОстаткиИОбороты.СуммаРасход КАК СуммаРасход, | ВнеоборотныеАктивыОстаткиИОбороты.НДСРасход КАК НДСРасход, | ВнеоборотныеАктивыОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток, | ВнеоборотныеАктивыОстаткиИОбороты.НДСКонечныйОстаток КАК НДСКонечныйОстаток, | ВнеоборотныеАктивыОстаткиИОбороты.Регистратор, | ВнеоборотныеАктивыОстаткиИОбороты.НомерСтроки |ИЗ | РегистрНакопления.ВнеоборотныеАктивы.ОстаткиИОбороты(&НачДата, &КонДата, Запись, , | "+?(пусто(Организация),"","Организация = &Организация И ")+" | "+?(пусто(Капвлож),"","ВнеоборотныйАктив = &Капвлож И ")+"СчетКВ в Иерархии (&СчетКВ) ) | КАК ВнеоборотныеАктивыОстаткиИОбороты | |УПОРЯДОЧИТЬ ПО | ВнеоборотныйАктив |ИТОГИ | СУММА(СуммаНачальныйОстаток), | СУММА(НДСНачальныйОстаток), | СУММА(СуммаПриход), | СУММА(НДСПриход), | СУММА(СуммаРасход), | СУММА(НДСРасход), | СУММА(СуммаКонечныйОстаток), | СУММА(НДСКонечныйОстаток) |ПО | ОБЩИЕ, | ВнеоборотныйАктив";
Этот запрос выбирает из регистра записи по условиям (даты, организация, счет).
Вопрос: Почему он выдает кроме строк подходящих по условию еще и другие строки, которые не подходят. Неправильные строки он выдает пустыми т.е. в отчет добавляется пустая строка. Анализ показал что количество пустых строк вроде как равно всем не попавшим в условие + группирвки какието по ходу.
Написал сам не пойму что, но может кто подскажет что. -
Offline
LordKim
Опытный в 1С- Регистрация:
- 11 мар 2008
- Сообщения:
- 118
- Симпатии:
- 0
- Баллы:
- 26
Это:|ИЗ | РегистрНакопления.ВнеоборотныеАктивы.ОстаткиИОбороты(&НачДата, &КонДата, Запись, , "+?(пусто(Организация),"","Организация = &Организация И ")+" | "+?(пусто(Капвлож),"","ВнеоборотныйАктив = &Капвлож И ")+"СчетКВ в Иерархии (&СчетКВ) ) КАК ВнеоборотныеАктивыОстаткиИОбороты
Попробуй заменить на это:
|ИЗ | РегистрНакопления.ВнеоборотныеАктивы.ОстаткиИОбороты(&НачДата, &КонДата, Запись) |ГДЕ | СчетКВ в Иерархии (&СчетКВ) | "+?(пусто(Капвлож), "", "И ВнеоборотныйАктив = &Капвлож")+" | "+?(пусто(Организация), "", "И Организация = &Организация")+" КАК ВнеоборотныеАктивыОстаткиИОбороты
-
Спасибо, но нет. От того что вынесли условие ниче не изменилось, да и так делать не рекомендуют. Что то другое…
-
Offline
LordKim
Опытный в 1С- Регистрация:
- 11 мар 2008
- Сообщения:
- 118
- Симпатии:
- 0
- Баллы:
- 26
Не рекомендуют?)
Кто? Где? Можно почитать рекомендации? -
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
LordKim,
Использование условий в ГДЕ и в параметрах вирт таблиц — это разные вещи. В 99,9% случаев нужно использовать условия в параметрах. -
Offline
LordKim
Опытный в 1С- Регистрация:
- 11 мар 2008
- Сообщения:
- 118
- Симпатии:
- 0
- Баллы:
- 26
Почему?
Дай тему или параметры для поиска, почитаю) -
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Первый запрос:
"ВЫБРАТЬ ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки"
Второй запрос:
"ВЫБРАТЬ ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки ГДЕ ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура"
В первом варианте накладывается фильтр на таблицу остатков, после чего выдается остаток по фильтру.
Во втором варианте сначала выбирается ВСЯ таблица остатков и только потом накладывается фильтр и получается остаток.В случае больших таблиц разница во времени исполнения может достигать несколько ДЕСЯТКОВ порядков. В частности, я сталкивался со случаями, когда первый запрос выполнялся за 0.02 секунды, когда второй выполнялся за 18…
PS. Также, в связи с этой особенностью, иногда могут получаться различные результаты работы запросов.
PPS. На ИТС, вроде, было описание… -
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
:unsure:
Akuji,
Сорри за оффтоп -
Offline
LordKim
Опытный в 1С- Регистрация:
- 11 мар 2008
- Сообщения:
- 118
- Симпатии:
- 0
- Баллы:
- 26
Регистр накопления в 1С 8.3 — это объект конфигурации, который образует многомерную систему измерений и позволяет накапливать числовые данные в разрезе нескольких измерений. Используется для учета движения средств (денежных, товарно-материальных ценностей, основных средств т. д.).
Подходит для автоматизации таких направлений, как складской учет, касса, взаиморасчеты, бюджетирование, планирование. С помощью такого регистра можно накапливать информацию об объемах продаж в разрезе номенклатуры и подразделения компании или об остатках товаров в разрезе номенклатуры и склада или о движении основных средств в разрезе объектов.
Чтение записей регистра накопления в 1С 8.3:
&НаСервере
Процедура ЧтениеЗаписиРегистраНакопленияНаСервере()// Получим все записи регистра накопления ЗаказыКонтрагентов
// по организации ООО «Сделай сам» за 1 квартал 2020 года, упорядочив их по возрастанию даты.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ЗаказыКонтрагентов.Период КАК Период,
| ЗаказыКонтрагентов.Регистратор КАК Регистратор,
| ЗаказыКонтрагентов.НомерСтроки КАК НомерСтроки,
| ЗаказыКонтрагентов.Активность КАК Активность,
| ЗаказыКонтрагентов.Контрагент КАК Контрагент,
| ЗаказыКонтрагентов.Материалы КАК Материалы,
| ЗаказыКонтрагентов.Количество КАК Количество
|ИЗ
| РегистрНакопления.ЗаказыКонтрагентов КАК ЗаказыКонтрагентов
|ГДЕ
| ЗаказыКонтрагентов.Активность = Истина И
| ЗаказыКонтрагентов.Организация = &ВыбОрганизация И
| ЗаказыКонтрагентов.Период МЕЖДУ &НачалоДата И &КонецДата
|УПОРЯДОЧИТЬ ПО
| ЗаказыКонтрагентов.Период»;Запрос.УстановитьПараметр(«ВыбОрганизация»,Справочники.Организации.НайтиПоНаименованию(«ООО «»Сделай сам»»»));
Запрос.УстановитьПараметр(«НачалоДата», ‘20200101000000’);// начальная дата — 1 января 2020 года
Запрос.УстановитьПараметр(«КонецДата», ‘20200331235959’);// конечная дата — 31 марта 2020 года 23 часа 59 минут 59 секунд
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(«за » + ВыборкаДетальныеЗаписи.Период + » (» + ВыборкаДетальныеЗаписи.Регистратор + «) » +
ВыборкаДетальныеЗаписи.Материалы + » » + ВыборкаДетальныеЗаписи.Количество + » шт. «);
КонецЦикла;
КонецПроцедуры
Чтение записей документа запросом в регистре накопления в 1С 8.3:
// Такая процедура используется, если не требуется изменять найденные записи.
&НаСервере
Процедура ЧтениеЗаписиДокументаЗапросомВРегистреНакопленияНаСервере()// Например у нас есть ссылка на проведенный документ Поступление на склад № МРБ-000123
ПоступлениеСсылка = Документы.ПоступлениеНаСклад.НайтиПоНомеру(«МРБ-000123», ‘20200101’);// Мы знаем, что этот документ делает записи в регистр накопления «МестоХраненияМатериалов».
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| МестоХраненияМатериалов.Период,
| МестоХраненияМатериалов.Регистратор,
| МестоХраненияМатериалов.НомерСтроки,
| МестоХраненияМатериалов.Активность,
| МестоХраненияМатериалов.ВидДвижения,
| МестоХраненияМатериалов.МестоХранения,
| МестоХраненияМатериалов.Материалы,
| МестоХраненияМатериалов.Организация,
| МестоХраненияМатериалов.Количество
|ИЗ
| РегистрНакопления.МестоХраненияМатериалов КАК МестоХраненияМатериалов
|ГДЕ
| МестоХраненияМатериалов.Регистратор = &ВыбРегистратор
|УПОРЯДОЧИТЬ ПО
| МестоХраненияМатериалов.НомерСтроки»;Запрос.УстановитьПараметр(«ВыбРегистратор»,ПоступлениеСсылка);
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(«по » + ВыборкаДетальныеЗаписи.Организация + «, » +ВыборкаДетальныеЗаписи.МестоХранения + «, » +
ВыборкаДетальныеЗаписи.Материалы + » <» + ВыборкаДетальныеЗаписи.Количество + «>»);
КонецЦикла;
КонецПроцедуры
Получение остатков по регистру накопления в 1С 8.3:
&НаСервере
Процедура ПолучениеОстатковПоРегиструНакопленияНаСервере()// За получение остатков по регистру накопления в разрезе аналитики отвечает виртуальная таблица Остатки,
// У неё есть следующие параметры:
// 1. Период, на который считаем остатки, исключая саму дату. Если нужны остатки на дату включительно — используем
// тип Граница.
// 2. Условие (например, Организация = &ВыбОрганизация)
// Получим остатки «Доска обрезная» на складе «Основной» в организации
// ООО «Сделай сам» на 31 марта 2020 года (включительно)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| МестоХраненияМатериаловОстатки.МестоХранения,
| МестоХраненияМатериаловОстатки.Материалы,
| МестоХраненияМатериаловОстатки.Организация,
| МестоХраненияМатериаловОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.МестоХраненияМатериалов.Остатки(
| &ВыбДата,
| МестоХранения = &ВыбМестоХранения И
| Материалы = &ВыбМатериалы
| ) КАК МестоХраненияМатериаловОстатки»;Запрос.УстановитьПараметр(«ВыбДата»,Новый Граница(‘20200331235959’, ВидГраницы.Включая));
Запрос.УстановитьПараметр(«ВыбМестоХранения»,Справочники.МестоХраненияы.НайтиПоНаименованию(«Основной»));
Запрос.УстановитьПараметр(«ВыбМатериалы»,Справочники.Материалы.НайтиПоНаименованию(«Доска обрезная»));
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(«Остатки » + » » + ВыборкаДетальныеЗаписи.Материалы + » на складе » + ВыборкаДетальныеЗаписи.МестоХранения
+ » на дату 31.03.2020 (включительно) составляют » + ВыборкаДетальныеЗаписи.КоличествоОстаток + » шт.»);
КонецЦикла;
КонецПроцедуры
Получение оборотов по регистру накопления в 1С 8.3:
&НаСервере
Процедура ПолучениеОборотовПоРегиструНапопленияНаСервере()// За получение оборотов по регистру накопления за произвольный период с заданной периодичностью
// в различных разрезах аналитики отвечает виртуальная таблица Обороты,
// У неё есть следующие параметры:
// 1. Начало периода (включая)
// 2. Конец периода (включая)
// 3. Периодичность (например, Период, Запись, Год, Месяц…)
// 4. Условие (например, Организация = &ВыбОрганизация)
// Пример №1 Посчитаем сколько и каких материалов было заказано за 1 квартал 2020 года в организации ООО «Сделай сам».
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ЗаказыКонтрагентовОбороты.Материалы,
| ЗаказыКонтрагентовОбороты.Организация,
| ЗаказыКонтрагентовОбороты.КоличествоОборот
|ИЗ
| РегистрНакопления.ЗаказыКонтрагентов.Обороты(
| ДАТАВРЕМЯ(2020, 01, 01, 00, 00, 00),
| ДАТАВРЕМЯ(2020, 03, 31, 23, 59, 59), Период,
| Организация = &ВыбОрганизация) КАК ЗаказыКонтрагентовОбороты
|УПОРЯДОЧИТЬ ПО
| ЗаказыКонтрагентовОбороты.Материалы»;Запрос.УстановитьПараметр(«ВыбОрганизация»,Справочники.Организации.НайтиПоНаименованию(«ООО «»Сделай сам»»»));
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(«За 1 кв. 2020 года заказали » + ВыборкаДетальныеЗаписи.КоличествоОборот + » шт. » + ВыборкаДетальныеЗаписи.Материалы);
КонецЦикла;// Пример №2 Посчитаем сколько доски обрезной было заказано за каждый месяц в 1 квартале 2020 года в организации «Сделай сам».
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ЗаказыКонтрагентовОбороты.Период,
| ЗаказыКонтрагентовОбороты.Материалы,
| ЗаказыКонтрагентовОбороты.Организация,
| ЗаказыКонтрагентовОбороты.КоличествоОборот
|ИЗ
| РегистрНакопления.ЗаказыКонтрагентов.Обороты(
| &НачалоПериода,&КонецПериода,Месяц,
| Организация = &ВыбОрганизация И
| Материалы = &ВыбМатериалы) КАК ЗаказыКонтрагентовОбороты
|УПОРЯДОЧИТЬ ПО
| ЗаказыКонтрагентовОбороты.Период»;Запрос.УстановитьПараметр(«НачалоПериода», ‘20200101000000’);
Запрос.УстановитьПараметр(«КонецПериода», ‘20200331235959’);
Запрос.УстановитьПараметр(«ВыбОрганизация»,Справочники.Организации.НайтиПоНаименованию(«ООО «»Сделай сам»»»));
Запрос.УстановитьПараметр(«ВыбМатериалы»,Справочники.Материалы.НайтиПоНаименованию(«Доска обрезная»));
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(«За » + Формат(ВыборкаДетальныеЗаписи.Период, «ДФ=ММММ») + » заказали » +
ВыборкаДетальныеЗаписи.КоличествоОборот + » шт. » + ВыборкаДетальныеЗаписи.Материалы);
КонецЦикла;
КонецПроцедуры
Получение одновременно остатков и оборотов по регистру накопления в 1С 8.3:
&НаСервере
Процедура ПолучениеОдновременноОстатковИОборотовПоРегиструНакопленияНаСервере()// За получение остатков и оборотов за произвольный период с заданной периодичностью
// в разрезе аналитики отвечает виртуальная таблица ОстаткиИОбороты, У неё есть параметры:
// 1. Начало периода (включая)
// 2. Конец периода (включая)
// 3. Периодичность (например, Период, Год, Месяц…)
// 4. Метод дополнения периодов (Движение или ДвиженияИГраницыПериода)
// 5. Условие (например, Организация = &ВыбОрганизация)
// Получим начальный остаток, приход, расход и конечный остаток Доски обрезной на всех складах
// за каждый месяц 2020 года для организации ООО «Сделай сам».
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| МестоХраненияМатериаловОстаткиИОбороты.Период,
| МестоХраненияМатериаловОстаткиИОбороты.Материалы,
| МестоХраненияМатериаловОстаткиИОбороты.Организация,
| МестоХраненияМатериаловОстаткиИОбороты.КоличествоНачальныйОстаток,
| МестоХраненияМатериаловОстаткиИОбороты.КоличествоОборот,
| МестоХраненияМатериаловОстаткиИОбороты.КоличествоПриход,
| МестоХраненияМатериаловОстаткиИОбороты.КоличествоРасход,
| МестоХраненияМатериаловОстаткиИОбороты.КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.МестоХраненияМатериалов.ОстаткиИОбороты(
| ДАТАВРЕМЯ(2020, 01, 01, 00, 00, 00),
| ДАТАВРЕМЯ(2020, 12, 31, 23, 59, 59),
| Месяц, ДвиженияИГраницыПериода, Организация = &ВыбОрганизация И
| Материалы = &ВыбМатериалы) КАК МестоХраненияМатериаловОстаткиИОбороты
|УПОРЯДОЧИТЬ ПО
| МестоХраненияМатериаловОстаткиИОбороты.Период»;Запрос.УстановитьПараметр(«ВыбОрганизация»,Справочники.Организации.НайтиПоНаименованию(«ООО «»Сделай сам»»»));
Запрос.УстановитьПараметр(«ВыбМатериалы»,Справочники.Материалы.НайтиПоНаименованию(«Доска обрезная»));
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() ЦиклСообщить(Формат(ВыборкаДетальныеЗаписи.Период, «ДФ=ММММ») + » » + ВыборкаДетальныеЗаписи.Материалы + » » + «нач. остаток » +
ВыборкаДетальныеЗаписи.КоличествоНачальныйОстаток + » приход » + ВыборкаДетальныеЗаписи.КоличествоПриход + «, расход » +
ВыборкаДетальныеЗаписи.КоличествоРасход + » кон. остаток » + ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток);
КонецЦикла;
КонецПроцедуры
Поиск и программное изменение записи в регистр накопления документа (регистратора) в 1С 8.3:
&НаСервере
Процедура ПоискИПрограммноеИзменениеЗаписиВРегистрНакопленияДокументаНаСервере()// Предположим у нас есть ссылка на проведенный документ Поступление на склад № МРБ-000123
ПоступлениеСсылка = Документы.ПоступлениеНаСклад.НайтиПоНомеру(«МРБ-000123», ‘20201231’);// Мы знаем, что этот документ делает следующие записи в регистр накопления «МестоХраненияМатериалов»:
// Приход [Организация, МестоХранения, Материалы] [Количество]
// Наша задача: найти эти записи и изменить их (например, утроим количество поступившего товара)
// и записать вместо старых.
// Используем объектную технику получения записей, потому что мы будем их изменять.
Поступление = ПоступлениеСсылка.ПолучитьОбъект();// Получим набор записей этого документа в регистр «МестоХраненияМатериалов».
НаборЗаписей = Поступление.Движения.МестоХраненияМатериалов;// Прочитаем записи из базы данных.
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл// Выведем старые значения.
Сообщить(Запись.Организация + «, » +Запись.МестоХранения + «, » + Запись.Материалы + » = » + Запись.Количество + «]»);// Утроим количество.
Запись.Количество = 3 * Запись.Количество;
КонецЦикла;
// Добавим новую запись в регистр накопления МестоХраненияМатериалов.
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Организация = Справочники.Организации.НайтиПоНаименованию(«ООО «»Сделай сам»»»);
НоваяЗапись.МестоХранения = Справочники.МестоХраненияы.НайтиПоНаименованию(«Основной»);
НоваяЗапись.Материалы = Справочники.Материалы.НайтиПоНаименованию(«Доска обрезная»);
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Количество = 3000;НаборЗаписей.Записать(Истина); // удалим старые записи и запишем вместо них новые
// Теперь записи регистра МестоХраненияМатериалов по документу № МРБ-000123, отличаются от тех,
// что были записаны документом при проведении. Чтобы вернуть их к начальному виду — нужно перепровести документ.
КонецПроцедуры
Создание записи регистра накопления без привязки к документу в 1С 8.3:
&НаСервере
Процедура СозданиеЗаписиРегистраНакопленияБезПривязкиКДокументуНаСервере()// ВыборкаДетальныеЗаписи регистра накопления обязательно должны быть привязаны к документу,
// в нашем случае этим документом будет документ «БухСправка»,
Операция = Документы.БухСправка.СоздатьДокумент();
Операция.Дата = ТекущаяДата();
Операция.Организация = Справочники.Организации.НайтиПоКоду(«0000001»);// ООО «Сделай сам» — она у нас одна в справочнике
Операция.СуммаОперации = 5000;
Операция.Содержание = «Ручная операция по регистру накопления Движение денежных средств»;
Операция.Записать(РежимЗаписиДокумента.Запись);// Получаем его набор записей для регистра ДвижениеДенежныхСредств
НаборЗаписей = Операция.Движения.ДвижениеДенежныхСредств;
Запись = НаборЗаписей.Добавить();
Запись.Период = Операция.Дата;
Запись.Организация = Операция.Организация;
// и т.д. заполняем все нужные поля регистра
Запись.Сумма = 5000;
НаборЗаписей.Записать(Истина);
КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Регистры накопления:
Copyright©, «Программист 1С в г.Минске», 16.03.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
| 22 января 2017 | Программируем в 1С |
В этой статье я хочу рассмотреть такой механизм 1С:Предприятия 8, как регистры накопления. Этот механизм позволяет нам накапливать числовые показатели о деятельности фирмы, причем эти показатели он обрабатывает, рассчитывает итоги и позволяет нам получать остатки и обороты по этим показателям. В качестве примера приведу регистр накопления ТоварыНаСкладах из конфигурации «Управление торговлей”
Этот регистр используется для хранения остатков товаров на складах компании в разрезе номенклатуры, характеристики номенклатуры, серии и качества товара. Т.е. в любой момент мы можем посмотреть, сколько на конкретном складе, например «Центральный склад” у нас хранится номенклатуры «Ботинки мужские”, с характеристикой «43 размер”, серией от «20.08.2011” и качеством «новый”.
А чтобы это было возможным, в регистр нужно записывать данные. Платформа 1С:Предприятие так устроена, что записывать данные в регистр, можно только с привязкой к документам. Т.е. если в регистре что-то меняется (приход товара, или его продажа) должен быть обязательно указан документ, который это сделал. Обычно данные в регистр записываются, когда документ проводится. В модуле документа, есть предопределенная процедура ОбработкаПроведения, в которой разработчик и описывает алгоритм, по которому формуруются записи в регистрах накопления.Давайте рассмотрим процесс создания регистра с самого начала. Как вы помните, мы создавали конфигурацию, в которой у нас уже есть справочники и документы. Сейчас мы добавим к ней регистр накопления. Добавляем регистр накопления, название «ТоварыНаСкладах”, вид регистра «Остатки”. Вид регистра «Обороты” мы рассмотрим позже. На закладке данные добавляем измерение «Номенклатура” типа «Справочник.Номенклатура” и добавляем ресурс «Количество” типа число(15,3).
Теперь, нужно обеспечить формирование записей регистра при проведении документа. Но из документов у нас только «ПриходныйКассовыйОрдер” и «РасходнаяНакладная”. Документа, который делал бы приходные движения в наш регистр у нас нет. Давайте создадим его. Создаем документ, название «Оприходование товаров”, на закладке данные добавляем табличную часть «Товары”, в ней реквизиты «Номенклатура” и «Количество”.
Чтобы наш документ делал движения по регистру накопления «ТоварыНаСкладах” на закладке Движения отметим его (регистр) галочкой и нажмем кнопку «Конструктор движений”. Этот конструктор помогает нам написать алгоритм формирования записей регистров, который находится в уже упомянутой процедуре «ОбработкаПроведения”.В конструкторе вид движения регистра оставляем «Приход”, в поле Табличная часть выбираем «Товары”,нажимаем кнопку «Заполнить выражения” и затем кнопку ОК.
Откроется модуль документа, в котором уже создана процедура ОбработкаПроведения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ТоварыНаСкладах Приход Движения.ТоварыНаСкладах.Записывать = Истина; Движения.ТоварыНаСкладах.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Количество = ТекСтрокаТовары.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры |
Теперь давайте запустим режим Предприятие и создадим несколько документов. У документов в верхней панели появилось подменю «Перейти”, по которому можно посмотреть созданные документов движения в регистрах.
Чтобы посмотреть какие же товары есть у нас на складе мы сделаем отчет, который будет показывать остатки по регистру «ТоварыНаСкладах”.
Переходим в режим Конфигуратор и создаем отчет. Название устанавливаем «ОстаткиТоваров”. На закладе формы создаем новую форму отчета, и назначаем ее основной. Добавляем на форму ПолеТабличногоДокумента, это можно через меню «Форма-Вставить элемент управления” и выбрать вид элемента — поле табличного документа, назначить ему имя ТабДок и расположить на всю форму.
Затем переходим в обработчик кнопки «Сформировать”, удаляем находящийся там комментарий, устанавливаем курсор в тексте процедуры обработчика события, щелкаем правой кнопкой мыши и выбираем «Конструктор запроса с обработкой результата”. Это позволит нам создать запрос и сразу вывести его результат в отчет.
На закладке Обработка результата выбираем «Вывод в табличный документ”, переходим на закладку «Таблицы и поля”. Видим, что таблица ТоварыНаСкладах представление в виде четырех таблиц.
Первая таблица — это список записей, которые мы формировали в обработке проведения документов, остальные это виртуальные таблицы, которые платформа создает сама. Эти таблицы позволяют нам получить обработанные данные по регистру — обороты за период, остатки на дату, или остатки и обороты в одной таблице. Мы хотим вывести остатки, поэтому выбираем таблицу Остатки. Из этой таблицы выбираем все поля Номенклатура и КоличествоОстаток. Нажимаем кнопку ОК.
Конструктор сформировал алгоритм, который выведет нам отчет по остаткам, нам лишь нужно указать куда вывести отчет.
Добавим строку:
«ТабДок = ЭлементыФормы.ТабДок;” перед текстом, сформированным конструктором.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
ТабДок = ЭлементыФормы.ТабДок; //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Макет = Отчеты.ОстаткиТоваров.ПолучитьМакет(«Макет»); Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура, | ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Номенклатура), | ТоварыНаСкладахОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки»; Результат = Запрос.Выполнить(); ОбластьЗаголовок = Макет.ПолучитьОбласть(«Заголовок»); ОбластьПодвал = Макет.ПолучитьОбласть(«Подвал»); ОбластьШапкаТаблицы = Макет.ПолучитьОбласть(«ШапкаТаблицы»); ОбластьПодвалТаблицы = Макет.ПолучитьОбласть(«ПодвалТаблицы»); ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть(«Детали»); ТабДок.Очистить(); ТабДок.Вывести(ОбластьЗаголовок); ТабДок.Вывести(ОбластьШапкаТаблицы); ТабДок.НачатьАвтогруппировкуСтрок(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи); ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень()); КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); ТабДок.Вывести(ОбластьПодвалТаблицы); ТабДок.Вывести(ОбластьПодвал); //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА |
Запустим режим 1С:Предприятие и посмотрим работу отчета.
Как видим, что-то более-менее приемлемое конструктор нам создал.
Еще у нас есть «Реализация товаров”, которая должна уменьшать наши остатки. Давайте сделаем так, чтобы она тоже формировала движения по регистру.
Открываем документ, на закладке Движения устанавливаем «галочку” напротив нашего регистра, и нажимаем кнопку «Конструктор движений”.Тип движение регистра ставим расход, выбираем табличную часть «Товары”, нажимаем «Заполнить выражения” и «ОК”. Конструктор сформировал алгоритм проведения документа, давайте его проверим. Для этого вновь запустим режим 1С:Предприятие и перепроведем созданные документы «РеализацияТоваров”.
Затем снова сформируем отчет по остаткам.
Как видите, остатки уменьшились, даже по некоторым позициям ушли в минус. Это происходит потому, что мы не контролируем наличие остатков при реализации товаров.
Наш регистр «ТоварыНаСкладах” типичный пример регистра остатков, у него есть движения как приходные, так и расходные. Но в системе 1С еще есть регистры оборотов.
В качестве примера, приведу регистр «Продажи”. Каждый раз при продаже товара клиенту, мы записываем кто, чего и сколько у нас купил. А затем в отчете мы можем посмотреть, а сколько товара у нас купил тот-то. В этот регистр не будут записываться движения отдельно приход или расход. Движения будут равнозначные. В этих случаях и используется регистр оборотов.Давайте и в нашей конфигурации создадим такой регистр. Добавим новый регистр накопление, название «Продажи”, тип регистра «Обороты”, на закладке данные добавим измерение «Клиент” и «Номенклатура”, ресурсы «Количество” и «Сумма”.
Вернемся к документу «РеализацияТоваров”, на закладе движения установим «галочку” напротив регистра «Продажи”, и нажмем кнопку «Конструктор движений”. Нажмем кнопку (+) (добавить) и выберем регистр «Продажи”, дальше как обычно выбираем табличную часть и нажимаем «Заполнить выражения”. «ОК”.
// регистр Продажи Движения.Продажи.Записывать = Истина; Движения.Продажи.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Клиент = Клиент; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Количество = ТекСтрокаТовары.Количество; Движение.Сумма = ТекСтрокаТовары.Сумма; КонецЦикла; |
Запускаем 1С в режим Предприятие, перепроводим документы «РеализацияТоваров”, проверяем сформированы ли движения. Отчет вы можете сформировать сами, делается это все по такому же принципу как и прошлый отчет, таблицу нужно выбирать «Продажи.Обороты”.А теперь давайте в нашу конфигурацию добавим интерфейс, чтобы не приходлось документы открывать через меню «Операции”. Открываем в конфигураторе ветку «Общие”, ищем в ней Интерфейсы и добавляем новый. Откроется конструктор интерфейсов, в нем нажимаем кнопку «Построить”. Все. Упрощенный интерфейс готов. Чтобы он открывался по умолчанию нужно в свойствах конфигурации (правой кнопкой по самому верхнему элементу дерева конфигурации — Свойства) установить в качестве основного интерфейса, созданный нами интерфейс.
Получиться такой вид:
Вот и все, что хотел рассказать сегодня о регистрах накопления. Если будут вопросы пишите, буду рад помочь.
Если Вы хотите больше узнать о программировании в 1С, тогда регистрируйтесь на курс: 1С 8.3 Старт >>>