Документы, регистры накопления, скд. Документы, регистры накопления, скд 1с 8 отбор для регистра накопления


Задача любой учетной системы — хранение и оперативное отображение информации для пользователя, т.е. цель проектирования любой системы — оперативно предоставить пользователю отчет. С помощью полученных данных, как правило, принимаются управленческие решения на предприятиях.

Предположим, что у нас есть 1000 разных документов: поступление товаров, списание, возврат, продажа и т.д. И каждый из документов изменяет количество определенного товара на складе. Чтобы получить информацию о текущем количестве на складе, необходимо перебрать все : какие-то увеличивают количество товара, какие-то уменьшают, какие-то могут и увеличивать, и уменьшать. А если необходимо учитывать еще и склад, организацию?.. Такая система очень ресурсоёмкая.

Для упрощения данного процесса разработчики 1С придумали особые объекты конфигурации. Используются они для удобства хранения и получения информации, в 1С 8.3 и 8.2 используются всевозможные регистры, в данной статье речь пойдет именно про Регистры накопления .

Сам регистр накопления представляет собой таблицу с информацией, в которой собраны все движения (поступления/списания или обороты) определенных документов. Рассмотрим, как выглядит таблица движения, на примере типового регистра накопления «Товары на складах» в конфигурации «Управление торговлей 10.3»:

Здесь мы видим, что документы 1C «Реализации» уменьшают количество определенного товара в определенном месте хранения, а документы поступления, наоборот, увеличивают количество. В итоге мы получаем общую картину, в которой отчетливо видно, что, когда и в каком количестве поступило (было списано) по учету. По такой таблице уже гораздо удобнее строить отчет.

Регистр накопления в конфигураторе

Что же такое регистр накопления с точки зрения разработки конфигурации? Начнем, пожалуй, с рассмотрения полей регистра накопления в :

Получите 267 видеоуроков по 1С бесплатно:

У регистра накопления есть Измерения, Ресурсы, Реквизиты и Стандартные реквизиты.

Рассмотрим сначала стандартные реквизиты регистра накопления:

  • период — дата движения, не обязательно должна совпадать с датой документа;
  • регистратор — документ, который производит запись в регистре;
  • номер строки — порядковый номер строки в наборе записи, уникален в пределах регистратора;
  • активность — отвечает за попадание записи в виртуальные таблицы (о них ниже);
  • вид движения — приход или расход.

Измерения регистра накопления

Измерение — это разрез, в котором ведется учёт. На вышеприведенном примере разрезом учета являются: склад, номенклатура, характеристика номенклатуры, серия номенклатуры, качество . Т.е задав интересующие нас измерения, мы можем в любой момент получить количество — ресурс. В разрезе разных измерений в дальнейшем, например, можно получать остатки на определенную дату.

Ресурс регистра накопления

Ресурс — это числовое поле, в котором хранится информация в разрезе измерений, о которых писали выше.

Иначе взаимодействия измерений/ресурсов можно схематично изобразить как систему координат:

Два измерения — абсцисса и ордината системы координат, т.е. на данном примере измерения это склад и номенклатура. На пересечении измерений мы можем получить количество — ресурс. Например, на «основном» складе товара «карандаш» в наличии 1 штука.

Реквизиты регистра накопления 1C

Реквизиты регистры накопления несут в себе роль «комментария» или дополнительной информации, в разрезе измерений нельзя получить остатки/обороты. Используются достаточно редко.

Виды регистра накопления

Существует два вида регистра накопления — обороты и остатки .

Если целью регистра накопления не является получение остатков, обязательно нужно использовать вид регистра накопления — обороты . Типичный пример использования оборотного регистра — регистрация объема продаж. В данном случае нам нужно знать только, какие продажи были за определенный период времени, остатки в данном случае не имеют смысла.

