Регистры сведений в 1С

Очистка регистра сведений 1С 8.3

Регистр сведений — это база данных конфигурации 1С, существующая в форме записей показателей измерений (разрезы) и соответствующих им ресурсов. Таким образом, сохраняются кросс-курсы национальных валют в разрезе валют, цены в разрезе номенклатуры цен. Функции регистратора выполняют документы, формирующие записи в регистре.

На рисунке образец: Начало «Регистр сведений», затем переход на «Курсы валют».

Список регистров сведений доступен в развернутом пункте «Регистры сведений» Конфигуратора.

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

Программная очистка регистра сведений

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

Нулевой набор записей отображается в начальной строчке кода (информация из регистра не прочитана, поэтому набор записей пустой), в следующей строке — начинается его запись, вместо существующего. Итог — пустой регистр.

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

Обработка очистка регистра сведений в 1С 8.3

Разработан универсальный способ очистки регистра — обработка. Применяется для любого регистра сведений. Файл «Очистка регистра сведений 1С.epf» запускается в управляемых формах и в обычных. Для активации очистки нужно в режиме пользователя найти файл через пункт меню «Файл» — «Открыть».

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

Выполнение операции занимает некоторое время. Таким методом очищается каждый регистр сведений оболочки.

Обработка – свертка независимого периодического регистра сведений

Существует альтернативный метод очистки регистра сведений. Он подходит для конфигурации 8.2 и 8.3, и работает как обычное приложение — «СверткаНезависимогоПериодическогоРегистраСведений.epf».

Запуск обработки производится в конфигурации управляемое приложение. Активируется режим «Толстый клиент (обычное приложение)» в программе 1С 8.3, путем изменения режима запуска в Конфигураторе (меню «Сервис» — «Параметры»).

Выбрав из предложенных вариантов «Толстый клиент (обычное приложение)», подтвердите действие нажатием кнопки «Ок».

Затем выбираем вкладку «Сервис» — «1С:Предприятие».

В итоге программа открылась как обычное приложение. Такая функция часто использовалась в более ранних версиях 1С. Изучаем вкладку «Открыть» и находим текущую обработку. Настроить ее очень просто — выбирайте дату и регистры для очистки. Затем подтверждаем запуск процесса очистки кнопкой «Выполнить».

Очистка регистров будет завершена. Напоминаем о необходимости создавать резервную копию базы данных, так как процесс очистки регистров необратим.

Остались вопросы? Закажите бесплатную консультацию наших специалистов!

Планы обмена и их использование

Для того чтобы существовала возможность обмена какими-либо данными с кем-либо, необходимо некоторым образом идентифицировать тех, с кем мы будем обмениваться, и для каждого из них описать перечень обмена
Обе эти задачи позволяет решать прикладной объект конфигурации План обмена.
При помощи планов обмена мы получаем информацию о том, какие элементы данных были изменены и в какой узел обмена их необходимо передать. Это возможно благодаря тому, что планы обмена содержат механизм регистрации изменений. Информация об измененных данных переносится с помощью сообщений, инфраструктура которых также поддерживается планами обмена.
Подобно тому, как элементами данных справочника являются элементы справочника, элементами данных плана обмена являются узлы плана обмена. Каждый узел идентифицирует участника обмена по данному плану обмена. Кроме этого в каждом плане обмена всегда существует один предопределенный узел, идентифицирующий данную информационную базу.
В состав данных, которыми может производиться обмен, входят элементы информационных структур базы данных, которые описываются следующими объектами встроенного языка:
Константа.МенеджерЗначения.<имя>;
СправочникОбъект.<имя>;
ДокументОбъект.<имя>;
ПоследовательностьНаборЗаписей.<имя>;
ПланВидовХарактеристикОбъект.<имя>;
ПланСчетовОбъект.<имя>;
ПланВидовРасчетаОбъект.<имя>;
РегистрСведенийНаборЗаписей.<имя>;
РегистрНакопленияНаборЗаписей.<имя>;
РегистрБухгалтерииНаборЗаписей.<имя>;
РегистрРасчетаНаборЗаписей.<имя>;
ПерерасчетНаборЗаписей.<имя>;
БизнесПроцессОбъект.<имя>;
ЗадачаОбъект.<имя>;
УдалениеОбъекта.
При описании состава данных плана обмена разработчик имеет возможность указать для каждого типа объектов признак Авторегистрация. Он определяет, каким образом план обмена будет отслеживать изменения этих данных.

