При доработке типовых или отраслевых решений в среде 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда после внесения изменений (например, добавления нового регистра накопления) у существующих документов «слетают» старые движения — бухгалтерские проводки, записи в регистрах накопления или сведениях. Проблема усугубляется тем, что новые движения записываются только в созданный регистр, а старые данные не восстанавливаются даже при перепроведении.
В этой статье мы подробно разберем, почему это происходит, проанализируем технические причины очистки таблиц базы данных и составим пошаговый план по корректному переносу доработок из локальной копии в рабочую базу.
Выясним причину, которая чаще всего приводит к катастрофическим последствиям при обновлении. Проанализируем действия автора: использование функции «Загрузить конфигурацию из файла» вместо штатного механизма «Сравнить и объединить». Рассмотрим, почему это критично.
Каждый объект в метаданных 1С (документ, справочник, регистр) имеет свой внутренний уникальный идентификатор — UUID. Когда мы используем полную загрузку .cf, платформа полностью заменяет структуру метаданных. Если локальная база, в которой велась разработка, не была точной копией (клоном) рабочей базы на момент начала работ, UUID объектов могут не совпасть. Для платформы это выглядит так:
Важное правило: Никогда не используйте «Загрузить конфигурацию из файла» для обновления рабочих баз, если вы не уверены на 100%, что конфигурация-источник была получена именно из этой базы и в ней не менялись идентификаторы объектов.
Разберем настройки самого документа в конфигураторе. Откроем вкладку «Движения» и проанализируем список регистров. Здесь скрываются две важные настройки, которые могут повлиять на поведение системы при проведении:
Хозрасчетный или НДСПродажи), то при проведении документа 1С просто не будет знать, что в них нужно что-то записывать.Удаление движений. Если установлено значение «Автоматически удалять», то перед выполнением кода в процедуре ОбработкаПроведения платформа очищает ВСЕ движения по ВСЕМ регистрам, указанным в составе. Если ваш код заполняет только новый регистр, а старые механизмы (типовые подписки или модули) не отрабатывают, то старые движения исчезнут навсегда.Проанализируем ситуацию на примере конфигурации «Аренда и управление недвижимостью». Данное решение базируется на «1С:Бухгалтерия». В современных версиях БП 3.0 формирование проводок часто вынесено из модуля документа в специализированные общие модули или реализуется через подписки на события.
Если вы добавили новый регистр в документ Начисление арендной платы, платформа могла изменить способ вызова типовых механизмов проведения. Рассмотрим пример типичной ошибки в модуле документа:
Процедура ОбработкаПроведения(Отказ, Режим)
// Ваш новый код для нового регистра
Движения.МойНовыйРегистр.Записывать = Истина;
НоваяЗапись = Движения.МойНовыйРегистр.Добавить();
НоваяЗапись.Период = Дата;
// ... заполнение полей ...
// ОШИБКА: Забыт вызов типового механизма проведения!
// Обычно это выглядит как:
// РаботаСПроводками.СформироватьПроводки(ЭтотОбъект, Отказ);
КонецПроцедуры
Если при объединении конфигураций вы случайно затерли вызовы типовых процедур в модуле документа или модуле объекта, документ будет «молчать» по всем регистрам, кроме вашего нового.
Если вы уже обновили рабочую базу и движения пропали, выполните следующие действия вместе с нами, чтобы восстановить работоспособность системы:
Прежде всего, необходимо признать: если таблицы движений были очищены при реструктуризации (из-за несовпадения UUID), то простым «перепроведением» данные в типовых регистрах могут не восстановиться в исходном виде, особенно если были ручные корректировки проводок. Восстановите рабочую базу из последней резервной копии перед неудачным обновлением.
Вместо загрузки .cf выполните следующие действия:
НачислениеАренднойПлаты. Разверните его и убедитесь, что вы добавляете только новый регистр в Движения и вносите изменения в Модуль проведения, не затирая существующие связи.Проанализируем свойства документа НачислениеАренднойПлаты в конфигураторе. Убедитесь, что в поле Запись движений не стоит режим, который блокирует запись в невыбранные регистры. Оптимально использовать стандартные настройки, которые были в конфигурации до вашего вмешательства.
Проверим, не был ли нарушен вызов типовых процедур. В отраслевых решениях 1С часто используется механизм, когда движения формируются в самом конце процедуры ОбработкаПроведения. Убедитесь, что ваш код добавлен в начало или конец, но не заменяет собой весь типовой функционал.
Рассмотрим правильную структуру интеграции нового кода:
Процедура ОбработкаПроведения(Отказ, Режим)
// 1. Сохраняем типовой функционал
// В БП 3.0 и отраслевых решениях здесь часто вызываются общие модули:
// ИнтеграцияПодсистемБП.ОбработкаПроведения(ЭтотОбъект, Отказ);
// 2. Добавляем свои движения
Движения.ВашРегистр.Записывать = Истина;
// ... логика заполнения вашего регистра ...
// 3. Убеждаемся, что стандартные регистры тоже имеют флаг Записывать = Истина
// если это требуется логикой документа
КонецПроцедуры
Выясним причину неудачи еще раз: основная ошибка заключалась в некорректном способе доставки изменений в рабочую базу. Загрузка файла конфигурации целиком привела к пересозданию внутренних связей объектов.
Для решения подобных задач всегда используйте механизм сравнения и объединения, внимательно следите за сохранением UUID объектов и не забывайте проверять, что ваш новый код не блокирует выполнение типовых подписок на события, отвечающих за бухгалтерский и налоговый учет.