Если же среди целей использования регистра накопления — получение остатков на определенный период, нам необходим регистр с видом остатки . Такой тип позволяет получать как остатки, так и обороты. Для такого регистра система автоматически рассчитывает остатки. Пример «остаточного» регистра — товары на складах, деньги в кассе.

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

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

Для регистра накопления это:

  • Остатки;
  • Обороты;
  • Остатки и обороты.

Для разработчика решения данные берутся из одной (виртуальной) таблицы, но на самом деле платформа 1С берёт из множества таблиц, преобразовывая их в нужных вид.

Правильное проектирование регистров накопления

Регистры накопления необходимо проектировать из необходимых отчетов. Самое трудное в системе 1С 8.3 — правильно хранить информацию, чтобы её в любой момент было легко получить.

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

Индексация измерений регистра накопления

У измерений регистра накопления имеется свойство — «индексировать». Это свойство необходимо устанавливать на измерения в тех случаях, когда по измерению планируется часто накладывать отборы при получении данных и данное измерение может иметь большое количество вариантов значения.

Например, регистр «ТоварыНаСкладах», измерения — «Склад, Номенклатура», ресурс — «Количество».

Правильнее проиндексировать «Номенклатуру», а поле»Склад» индексировать не стоит, потому как количество складов в системе, как правило, не существенное.

Любой специалист по оптимизации знает, что начинать работы по ускорению 1С нужно с самого узкого места системы.

В «1С:Предприятии 8» часто таким «бутылочным горлышком» является запись в регистры :

  • Сама по себе запись в БД – достаточно долгий процесс (относительно чтения)
  • Запись в регистры выполняется при каждом проведении и перепроведении документа
  • Зачастую документы очень объемные (с большим количеством строк)
  • Один документ может порождать движения в десятках регистров
  • При перепроведении документа запись в БД зачастую выполняется 2 раза – старые движения нужно очистить, новые записать.

Оптимизация записи в регистры может существенно ускорить систему, на проектах после оптимизации процесс записи зачастую ускорялся в разы .

В этой статье мы рассмотрим основные причины и способы оптимизации медленной записи в регистры .

Если коротко…

Основные причины медленной записи следующие:

Редко встречается только одна из причин, приведенных в этом списке, обычно приходится сталкиваться сразу с несколькими проблемами в различных комбинациях.

Ошибка проектирования

Иногда в процессе аудита производительности встречаются ситуации, когда у клиента один регистр занимает 70 % или более от всего объема базы. Это приводит к большой нагрузке на регистр и при чтении, и при записи. Все хотят в этот регистр что-то записать и что-то прочитать, ведь там лежит большая часть данных. В результате возникают ожидания на блокировках, что негативно сказывается на производительности и в том числе сильно замедляет любую модификацию данных в регистре.

Необходимо избегать ситуаций, когда у вас большой объем данных хранится в одном объекте. Если такая ситуация обнаружена, конечно, можно сделать свертку, переместить старые данные в отдельную базу и сократить объем регистра, но это даст лишь временный эффект. Правильным решением будет изменить архитектуру решения. Здесь как раз хорошо подходит принцип “разделяй и властвуй”.

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

Есть еще один интересный способ оптимизации записи – это отсутствие записи, тоже в некотором роде проектное решение. Если архитектура вашей учетной системы не нуждается в высокой оперативности данных, тогда запись в такие неоперативные регистры можно производить позже.

Например, система сначала просто записывает документы на диск, но не проводит. Далее одно или несколько фоновых заданий записывают эти данные в нерабочее время. В этом случае никаких ожиданий на блокировках не будет.

Более детально эта тема раскрыта в курсе:

Мы ведем группу ВКонтакте –

Для отражения в программах на базе 1С:Предприятие различных хозяйственных операций пользователи используют документы. Из них можно получить все необходимые данные, например, по остаткам денежных средств на счетах фирмы, количеству проданных товаров за определенный период времени.

