Почему пропадают движения документов после добавления регистра накопления и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При доработке типовых или отраслевых решений в среде 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда после внесения изменений (например, добавления нового регистра накопления) у существующих документов «слетают» старые движения — бухгалтерские проводки, записи в регистрах накопления или сведениях. Проблема усугубляется тем, что новые движения записываются только в созданный регистр, а старые данные не восстанавливаются даже при перепроведении.

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

Причина 1: Опасность полной загрузки конфигурации (файла .cf)

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

Каждый объект в метаданных 1С (документ, справочник, регистр) имеет свой внутренний уникальный идентификатор — UUID. Когда мы используем полную загрузку .cf, платформа полностью заменяет структуру метаданных. Если локальная база, в которой велась разработка, не была точной копией (клоном) рабочей базы на момент начала работ, UUID объектов могут не совпасть. Для платформы это выглядит так:

  1. Старый документ (или его связь с регистром) помечается как удаленный.
  2. Создается «новый» объект с тем же именем, но другим внутренним идентификатором.
  3. При реструктуризации базы данных таблицы движений, связанные со старым UUID, физически удаляются или очищаются.

Важное правило: Никогда не используйте «Загрузить конфигурацию из файла» для обновления рабочих баз, если вы не уверены на 100%, что конфигурация-источник была получена именно из этой базы и в ней не менялись идентификаторы объектов.

Причина 2: Свойство документа «Запись движений»

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

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

Причина 3: Специфика отраслевых решений и подписки на события

Проанализируем ситуацию на примере конфигурации «Аренда и управление недвижимостью». Данное решение базируется на «1С:Бухгалтерия». В современных версиях БП 3.0 формирование проводок часто вынесено из модуля документа в специализированные общие модули или реализуется через подписки на события.

Если вы добавили новый регистр в документ Начисление арендной платы, платформа могла изменить способ вызова типовых механизмов проведения. Рассмотрим пример типичной ошибки в модуле документа:


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

    // ОШИБКА: Забыт вызов типового механизма проведения!
    // Обычно это выглядит как:
    // РаботаСПроводками.СформироватьПроводки(ЭтотОбъект, Отказ);
КонецПроцедуры

Если при объединении конфигураций вы случайно затерли вызовы типовых процедур в модуле документа или модуле объекта, документ будет «молчать» по всем регистрам, кроме вашего нового.

Пошаговый алгоритм исправления проблемы

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

Шаг 1. Восстановление из бэкапа

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

Шаг 2. Правильное объединение конфигураций

Вместо загрузки .cf выполните следующие действия:

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

Шаг 3. Проверка свойств «Записывать выбранные»

Проанализируем свойства документа НачислениеАренднойПлаты в конфигураторе. Убедитесь, что в поле Запись движений не стоит режим, который блокирует запись в невыбранные регистры. Оптимально использовать стандартные настройки, которые были в конфигурации до вашего вмешательства.

Шаг 4. Анализ программного кода проведения

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

Рассмотрим правильную структуру интеграции нового кода:


Процедура ОбработкаПроведения(Отказ, Режим)
    // 1. Сохраняем типовой функционал
    // В БП 3.0 и отраслевых решениях здесь часто вызываются общие модули:
    // ИнтеграцияПодсистемБП.ОбработкаПроведения(ЭтотОбъект, Отказ);

    // 2. Добавляем свои движения
    Движения.ВашРегистр.Записывать = Истина;
    // ... логика заполнения вашего регистра ...
    
    // 3. Убеждаемся, что стандартные регистры тоже имеют флаг Записывать = Истина
    // если это требуется логикой документа
КонецПроцедуры

Резюме

Выясним причину неудачи еще раз: основная ошибка заключалась в некорректном способе доставки изменений в рабочую базу. Загрузка файла конфигурации целиком привела к пересозданию внутренних связей объектов.

Для решения подобных задач всегда используйте механизм сравнения и объединения, внимательно следите за сохранением UUID объектов и не забывайте проверять, что ваш новый код не блокирует выполнение типовых подписок на события, отвечающих за бухгалтерский и налоговый учет.

← На главную