В процессе разработки на платформе 1С:Предприятие часто возникает задача фиксации определенных данных в регистре сведений именно в момент проведения документа. Это может быть актуально для хранения цен номенклатуры, состояний заказов, лимитов или любых других сведений, которые должны изменяться строго в хронологической последовательности и быть привязаны к регистратору. Рассмотрим подробно, как правильно настроить объекты метаданных и написать код для решения этой задачи.
Проанализируем самый распространенный и архитектурно верный вариант для большинства задач — использование регистра, который жестко связан с документом-основанием. В этом случае документ выступает в роли Регистратора.
Шаг 1. Настройка регистра сведений
Прежде всего, нам необходимо изменить настройки самого регистра сведений в конфигураторе. Разберем основные настройки на вкладке «Основные»:
Независимый.Шаг 2. Настройка документа
Теперь перейдем к объекту Документ, который должен записывать данные:
Удалять автоматически. В этом случае при отмене проведения или перепроведении платформа сама очистит старые записи в регистре, что исключит дублирование данных.Если мы не хотим писать код вручную с нуля, воспользуемся Конструктором движений. Это самый быстрый способ получить надежную «рыбу» кода. Рассмотрим последовательность действий:
Период — обычно туда передается Дата документа.ОбработкаПроведения в модуле документа.Разберем пример кода, который генерирует конструктор:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{КОНСТРУКТОР_ДВИЖЕНИЙ_ЧТЕНИЕ_ОТМЕТКА
// Данный фрагмент содержит описание движений документа
Движения.ИмяВашегоРегистра.Записывать = Истина;
НоваяЗапись = Движения.ИмяВашегоРегистра.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.Измерение1 = РеквизитДокумента1;
НоваяЗапись.Ресурс1 = РеквизитДокумента2;
//}}КОНСТРУКТОР_ДВИЖЕНИЙ_ЧТЕНИЕ_ОТМЕТКА
КонецПроцедуры
Иногда требуется записать данные в регистр, который должен оставаться независимым (например, если записи в нем могут создаваться и вручную, и документами, или если они не должны удаляться при удалении документа). В этом случае мы не можем полагаться на автоматику коллекции Движения.
Рассмотрим ситуацию, когда в процедуре ОбработкаПроведения нам нужно вручную создать набор записей. Выясним, как это сделать правильно, чтобы не затереть лишние данные:
Процедура ОбработкаПроведения(Отказ, Режим)
// Создаем объект набора записей
НаборЗаписей = РегистрыСведений.ИмяВашегоНезависимогоРегистра.СоздатьНаборЗаписей();
// Обязательно устанавливаем отбор, чтобы работать только с записями текущего документа
// Предположим, у регистра есть измерение "ДокументОснование"
НаборЗаписей.Отбор.ДокументОснование.Установить(Ссылка);
// Создаем новую запись в наборе
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.ДокументОснование = Ссылка;
НоваяЗапись.Значение = РеквизитОбъекта;
// Записываем набор. Параметр Ложь означает, что мы не замещаем весь регистр,
// а только данные по нашему отбору.
НаборЗаписей.Записать();
КонецПроцедуры
Важный нюанс: при работе с независимым регистром в ОбработкаПроведения необходимо также предусмотреть очистку этих данных в процедуре ОбработкаУдаленияПроведения, иначе при отмене проведения документа данные в регистре останутся «висеть».
В современных конфигурациях, таких как УТ 11, ERP 2 или БП 3.0, часто используется вынос логики проведения в общие модули. Посмотрим на пример вызова функции, которая инкапсулирует запись подчиненных данных:
// Пример использования механизмов БСП
Процедура ОбработкаПроведения(Отказ, Режим)
// Вызов общего модуля для подготовки и записи данных
ПроведениеСерверУТ.ЗаписатьПодчиненныеНаборамЗаписейДанные(ЭтотОбъект, Отказ);
КонецПроцедуры
В этом случае платформа или механизмы БСП сами анализируют структуру документа и его дополнительных свойств для формирования движений. Это позволяет минимизировать количество обращений к базе данных и сделать код более чистым.
Рассмотрим несколько советов, которые помогут избежать ошибок при реализации:
ОбработкаПроведения. Если в этой процедуре параметр Отказ станет Истина, все движения по подчиненным регистрам автоматически откатятся платформой.Движения.РегистрСведений платформа накладывает блокировки. Убедитесь, что измерения регистра проиндексированы, если вы планируете делать по ним частые выборки.Период. Для документов это почти всегда Дата документа. Если выставить дату документа в будущее, запись в регистре также появится «будущим числом».Подведем итог: наиболее простым и надежным способом является использование регистра с режимом записи «Подчинение регистратору» и использование Конструктора движений. Это гарантирует автоматическую очистку данных при отмене проведения и упрощает поддержку кода.