В процессе работы таких документов может быть довольно большое количество. Здесь речь может идти не о сотнях документов, а о тысячах и десятках тысяч. Естественно, построение отчетов и прочих данных из такого количества документов является очень долгим, трудоемким и неэффективным.

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

Для решения таких задач в 1С существует специальные объекты конфигурации – регистры накопления. При проведении документы делают в них записи, а уже потом из этих регистров можно быстро получить все нужные данные, включая остатки и обороты. То есть, регистры накопления не просто хранят данные, но и позволяют быстро их обработать.

Как было сказано ранее, регистры накопления могут позволять быстро получать остатки и обороты. На этот функционал непосредственно вид регистра. Его можно изменить на вкладке «Основные» формы редактирования конкретного регистра.

  • Оборотные регистры накопления позволяют получить только обороты за какой-то определенный промежуток времени. Получение остатков в таком случае не представляется возможным. Регистр накопления с видом «Обороты» создает в системе только одну виртуальную таблицу – оборотов.
  • Регистры накопления с видом «Остатки» дают возможность разработчику получить и остатки и обороты. В данном случае будут создаваться уже три виртуальные таблицы: остатков, оборотов, остатков и оборотов. Примером такого регистра может выступать регистр остатков ТМЦ на складах, движения денежных средств по расчетным счетам организации.

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

Данные регистров накопления

Измерения

Под измерениями регистров накопления подразумеваются некие разрезы, в которых в дальнейшем вы сможете получить информацию. В нашем случае в качестве измерений регистра «ВыпускПродукции» являются: организация, заказ, спецификация, подразделение и другие.

В любой момент мы сможем получить остатки, например, по всей организации в целом, по конкретному заказу.

Свойства измерений

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

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

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

Ресурсы

В качестве ресурсов выступают числовые данные, которые и хранят некую информацию. Именно ее в дальнейшем мы будем получать в различных разрезах. Например, в регистре накопления «Выпуск продукции» ресурсом будет выступать только количество. В таком случае мы сможем получить количество выпущенной продукции на какой-то определенный момент времени, например, по определенному подразделению.

Еще один простой пример. Предположим, что все операции по кассе мы проводим по регистру накопления. В качестве ресурсов будет выступать сумма денежных средств, которая либо поступила (приход), либо выдана (расход) из кассы. В качестве измерения может быть, например, контрагент/подотчетное лицо. В итоге мы сможем получить данные по остаткам и оборотам как кассы в целом, так и по отдельным контрагентам.

Реквизиты

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

Стандартные реквизиты

Кроме обычных реквизитов, которые разработчик может добавить самостоятельно, существуют так же и стандартные реквизиты. Удалить и добавить новые в этот список нельзя. Перейти к стандартным реквизитам вы моете по одноименной кнопке на вкладке «Данные».

Агрегаты

Агрегаты доступны только в регистрах накопления с видом «Обороты». Перейти к ним можно с вкладки «Данные». Агрегаты применяются в базах с большим количеством данных для ускорения формирования отчетов. Мы не будем рассматривать этот механизм подробно, так как это достаточно обширная тема.

Движения по регистрам накопления

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

Просмотреть список регистраторов накопления можно на одноименной вкладке формы самого регистра. В данном примере движения по регистру «ВыпускПродукции» могут формироваться при проведении четырех различных документов.

В самих документах, которые являются регистраторами, список регистров, по которым они совершают движения, расположен на вкладке «Движения». Здесь так же доступен конструктор движений, который поможет в создании таких процедур (проведения и отмены проведения). Сопоставление данных документа и регистра производятся на сравнении типов данных.

В этой статье я хочу рассмотреть такой механизм 1С:Предприятия 8, как регистры накопления. Этот механизм позволяет нам накапливать числовые показатели о деятельности фирмы, причем эти показатели он обрабатывает, рассчитывает итоги и позволяет нам получать остатки и обороты по этим показателям. В качестве примера приведу регистр накопления ТоварыНаСкладах из конфигурации “Управление торговлей”