Создание плана обмена Филиалы
Состав данных обмена должен выглядеть следующим образом:
Теперь с помощью конструктора создадим основную форму узла, чтобы описать в ней некоторые действия, которые должны выполняться при создании нового узла обмена.
Суть этих действий будет заключаться в том, что при создании нового узла обмена мы должны будем сформировать для него все необходимые записи регистрации изменений для всех объектов конфигурации, входящих в данный план обмена. Это будет своего рода начальная синхронизация узла обмена всеми данными обмена.
Прежде всего, опишем в модуле формы узла служебную переменную, которая будет хранить признак того, является ли записываемый узел новым или нет.
Перем РегистрацияВНовыйУзел;
Затем создадим обработчик события формы ПередЗаписью.
Код 1C v 8.х Процедура ПередЗаписью(Отказ)
РегистрацияВНовыйУзел = ЭтоНовый();
КонецПроцедуры
Этот обработчик и будет устанавливать значение нашей служебной переменной в Истина в случае записи нового узла плана обмена.
После этого создадим обработчик события формы ПриЗаписи.
Код 1C v 8.х Процедура ПриЗаписи(Отказ)
Если РегистрацияВНовыйУзел Тогда
// Регистрация изменений всех данных для узла
ПланыОбмена.ЗарегистрироватьИзменения(Ссылка);
КонецЕсли;
КонецПроцедуры
Создание обработки Обмен данными
Откроем конфигуратор и создадим новый объект конфигурации Обработка с именем ОбменДанными. Перейдем на закладку Прочее и откроем модуль объекта.
Создадим в нем процедуру ОбменСФилиалами.
Код 1C v 8.х Процедура ОбменСФилиалами() Экспорт
ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
// Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел)
Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
// Получить сообщение
УзелОбъект.ПрочитатьСообщениеСИзменениями();
// Сформировать сообщение
УзелОбъект.ЗаписатьСообщениеСИзменениями();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Теперь создадим основную форму обработки и в обработчик события нажатия кнопки Выполнить – КнопкаВыполнитьНажатие вставим вызов процедуры ОбменСФилиалами().
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Элемент)
ОбменСФилиалами();
КонецПроцедуры
Создание процедуры записи данных
Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы. Сначала создадим процедуру, которая используется нами при обмене данными, – ЗаписатьСообщениеСИзменениями.
Код 1C v 8.х Процедура ЗаписатьСообщениеСИзменениями() Экспорт
Сообщить(«——— Выгрузка в узел » + Строка(ЭтотОбъект) + » ———«);
Каталог = КаталогВременныхФайлов();
// Сформировать имя временного файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = «\»,»», «\») + «Message»
+ СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + «_» +
СокрЛП(Ссылка.Код) + «.xml»;
// Создать объект записи XML
// *** Запись XML-документов
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
// *** Инфраструктура сообщений
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
Сообщить(«Номер сообщения: » + ЗаписьСообщения.НомерСообщения);
// Получить выборку измененных данных
// *** Механизм регистрации изменений
ВыборкаИзменений =ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель,
ЗаписьСообщения.НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
// Записать данные в сообщение
// *** XML-сериализация
ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());
КонецЦикла;
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Сообщить(«——— Конец выгрузки————«);
КонецПроцедуры
На этом создание процедуры записи данных обмена закончено.
Создание процедуры чтения данных
Код 1C v 8.х Процедура ПрочитатьСообщениеСИзменениями() Экспорт
Каталог = КаталогВременныхФайлов();
// Сформировать имя файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = «\», «», «\») + «Message»
+ СокрЛП(Ссылка.Код) + «_» +
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + «.xml»;
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
// *** Чтение документов XML
// Попытаться открыть файл
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Исключение
Сообщить(«Невозможно открыть файл обмена данными.»);
Возврат;
КонецПопытки;
Сообщить(«——— Загрузка из » + Строка(ЭтотОбъект) + «————«);
Сообщить(» — Считывается файл » + ИмяФайла);
// Загрузить из найденного файла
// *** Инфраструктура сообщений
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
// Читать заголовок сообщения обмена данными — файла XML
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
// Сообщение предназначено не для этого узла
Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
ВызватьИсключение «Неверный узел»;
КонецЕсли;
// Удаляем регистрацию изменений
// для узла отправителя сообщения
// *** Служба регистрации изменений
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
// Читаем данные из сообщения
// *** XML-сериализация
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
// Читаем очередное значение
Данные = ПрочитатьXML(ЧтениеXML);
// Записать полученные данные
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяФайла);
Сообщить(«——— Конец загрузки————«);
КонецПроцедуры
Информация взята с сайта http://helpf.pro

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

