Каталог решений - Заполняем или изменяем регистр без перепроведения документа

Заполняем или изменяем регистр без перепроведения документа

Заполняем или изменяем регистр без перепроведения документа

В наличии

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

Категория:

Описание

Задача:

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

Решение:

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

Подготовка:

1. Создадим новый регистр накопления «ПродажиУслуг» (измерение – Номенклатура, ресурс – Сумма).

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

3. Всё, на этом подготовка конфигурации выполнена, можно приступать к созданию обработки.

Обработка:

1. Создаем внешнюю обработку «ЗаполнениеРегистраПродажиУслуг».

2. Создаем форму и в ней новую команду – «ЗаполнитьРегистр»,

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

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

5. Создаем наборы записей для регистра накопления «ПродажиУслуг» с отбором по регистратору.
Данный отбор позволяет связать набор записей регистра накопления и выбранный документ.

6. Добавляем в набор записей необходимые данные из табличной части «Услуги».

7. Записываем набор записей регистра накопления «ПродажиУслуг».
В итоге должен получится примерно такой код:

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

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

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

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

Примечание:

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

has been added to your cart:
Оформление заказа