Этот регистр используется для хранения остатков товаров на складах компании в разрезе номенклатуры, характеристики номенклатуры, серии и качества товара. Т.е. в любой момент мы можем посмотреть, сколько на конкретном складе, например “Центральный склад” у нас хранится номенклатуры “Ботинки мужские”, с характеристикой “43 размер”, серией от “20.08.2011” и качеством “новый”.


А чтобы это было возможным, в регистр нужно записывать данные. Платформа 1С:Предприятие так устроена, что записывать данные в регистр, можно только с привязкой к документам. Т.е. если в регистре что-то меняется (приход товара, или его продажа) должен быть обязательно указан документ, который это сделал. Обычно данные в регистр записываются, когда документ проводится. В модуле документа, есть предопределенная процедура ОбработкаПроведения, в которой разработчик и описывает алгоритм, по которому формуруются записи в регистрах накопления.

Давайте рассмотрим процесс создания регистра с самого начала. Как вы помните, мы создавали конфигурацию, в которой у нас уже есть справочники и документы. Сейчас мы добавим к ней регистр накопления. Добавляем регистр накопления, название “ТоварыНаСкладах”, вид регистра “Остатки”. Вид регистра “Обороты” мы рассмотрим позже. На закладке данные добавляем измерение “Номенклатура” типа “Справочник.Номенклатура” и добавляем ресурс “Количество” типа число(15,3).


Теперь, нужно обеспечить формирование записей регистра при проведении документа. Но из документов у нас только “ПриходныйКассовыйОрдер” и “РасходнаяНакладная”. Документа, который делал бы приходные движения в наш регистр у нас нет. Давайте создадим его. Создаем документ, название “Оприходование товаров”, на закладке данные добавляем табличную часть “Товары”, в ней реквизиты “Номенклатура” и “Количество”.


Чтобы наш документ делал движения по регистру накопления “ТоварыНаСкладах” на закладке Движения отметим его (регистр) галочкой и нажмем кнопку “Конструктор движений”. Этот конструктор помогает нам написать алгоритм формирования записей регистров, который находится в уже упомянутой процедуре “ОбработкаПроведения”.

В конструкторе вид движения регистра оставляем “Приход”, в поле Табличная часть выбираем “Товары”,нажимаем кнопку “Заполнить выражения” и затем кнопку ОК.


Откроется модуль документа, в котором уже создана процедура ОбработкаПроведения.
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

// регистр ТоварыНаСкладах Приход
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Очистить();
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;


КонецЦикла;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Теперь давайте запустим режим Предприятие и создадим несколько документов. У документов в верхней панели появилось подменю “Перейти”, по которому можно посмотреть созданные документов движения в регистрах.


Чтобы посмотреть какие же товары есть у нас на складе мы сделаем отчет, который будет показывать остатки по регистру “ТоварыНаСкладах”.
Переходим в режим Конфигуратор и создаем отчет. Название устанавливаем “ОстаткиТоваров”. На закладе формы создаем новую форму отчета, и назначаем ее основной. Добавляем на форму ПолеТабличногоДокумента, это можно через меню “Форма-Вставить элемент управления” и выбрать вид элемента - поле табличного документа, назначить ему имя ТабДок и расположить на всю форму.


Затем переходим в обработчик кнопки “Сформировать”, удаляем находящийся там комментарий, устанавливаем курсор в тексте процедуры обработчика события, щелкаем правой кнопкой мыши и выбираем “Конструктор запроса с обработкой результата”. Это позволит нам создать запрос и сразу вывести его результат в отчет.
На закладке Обработка результата выбираем “Вывод в табличный документ”, переходим на закладку “Таблицы и поля”. Видим, что таблица ТоварыНаСкладах представление в виде четырех таблиц.

