При закрытии месяца в конфигурациях «1С:Управление торговлей», «1С:Комплексная автоматизация» или «1С:ERP» пользователи часто сталкиваются с ошибкой: «Обнаружены неактивные записи регистров в движениях документов». Эта проблема особенно неприятна тем, что она может возникнуть за очень старые периоды, которые уже давно считаются закрытыми. В данной статье мы подробно разберем, почему возникают такие записи, как их обнаружить и какими способами можно вернуть системе работоспособность.
Для начала проанализируем, что представляет собой «неактивная» запись. В платформе 1С:Предприятие 8.3 каждый регистр накопления имеет техническое поле Активность. Если оно имеет значение Ложь, это означает, что запись физически существует в базе данных, но она не участвует в формировании остатков и не учитывается в отчетах.
Разберем ситуацию, характерную для регистра ТоварыОрганизаций. В современных конфигурациях неактивные записи чаще всего генерируются механизмом Intercompany (передачи товаров между организациями). Когда одна ваша организация продает товар, который по документам числится за другой организацией, система создает движение «расход» в состоянии «неактивно». Это своеобразный «черновик» или отложенное движение. Оно должно стать активным автоматически в тот момент, когда вы оформите документ Передача товаров между этими организациями.
Если же такая передача не была оформлена, была удалена или произошел программный сбой, записи остаются неактивными. При попытке закрытия месяца процедура «Расчет себестоимости» видит эти записи и выдает ошибку, так как цепочка товародвижения не завершена.
Если записей немного и вы уверены, что они должны быть учтены в системе, мы можем прибегнуть к программному методу. Рассмотрим, как это реализовать с помощью внешней обработки, не внося изменения в конфигурацию.
Для реализации этого метода нам потребуется объект РегистрНакопленияНаборЗаписей. Алгоритм действий следующий: мы создаем набор, устанавливаем отбор по конкретному документу-регистратору, считываем записи, меняем флаг активности и записываем набор обратно.
Посмотрим на пример кода, который решает эту задачу:
// Пример программной активации записей регистра
Процедура АктивироватьЗаписиРегистра(ДокументСсылка)
// Создаем набор записей для конкретного регистра
НаборЗаписей = РегистрыНакопления.ТоварыОрганизаций.СоздатьНаборЗаписей();
// Устанавливаем отбор по регистратору, который вызвал ошибку
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
// Читаем текущие записи из базы данных
НаборЗаписей.Прочитать();
// Перебираем записи и меняем свойство Активность
Для Каждого Запись Из НаборЗаписей Цикл
Если Не Запись.Активность Тогда
Запись.Активность = Истина;
КонецЕсли;
КонецЦикла;
// Записываем измененный набор в базу
НаборЗаписей.Записать();
Сообщить("Записи документа " + ДокументСсылка + " успешно активированы.");
КонецПроцедуры
Этот метод хорош тем, что он «лечит» существующие движения, не создавая новых документов. Однако стоит помнить, что если после этого вы перепроведете исходный документ, система может снова вернуть записи в неактивное состояние, если причина (отсутствие передачи между организациями) не была устранена.
Рассмотрим альтернативный вариант, который не требует написания программного кода. В типовых конфигурациях существует документ Корректировка регистров. Этот инструмент позволяет вручную внести изменения в любой регистр системы.
Разберем по шагам, как это сделать:
Корректировка регистров.ТоварыОрганизаций.Важный нюанс: Этот способ требует аккуратности. Если вы просто активируете записи или добавите новые без понимания логики Intercompany, у вас могут «поплыть» остатки в отчете «Ведомость по товарам организаций».
Проанализируем ситуацию, когда документов с ошибками очень много. В этом случае удобно воспользоваться готовыми внешними обработками, такими как «Инструменты разработчика» или «Групповое изменение реквизитов». Однако стандартная обработка группового изменения не всегда позволяет работать напрямую с записями регистров.
Профессиональные инструменты позволяют выполнить запрос к таблице регистра, отобрать все записи с Активность = Ложь и массово изменить это значение. Это самый быстрый способ, но он требует от специалиста понимания структуры метаданных, чтобы не нарушить целостность базы данных.
Некоторые пользователи (как упоминалось в материалах форума) решают проблему радикально — просто удаляют неактивные записи. Рассмотрим, к чему это может привести. Если вы удаляете запись «расхода» в регистре ТоварыОрганизаций, но при этом в регистре Товары на складах списание произошло, у вас возникнет расхождение.
Последствия удаления:
Поэтому удаление допускается только в том случае, если документ был создан ошибочно и фактически никаких движений по складу и организации быть не должно.
Прежде чем приступать к программным исправлениям, мы рекомендуем выполнить следующие действия:
Передача товаров. Это самый правильный способ, который автоматически активирует нужные записи.НаборЗаписей, описанным выше.Подводя итог, можно сказать, что неактивные записи — это не всегда ошибка системы, часто это лишь признак незавершенной бизнес-операции. Понимая механику работы регистров и используя правильные инструменты, вы сможете успешно закрыть месяц даже в самых сложных случаях.