При программной обработке документов конфигурации «Бухгалтерия предприятия» разработчики часто сталкиваются с задачей корректировки движений по регистру бухгалтерии. Например, когда требуется изменить один счет учета на другой (перенести движения со счета 41.02 на счет 41.12), пересчитать сумму или откорректировать состав аналитики (субконто). Однако при попытке записать обновленный набор проводок платформа 1С может выдать критическую ошибку: «Запись не верна! Не совпадает активность записей (Регистр бухгалтерии: Журнал проводок)».
В этой статье мы подробно разберем причины этой проблемы, проанализируем ошибки при заполнении свойств записей и рассмотрев правильную методику работы с субконто и количественным учетом.
Рассмотрим устройство регистра бухгалтерии в платформе «1С:Предприятие». Все записи в рамках одного набора (для конкретного документа-регистратора) должны иметь единое значение флага активности. Набор записей не может одновременно содержать проводки с флагом Активность = Истина и Активность = Ложь.
Проанализируем типовой сценарий, приводящий к ошибке:
Активность = Истина.Добавить(). По умолчанию у вновь созданной строки реквизит Активность имеет значение Ложь.ЗаполнитьЗначенияСвойств() пропускает системные служебные свойства.Записать() платформа фиксирует расхождение флага активности среди строк одного набора и блокирует запись.Для исправления ситуации необходимо явно присваивать флаг активности создаваемым строкам:
НоваяСтрока.Активность = Истина;
Распространенной ошибкой при изменении проводок является попытка прямого присвоения значений реквизитам вида СубконтоКт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С:Предприятие» в режиме отладки с включенной остановкой по технологическим исключениям. Это позволит быстро проверить свойства объекта НоваяСтрока в табло и точно определить, какое из полей вызывает сбой.