Первая таблица - это список записей, которые мы формировали в обработке проведения документов, остальные это виртуальные таблицы, которые платформа создает сама. Эти таблицы позволяют нам получить обработанные данные по регистру - обороты за период, остатки на дату, или остатки и обороты в одной таблице. Мы хотим вывести остатки, поэтому выбираем таблицу Остатки. Из этой таблицы выбираем все поля Номенклатура и КоличествоОстаток. Нажимаем кнопку ОК.
Конструктор сформировал алгоритм, который выведет нам отчет по остаткам, нам лишь нужно указать куда вывести отчет.
Добавим строку:
“ТабДок = ЭлементыФормы.ТабДок;” перед текстом, сформированным конструктором.
ТабДок = ЭлементыФормы.ТабДок;
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Макет = Отчеты.ОстаткиТоваров.ПолучитьМакет("Макет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Номенклатура),
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";

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

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();

ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Запустим режим 1С:Предприятие и посмотрим работу отчета.


Как видим, что-то более-менее приемлемое конструктор нам создал.
Еще у нас есть “Реализация товаров”, которая должна уменьшать наши остатки. Давайте сделаем так, чтобы она тоже формировала движения по регистру.
Открываем документ, на закладке Движения устанавливаем “галочку” напротив нашего регистра, и нажимаем кнопку “Конструктор движений”.

Тип движение регистра ставим расход, выбираем табличную часть “Товары”, нажимаем “Заполнить выражения” и “ОК”. Конструктор сформировал алгоритм проведения документа, давайте его проверим. Для этого вновь запустим режим 1С:Предприятие и перепроведем созданные документы “РеализацияТоваров”.
Затем снова сформируем отчет по остаткам.


Как видите, остатки уменьшились, даже по некоторым позициям ушли в минус. Это происходит потому, что мы не контролируем наличие остатков при реализации товаров.
Наш регистр “ТоварыНаСкладах” типичный пример регистра остатков, у него есть движения как приходные, так и расходные. Но в системе 1С еще есть регистры оборотов.
В качестве примера, приведу регистр “Продажи”. Каждый раз при продаже товара клиенту, мы записываем кто, чего и сколько у нас купил. А затем в отчете мы можем посмотреть, а сколько товара у нас купил тот-то. В этот регистр не будут записываться движения отдельно приход или расход. Движения будут равнозначные. В этих случаях и используется регистр оборотов.

Давайте и в нашей конфигурации создадим такой регистр. Добавим новый регистр накопление, название “Продажи”, тип регистра “Обороты”, на закладке данные добавим измерение “Клиент” и “Номенклатура”, ресурсы “Количество” и “Сумма”.


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

Запускаем 1С в режим Предприятие, перепроводим документы “РеализацияТоваров”, проверяем сформированы ли движения. Отчет вы можете сформировать сами, делается это все по такому же принципу как и прошлый отчет, таблицу нужно выбирать “Продажи.Обороты”.

А теперь давайте в нашу конфигурацию добавим интерфейс, чтобы не приходлось документы открывать через меню “Операции”. Открываем в конфигураторе ветку “Общие”, ищем в ней Интерфейсы и добавляем новый. Откроется конструктор интерфейсов, в нем нажимаем кнопку “Построить”. Все. Упрощенный интерфейс готов. Чтобы он открывался по умолчанию нужно в свойствах конфигурации (правой кнопкой по самому верхнему элементу дерева конфигурации - Свойства) установить в качестве основного интерфейса, созданный нами интерфейс.
Получиться такой вид:

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

Written by: Роман Заболотин
Email: eval(unescape("%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%72%7a%61%62%6f%6c%6f%74%69%6e%40%67%6d%61%69%6c%2e%63%6f%6d%22%3e%72%7a%61%62%6f%6c%6f%74%69%6e%40%67%6d%61%69%6c%2e%63%6f%6d%3c%2f%61%3e%27%29%3b"))







2024 © speleo96.ru.