Как реализовать запись данных из документа в регистр сведений при проведении

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Способ 1. Использование регистра сведений, подчиненного регистратору

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

Шаг 1. Настройка регистра сведений

Прежде всего, нам необходимо изменить настройки самого регистра сведений в конфигураторе. Разберем основные настройки на вкладке «Основные»:

  1. Найдем свойство «Режим записи». По умолчанию оно установлено в значение Независимый.
  2. Изменим его на «Подчинение регистратору». Это критически важный момент: без этой настройки вы не сможете выбрать документ в качестве источника движений в конструкторе.

Шаг 2. Настройка документа

Теперь перейдем к объекту Документ, который должен записывать данные:

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

Способ 2. Использование Конструктора движений

Если мы не хотим писать код вручную с нуля, воспользуемся Конструктором движений. Это самый быстрый способ получить надежную «рыбу» кода. Рассмотрим последовательность действий:

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

Разберем пример кода, который генерирует конструктор:


Процедура ОбработкаПроведения(Отказ, Режим)
    //{{КОНСТРУКТОР_ДВИЖЕНИЙ_ЧТЕНИЕ_ОТМЕТКА
    // Данный фрагмент содержит описание движений документа
    Движения.ИмяВашегоРегистра.Записывать = Истина;
    НоваяЗапись = Движения.ИмяВашегоРегистра.Добавить();
    НоваяЗапись.Период = Дата;
    НоваяЗапись.Измерение1 = РеквизитДокумента1;
    НоваяЗапись.Ресурс1 = РеквизитДокумента2;
    //}}КОНСТРУКТОР_ДВИЖЕНИЙ_ЧТЕНИЕ_ОТМЕТКА
КонецПроцедуры

Способ 3. Программная запись в независимый регистр сведений

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

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


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

КонецПроцедуры

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

Особенности работы в типовых конфигурациях (БСП)

В современных конфигурациях, таких как УТ 11, ERP 2 или БП 3.0, часто используется вынос логики проведения в общие модули. Посмотрим на пример вызова функции, которая инкапсулирует запись подчиненных данных:


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

В этом случае платформа или механизмы БСП сами анализируют структуру документа и его дополнительных свойств для формирования движений. Это позволяет минимизировать количество обращений к базе данных и сделать код более чистым.

Анализ ключевых моментов

Рассмотрим несколько советов, которые помогут избежать ошибок при реализации:

Подведем итог: наиболее простым и надежным способом является использование регистра с режимом записи «Подчинение регистратору» и использование Конструктора движений. Это гарантирует автоматическую очистку данных при отмене проведения и упрощает поддержку кода.

← На главную