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

Теоретические предпосылки

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

При закрытии периода переносятся:
1. Остатки по бухгалтерским счетам в разрезе аналитики по субконто.
2. Остатки по регистрам.
3. Значения периодических реквизитов, которые устанавливаются при проведении документов.

Изменения в конфигурацию для закрытия периода

Если вы планируете только перенести остатки по бухгалтерским счетам, достаточно только извлечь из пакета обработку wrap.ert
Иначе откройте в конфигураторе файл 1cv7.md из пакета и скопируйте в вашу конфигурацию через буфер обмена документы
ДвижениеРегистра - для переноса остатков и ФиксацияПериодических для переноса периодических реквизитов. Хотя возможно закрыть остатки по регистрам универсальной обработкой УниверсальноеЗакрытиеПериодаПоРегистрам.ert без вмешательства в конфигурацию.

Состав пакета 1s_close.zip :
1cv7.md
Конфигурация, в которой находятся документы ФиксацияРегистра и ФиксацияПериодических
1s_close.htm
Документация
wrap.ert
Типовая обработка от 1С по свертке бухитогов
УниверсальноеЗакрытиеПериодаПоРегистрам.ert
Закрытие регистров без вмешательства в конфигурацию
НастройкаЗакрытияБазы.mxl
Файл настроек для обработки УниверсальноеЗакрытиеПериодаПоРегистрам.ert
СформироватьДокументыЗакрытияПоРегистрам.ert
Обработка для автоматизации закрытия регистров
СформироватьДокументыЗакрытияПоПериодическим.ert
Обработка для автоматизации переноса периодических
УдалитьВсеДокументыЗаПериод.ert
Обработка для удаления документов за период
Протокол удаления.xls
Экспериментальное исследование скорости удаления

Перенос остатков по счетам.

Для переноса остатков по бухгалтерским счетам лучше всего использовать штатную обработку от 1С wrap.ert. Она формирует на указанную дату несколько операций, которые устанавливают остатки дебета и кредита по указанным счетам в разных планах счетов с различными разделителями учета. Для внесения остатков нужно указать, с какого счета заносить остатки (обычно это счет 00).
Можно перенести также и остатки по забалансовым счетам.

Мною в обработку добавлена галочка "Не удалять проводки,только сформировать остатки". Ее нужно устанавливать, т.к. документы, которые формируют проводки, могут формировать движения по регистрам или устанавливать периодические реквизиты, следовательно их нельзя удалять после формирования остатков по счетам.

Перенос остатков по регистрам фиксацией регистров.

Остатки по регистрам можно перенести только путем проведения специального документа, т.к. движения по регистру делаются только при проведении документа и не могут быть скорректированы извне.
Используется документ ФиксацияРегистра.

Документ можно ввести вручную для нужного регистра, записав его на конец даты закрытия. Для внесения остатков на позицию документа нужно нажать кнопку "Загрузить остатки".

С помощью обработки СформироватьДокументыЗакрытияПоРегистрам можно автоматизировать этот процесс. Она позволяет выбрать регистры, которые нужно перенести и автоматически сформировать документы ФиксацияРегистра. Лучше формировать регистры по нескольку(3-5) за раз, т.к. эти документы имеют большой размер и при формировании сразу 3-5 больших документов программа предъявляет большие запросы к памяти, т.к. окна документов закрываются только после завершения обработки.

Несколько слов о самом документе:

Документ состоит из 20 колонок неопределенного вида. В документ последовательно заносятся значения измерений и ресурсов по каждому итогу регистра. Т.е. если у регистра 5 измерений и 2 ресурса, при этом в наличии 1000 итогов, то в документе будет записано (5+2)*1000 / 20 = 350 строк, и в нем будет храниться 7000 значений.

Документ достаточно большой, но в результате использования 20 колонок требования к памяти, используемой 1С для отображения и манипулирования документом снижаются. Был испробован вариант, когда в документе была только 1 колонка, но 1С явно не справлялась с отображением документов в 40-50 тысяч строк.

Дальнейшее разбиение лишается универсальности, хотя и возможно - нужно делать документ в разрезе отдельных измерений. Для этого нужно производить анализ итогов, чтобы выяснить, какие измерения дадут оптимальные по размерам документы (ведь много маленьких документов это тоже плохо). Но в целом, даже большие регистры переносятся с достаточной скоростью, чтобы говорить о том, что разработка может применяться на практике. Может!

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

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

Например, в типовых конфигурациях имеются документы "ВводОстатковТоваров", "ВводОстатковКредита" и другие. Такие документы понятны пользователю и он может вносить в них изменения. При изменениях в регистрах меняется модуль документа, но нет нужды менять данные документа. В крайнем случае можно вносить начальные остатки документами "ПриходнаяНакладная", "ПриходныйОрдер" и т.п.

Вашему вниманию предлагается универсальная обработка для закрытия периода с помощью имеющихся в конфигурации документов УниверсальноеЗакрытиеПериодаПоРегистрам.ert. Она не требует вмешательства в конфигурацию и не требует внесения изменений в свой код. Достаточно описать настройки в таблице настроек НастройкаЗакрытияБазы.mxl, чтобы правильно закрыть все регистры.

