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


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

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

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

Небольшое исследование, проведенное на эту тему, показало, что при использовании текущего (на момент написания статьи) релиза платформы 1С:Предприятия 8.1.15.41 время записи наборов линейно зависит от количества записей в наборе, то есть время записи 6 порций по 3 000 проводок и одной в 18 000 проводок одинаково. Однако также мы имели сведения, что запись несколькими порциями в ряде случаев может быть эффективнее, и в ходе работ, описанных в данной статье ниже, получили теоретическое объяснение – почему так может быть.

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

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

Мы инициировали обсуждение данной проблемы в партнерской конференции 1С http://partners.v8.1c.ru/forum/thread.jsp?id=856332 (требует регистрации).

Коллеги успокоили, подтвердив, что принципиальных ограничений в данном случае нет, и проблема должна иметь решение. В качестве примера приводились данные о реальных документах, делающих по 250 000 проводок.

Одной из интересных идей (Доронин Сергей, ВДГБ-Софт, Йошкар-Ола http://www.vdgb-soft.ru/) было отменять проведение документа вне транзакции:

Решение было найдено специалистом фирмы-заказчика, который отменил проведение проблемного документа, переведя базу в монопольный режим (фрагмент кода из Синтакс-помощника):

По данному факту мы получили разъяснения из 1С (там же в конференции):

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

Полученный ответ позволил не только обосновать экспериментально найденный способ решения проблемы, но прояснил и еще два момента:

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

Уже после того, как проблема была решена, были получены сведения об альтернативном способе решения проблемы (Пиголкин Станислав, Акселот, Москва http://www.axelot.ru/). Для этой цели рекомендовано отключать использование итогов:

Про метод УстановитьИспользованиеИтогов(<Признак>) в Синтакс-помощнике сказано:

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

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

  • запись несколькими порциями;
  • запись вне транзакции;
  • перевод базы в монопольный режим;
  • установка управляемой исключительной блокировки на весь регистр;
  • отключение использования итогов

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

ГК Трейд Софт, Москва

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

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

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

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

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

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

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

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

Измерения

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

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

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

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

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

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

Ресурсы

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

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

Реквизиты

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

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

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

Агрегаты

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

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

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

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

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

Регистр накопления 1С это структурированный набор данных, в котором находится информация о всех движения (приход / расход или обороты) выбранных документов.

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

В 1С бывает только два вида регистра накопления:

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

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

Измерения, Ресурсы, Реквизиты и Стандартные реквизиты

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

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

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

Реквизиты в основном нужны для хранения сопутствующей информации и редко используются.

Стандартные реквизиты бывают следующими:

  • период - дата, когда выполнилось движение по регистру
  • регистратор - документ, при помощи которого была выполнена запись в регистре
  • вид движения - приход или расход (приход увеличивает количество ресурсов, а расход уменьшает)

Регистраторы

Регистраторы это документы, которые могут делать движения в регистре накопления. Движения в регистр накопления 1С можно делать только по средство документов (регистраторов). Большинство алгоритмов, создания движения в регистре накопления, формируются при проведении документа в модуле объекта, процедура «ОбработкаПроведения».


Индексация измерений

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

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

Уникальность записей

1С Предприятие контролирует уникальность записей в регистре накопления, и по этому, вы не встретите двух одинаковых записей.

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

  • выборка записей за определенный период по заданным измерениям
  • выборка записей по регистратору
  • получение остатков и оборотов на выбранную дату с заданными измерениями
  • вычисление итогов на указанную дату

Примеры работы с регистром накопления

Пример получения остатков на текущую дату

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

КонецЦикла;
КонецПроцедуры

Пример получения оборотов за текущий год

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

НовЗапрос.УстановитьПараметр(«НачПериода», НачалоГода(ТекущаяДата()));
НовЗапрос.УстановитьПараметр(«КонПериода», ТекущаяДата());

ВыборкаЗапроса = НовЗапрос.Выполнить().Выбрать();

Пока ВыборкаЗапроса.Следующий() Цикл
КонецЦикла;

Пример как выбрать движения в регистре накопления

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

ВыборкаЗапроса = НовЗапрос.Выполнить().Выбрать();

Пока ВыборкаЗапроса.Следующий() Цикл
КонецЦикла;

Формы списка регистра накопления

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

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

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

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

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

Итак, нам нужно хранить следующие данные:

  • Номенклатурная позиция
  • Ответственный сотрудник, на котором числится данная позиция
  • Количество номенклатуры
  • Стоимость номенклатуры
  • Данные о мастере, которому переданы материалы для использования.

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

Ресурсы регистра – это всегда числовые значения, характеризующие хранимые данные. Числовые значения – это количество и сумма, и именно они будут ресурсами нашего регистра.

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

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

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

Обсудив теоретическую часть вопроса, перейдем к практике. Создадим новый регистр накопления , назовем его ОстаткиМатериалов , параметр Вид регистра оставим в значении Остатки , рис. 6.12 .


Рис. 6.12.

Включим регистр накопления в состав подсистемы ОперативныйУчетМатериалов .

На вкладке Данные создадим следующие измерения, ресурсы и реквизиты:

Измерения :

Имя : Номенклатура, Тип: СправочникСсылка.Номенклатура, Запрет незаполненных значений – установлено.

Имя : ОтветственныйСотрудник, Тип: СправочникСсылка.Сотрудники, Запрет незаполненных значений – установлено.

Ресурсы

Имя : Количество, Тип: число, длина 10, точность 3

Имя : Сумма, Тип: число, длина 10, точность 2

Реквизиты :

Имя : ПолучательМатериалов, Тип: СправочникСсылка.Сотрудники

Обратите внимание на имена этих реквизитов, на их типы, а так же – на стандартные реквизиты регистра ( рис. 6.13 .) – эти данные пригодятся нам при работе над процедурой проведения документа .

Исключим из состава реквизитов регистра общий реквизит Организация . Сейчас в нем нет необходимости. Для организации хранения данных в регистре в разрезе различных организаций нам понадобилось бы новое измерение – Организация, благодаря наличию которого мы смогли бы работать с материалами различных организаций.

Перейдем на вкладку Регистраторы окна редактирования объекта и выберем в качестве документов-регистраторов документы – ПоступлениеМатериалов и ОтпускМатериаловМастеру .

На данном этапе настройка регистра накопления окончена, перейдем к настройкам документов. Начнем с документа ПоступлениеМатериалов .

Откроем окно редактирования объекта для этого документа, перейдем на вкладку Движения ( рис. 6.14 .) и нажмем на кнопку


Рис. 6.14.

В конструкторе, выберем тип движения регистра – Приход , в поле Табличная часть укажем табличную часть документа Материалы , нажмем на кнопку Заполнить выражения . Автоматический механизм установления соответствия между данными документа и регистра не всегда работает правильно (в том случае, если не может однозначно определить соответствия, или тогда, когда соответствие, определенное им по его логике, отличается от желаемого), поэтому проверим правильность установленных соответствий. В итоге окно Конструктора движения регистра должно выглядеть так, как показано на рис. 6.15 .


Рис. 6.15.

После нажатия на кнопку ОК, в модуле объекта документа будет сформирована такая процедура обработки проведения (так она выглядит после удаления комментариев о том, что код построен конструктором движений):

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

Эта процедура объявлена в модуле объекта, она исполняется на

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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