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

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

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

Анализ частых ошибок при работе с регистром сведений

Рассмотрим, с какими трудностями сталкиваются разработчики при попытке вручную наполнять независимый регистр сведений из модуля проведения документов:

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

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

Проанализируем стандартную практику платформы 1С. Чтобы исключить ручные манипуляции с наборами и менеджерами записей при проведении документов, регистр сведений переводят в режим подчинения документам-регистраторам.

Разберем по шагам, как настроить такую схему:

  1. В дереве метаданных у регистра сведений установим свойство Режим записи в значение Подчинение регистратору.
  2. В свойстве Периодичность укажем Позиция регистратора (или Секунда). Это позволит платформе автоматически синхронизировать дату движений со временем документа.
  3. На вкладке Регистраторы отметим оба документа: первичный («Ввод в эксплуатацию») и корректирующий («Акт выверки технических характеристик»).
  4. Определим состав полей:
    Измерения: Газопровод (Ссылка на справочник), НаименованиеСоставляющей;
    Ресурсы: Количество, Материал, Исполнение, Диаметр.

Посмотрим на пример кода в процедуре ОбработкаПроведения документов. Теперь нам не нужно создавать наборы вручную — платформа предоставляет готовое свойство Движения:


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

При таком подходе платформа берет на себя очистку движений при отмене проведения документа. Для получения актуального состава оборудования в любой момент времени и в отчетах достаточно обратиться к виртуальной таблице СрезПоследних регистра сведений, передав нужную дату среза.

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

Если по условиям архитектуры регистр сведений обязательно должен оставаться независимым (без подчинения регистратору), выясним причину сбоев и настроим запись через НаборЗаписей правильно.

Главное правило: объект НаборЗаписей перезаписывает данные только в рамках установленного отбора. Отбор должен устанавливаться строго по ключевому измерению (например, по конкретному объекту учета), а вызов метода записи должен происходить после завершения цикла по строкам табличной части.

Посмотрим на пример программной записи набора:


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

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

Способ 3. Использование регистра накопления для фиксации разниц (дельта)

Если основная цель выверки — корректировка количественных показателей составляющих и формирование отчета по изменениям за период, проанализируем использование регистра накопления с видом «Остатки»:

  1. Документ «Ввод в эксплуатацию» формирует приход (ВидДвиженияНакопления.Приход) на первоначальное количество.
  2. Документ «Акт выверки» рассчитывает отклонения (дельту): в случае уменьшения количества он формирует движение расхода, при увеличении — дополнительный приход, либо сторнирует неверную строку и вводит правильную.
  3. В этом случае типовой отчет по таблице Обороты регистра накопления наглядно покажет все корректировки за выбранный интервал времени без сложных сопоставлений срезов.
← На главную