Изменение существующей записи

Для работы с одной записью используется объект «МенеджерЗаписи».

Пример:

В данном случае мы создаем менеджер записи и указываем ему поля, необходимые для точной идентификации записи. Затем изменяем одно из поле («Ставка») и записываем изменения.

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

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

Удаление существующей записи

Удаление одной записи из независимого регистра сведений происходит практически так же, как и изменение этой записи:

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

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

Удаление группы записей

Если есть необходимость удалить несколько записей, по какому-либо признаку, из независимого регистра сведений, то для этого удобно использовать объект «НаборЗаписей».

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

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

Пример:

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

1С настойчиво рекомендует использовать метод «Прочитать()» после установки отбора, хотя в большинстве случаев все работает и без него (поправьте, если я ошибаюсь).

Очистка независимого регистра сведений

Очистка независимого регистра сведений заключается в записи набора записей без каких-либо отборов:

1 2 3 зСтавки = РегистрыСведений.СтавкиПоПроектам.СоздатьНаборЗаписей(); зСтавки.Удалить();

На этом все, надеюсь данная статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Обычный вариант программной очистки регистра сведений не подчиненного регистратору производится при помощи записи пустого набора записей, примерно так:

1 2 НаборЗаписей = РегистрыСведений.НашРегистр.СоздатьНаборЗаписей(); НаборЗаписей.Записать();

Но в данном случае очистка регистра подобным способом заняло бы много часов. Поэтому был выбран другой способ — быстрый способ очистки регистра сведений.

Шаг 1. Делаем резервную копию базы. Этот пункт, конечно, не обязателен, но привычка делать резервную копию перед любым потенциально опасным действием обязательно сохранит Вам нервы/время/зарплату/карьеру.

Шаг 2. Копируем требуем регистр сведений.

Копируем регистр

Шаг 3. Удаляем оригинал регистра сведений

Удаляем регистр

Шаг 4. Переименовываем копию в оригинал и применяем изменения.

Переименовываем и применяем изменения

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

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

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Как удалить движения документа программно?

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

При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения

Ну не может типовым способом, заставим не типовым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:

Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
//алгоритм обработки строки результата — начало
ДокОбъект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), «.»);
ВидРегистра = Лев(Строка(Движение), Точка — 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = «РегистрНакопления» Тогда
НаборЗаписей = РегистрыНакопления.СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = «РегистрБухгалтерии» Тогда
НаборЗаписей = РегистрыБухгалтерии.СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = «РегистрСведений» Тогда

НаборЗаписей = РегистрыСведений.СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = «РегистрРасчета» Тогда
НаборЗаписей = РегистрыРасчета.СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ДокОбъект.Проведен = Ложь;
//ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(режимзаписидокумента.запись);
//алгоритм обработки строки результата — конец
КонецЦикла;

Готовая функция для использования в своих обработках или общем модуле:

Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), «.»);
ВидРегистра = Лев(Строка(Движение), Точка — 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = «РегистрНакопления» Тогда
НаборЗаписей = РегистрыНакопления.СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = «РегистрБухгалтерии» Тогда
НаборЗаписей = РегистрыБухгалтерии.СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = «РегистрСведений» Тогда
НаборЗаписей = РегистрыСведений.СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = «РегистрРасчета» Тогда
НаборЗаписей = РегистрыРасчета.СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *