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