Структура mxl-таблицы настроек очень проста. Каждая строка соответствует регистру. В колонке Регистр указывается название документа, в колонке Документ указывается название вида документа, который будет создан.

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

В поле Фильтр содержится выражение на встроенном языке 1С для отбора остатков из таблицы Итоги. Можно оперировать с текущей строкой таблицы Итоги. Если выражение не указано, фильтр не применяется. Выражение должно возвращать не-ноль, чтобы быть истинным и попадать в результирующий набор итогов. Рекомендуется использовать оператор ? из языка 1С.

Примеры:
- Отобрать только по упр.учету: Итоги.ТипУчета=1 или ПустоеЗначение(Итоги.Фирма)=1
- Отобрать только по складу готовой продукции: Итоги.Склад=ИмяВСпр("Склад готовой продукции","МестаХранения")

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

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

Для добавления/установки атрибутов в таблицу итоги используется функция Установить(Атрибут, Выражение), которая возвращает 1. Если атрибута в таблице нет, он добавляется. Если нужно установить несколько атрибутов, нужно несколько раз вызвать функцию Установить, сложив ее результаты, т.е.: Установить(Атрибут1, Выражение1)+Установить(Атрибут2, Выражение2).

Пример:
- Установить Коэффициент: Установить("Коэффициент",1)
- Установить Количество из ОстаткаТоваров: Установить("Количество",Итоги.ОстаткиТоваров)
- Установить Валюту в Доллары: Установить("Валюта",Доллары)
- Сбросить поле Контрагент, чтобы не разворачивать остатки по контрагенту: Установить("Контрагент",ПолучитьПустоеЗначение())

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

Для запуска обработки нужно сначала открыть файл настроек, выбрать регистры, которые будут закрываться и нажать "Сформировать". Будут сформированы документы закрытия. Они не будут проведены и документы закрытого периода не будут удалены. Все это нужно сделать отдельно.

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

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

Перенос значений периодических реквизитов.

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

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

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

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

С помощью обработки СформироватьДокументыЗакрытияПоПериодическим можно автоматизировать этот процесс. Она позволяет выбрать регистры, которые нужно перенести и автоматически сформировать документы ФиксацияПериодических.
Для очистки ссылок из помеченных на удаление элементов служит кнопка "Удалить пом. на уд. элементы".
После закрытия периода можно периодически производить такие чистки.

Удаление документов закрытого периода.

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

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

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

Естественно, удаление должно запускаться в монопольном режиме и на сервере.

Исследования:
DBF база за год объемом 100 проведенных документов в день (30 тысяч проведенных документов в год)
Сервер - Win2K Workstation Celeron 1700, 256 RAM
показали, что скорость удаления - 80 документов в минуту, или примерно 2 месяца в час, т.е. год удаляется за 6-8 часов.
Однако вам лучше провести предварительное исследование, чтобы узнать, сколько времени будут удаляться документы. В базах крупных супермаркетов удаление может длиться порой до двух суток, тогда лучше произвести закрытие на уик-энд или некоторое время работать без реальных остатков.

В файле Протокол удаления.xls содержатся данные по реальному удалению документов в базе с производственной конфигурацией ИТР (среднего размера), когда точка актуальности была перенесена на началало периода. Исходя из этого графика видно, что скорость линейная, без разницы в скорости в начале и конце месяца и равна примерно 5000 документов в час или 2.5 месяца в час. Эту скорость и можно считать примерной для средних DBF баз. На этой же базе, если точка актуальности не менялась, скорость тоже остается линейной, но составляет уже 2580 документов в час или в два раза медленнее. Выводы очевидны - выигрыш в скорости в 2 раза.

Знающие люди посоветовали еще один способ - сделать выгрузку данных из базы, удалить из нее все документы до указанной даты (там все в текстовом виде) и загрузить обратно. Еще быстрее, еще производительней!

Последовательность действий

Пусть Д - это дата закрытия периода, закрытие периода мы делаем на конец даты Д, возможно за дату Д имеются документы (часто Д - это 31 декабря).

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

Сделайте копию базы - это будет старая база.

Сформируйте операции по переносу остатков по бухгалтерским счетам с помощью wrap.ert, укажите дату Д. Поставьте галочку, запрещающую удаление документов.

Сформируйте документ ДвижениеРегистра по каждому регистру (вручную или обработкой), запишите его на конец даты Д, внесите остатки, не проводите.

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

Установите точку актуальности на дату Д+1 и проведите документы ДвижениеРегистра и ФиксацияПериодических.

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

Пропишите пользователям путь к закрытой базе.

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

Что делать дальше?

Скачайте разработку. Если вам пригодился мой опыт, просьба выслать мне материальное вознаграждение произвольной суммы (20$) на мою карточку или заказным письмом. Координаты можно уточнить по e-mail.

Скачать .