Как программно изменить проводки в документе 1С и исправить ошибку «Не совпадает активность записей»

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

При программной обработке документов конфигурации «Бухгалтерия предприятия» разработчики часто сталкиваются с задачей корректировки движений по регистру бухгалтерии. Например, когда требуется изменить один счет учета на другой (перенести движения со счета 41.02 на счет 41.12), пересчитать сумму или откорректировать состав аналитики (субконто). Однако при попытке записать обновленный набор проводок платформа 1С может выдать критическую ошибку: «Запись не верна! Не совпадает активность записей (Регистр бухгалтерии: Журнал проводок)».

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

Почему возникает ошибка «Не совпадает активность записей»

Рассмотрим устройство регистра бухгалтерии в платформе «1С:Предприятие». Все записи в рамках одного набора (для конкретного документа-регистратора) должны иметь единое значение флага активности. Набор записей не может одновременно содержать проводки с флагом Активность = Истина и Активность = Ложь.

Проанализируем типовой сценарий, приводящий к ошибке:

  1. Из документа или регистра считываются существующие проводки, имеющие значение Активность = Истина.
  2. Создается новая строка набора записей с помощью метода Добавить(). По умолчанию у вновь созданной строки реквизит Активность имеет значение Ложь.
  3. Значение реквизита не обновляется вручную, либо функция ЗаполнитьЗначенияСвойств() пропускает системные служебные свойства.
  4. При попытке вызвать метод Записать() платформа фиксирует расхождение флага активности среди строк одного набора и блокирует запись.

Для исправления ситуации необходимо явно присваивать флаг активности создаваемым строкам:

НоваяСтрока.Активность = Истина;

Как правильно изменять субконто с помощью метода УстановитьСубконто()

Распространенной ошибкой при изменении проводок является попытка прямого присвоения значений реквизитам вида СубконтоКт1, ВидСубконтоКт1 или присвоение пустых строк "" для «очистки» аналитики. План счетов имеет жестко заданную структуру субконто для каждого счета, и прямое присвоение часто приводит к потере данных или несовпадению типов.

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

Рассмотрим пример правильного применения метода:


// Установка склада в качестве субконто по кредиту
ВидАналитики = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады;
ЗначениеАналитики = Запись.СубконтоКт2; // Берем нужное значение из исходной проводки

НоваяСтрока.УстановитьСубконто(ВидАналитики, ЗначениеАналитики);

Особенности очистки количественного учета

Разберем еще один важный нюанс, возникающий при замене одного счета на другой. Счета учета могут отличаться настройками признаков учета (например, на счете 41.02 ведется количественный учет, а на счете 41.12 он отсутствует).

При перенесении проводки с суммового и количественного счета на исключительно суммовой недостаточно записать в поле количества пустую строку вида НоваяСтрока.КоличествоКт = "". Реквизиты количества в 1С имеют строгий числовой тип данных. Присвоение строки вызывает ошибку приведения типов.

Посмотрим, как правильно очистить количество:


// Для счетов без количественного учета обнуляем числовые показатели
НоваяСтрока.КоличествоКт = 0;
НоваяСтрока.КоличествоДт = 0;

Итоговый пример корректной обработки проводок

Собраем все исправленные блоки в единый алгоритм обработки набора проводок регистра бухгалтерии:


Для Каждого Запись Из ПроводкиДокумента Цикл
    // Проверяем условие замены счетов
    Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.2") 
       И Запись.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.02") Тогда
        
        НоваяСтрока = ПроводкиДокументаКопия.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Запись);
        
        // 1. Обязательно устанавливаем флаг активности
        НоваяСтрока.Активность = Истина;
        
        // 2. Назначаем новые счета
        НоваяСтрока.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.2");
        НоваяСтрока.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.12");
        
        // 3. Устанавливаем аналитику через предназначенный метод
        СкладСубконто = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады;
        НоваяСтрока.УстановитьСубконто(СкладСубконто, Запись.СубконтоКт2);
        
        // 4. Корректно сбрасываем количество числовым значением
        НоваяСтрока.КоличествоКт = 0;
        
        // 5. Пересчитываем сумму с учетом коэффициента
        НоваяСтрока.Сумма = Запись.Сумма * КоэфПродаж;
        
    КонецЕсли;
КонецЦикла;

Рекомендации по отладке внешних обработок

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

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

← На главную