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

2. В документе «Реализация товаров и услуг» добавим в «Движения» созданный регистр накопления.
Нужно, конечно, добавить в процедуру проведения документа запись в данный регистр, но для решения данной задачи это не принципиально.
3. Всё, на этом подготовка конфигурации выполнена, можно приступать к созданию обработки.
Обработка:
1. Создаем внешнюю обработку «ЗаполнениеРегистраПродажиУслуг».
2. Создаем форму и в ней новую команду – «ЗаполнитьРегистр»,
3. Размещаем данную команду в командной панели формы и переходим к описанию процедуры.
Должно получится примерно так:

4. В процедуре находим все проведенные документы «Реализация товаров и услуг» и их табличные части с помощью запроса.
5. Создаем наборы записей для регистра накопления «ПродажиУслуг» с отбором по регистратору.
Данный отбор позволяет связать набор записей регистра накопления и выбранный документ.
6. Добавляем в набор записей необходимые данные из табличной части «Услуги».
7. Записываем набор записей регистра накопления «ПродажиУслуг».
В итоге должен получится примерно такой код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Дата,
| РеализацияТоваровУслуг.Услуги.(
| Номенклатура,
| Сумма
| )
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Проведен";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписейПродажиУслуг = РегистрыНакопления.ПродажиУслуг.СоздатьНаборЗаписей();
НаборЗаписейПродажиУслуг.Отбор.Регистратор.Использование = Истина;
НаборЗаписейПродажиУслуг.Отбор.Регистратор.Значение = Выборка.Ссылка;
НаборЗаписейПродажиУслуг.Отбор.Регистратор.ВидСравнения = ВидСравнения.Равно;
НаборЗаписейПродажиУслуг.Прочитать();
НаборЗаписейПродажиУслуг.Очистить();
ТаблицаУслуг = Выборка.Услуги.Выгрузить();
Для Каждого СтрокаУслуг Из ТаблицаУслуг Цикл
ЗаписьПродажиУслуг = НаборЗаписейПродажиУслуг.Добавить();
ЗаписьПродажиУслуг.Период = Выборка.Дата;
ЗаписьПродажиУслуг.Номенклатура = СтрокаУслуг.Номенклатура;
ЗаписьПродажиУслуг.Сумма = СтрокаУслуг.Сумма;
КонецЦикла;
НаборЗаписейПродажиУслуг.Записать();
КонецЦикла;8. Готово.
После выполнения данной обработки у документов «Реализация товаров и услуг», у которых есть заполненная табличная часть «Услуги» появятся записи в регистре накопления «ПродажиУслуг». Эта операция будет выполнятся гораздо быстрее, чем если бы мы перепроводили все документы.
Примечание:
Этот механизм положен в основу типового Допроведения документов, например в конфигурации «Управление Производственным Предприятием». Допроведение документов выполняется когда не требуется оперативно выполнять какие-либо движения. Например, необязательно списывать партии в момент оперативного проведения документа, так как это занимает продолжительное время. Допроведение может запускается по регламентному заданию и записывать наборы записей регистров к документам, то есть все длительные проверки и операции записи выполнятся в удобное для пользователей время.

