При работе в системах 1С:ERP Управление предприятием или 1С:Комплексная автоматизация пользователи часто сталкиваются с необходимостью корректировки данных, особенно если ошибка была допущена при вводе документов в закрытом периоде. Одной из таких распространённых ситуаций является неверное указание инвентарного номера товарно-материальных ценностей (ТМЦ), переданных в эксплуатацию. Чтобы минимизировать последствия, важно проводить своевременный поиск ошибок в учете, обеспечивая целостность данных в системе.
Прежде чем приступать к исправлению, критически важно понять, как система 1С:ERP и 1С:КА учитывает ТМЦ, переданные в эксплуатацию, так называемую «малоценку» или «спецоснастку». В отличие от основных средств, инвентарный номер для таких ТМЦ не является реквизитом самого справочника «Номенклатура». Вместо этого, каждая уникальная единица ТМЦ, поступившая в эксплуатацию, идентифицируется через инвентарный номер, который фиксируется в специализированных регистрах в момент ввода в эксплуатацию. Это позволяет отслеживать конкретные экземпляры одной и той же номенклатуры (например, 50 одинаковых мониторов).
Рассмотрим ключевые объекты и регистры, задействованные в этом процессе:
ИнвентарныйНомерТМЦВЭксплуатации: Этот объект в конфигураторе лишь описывает возможные типы данных для инвентарного номера. В реальности он чаще всего представляет собой строку определенной длины, например, Строка(11).ТМЦВЭксплуатации: Это основной регистр для количественного учета ТМЦ в разрезе организаций, подразделений, материально-ответственных лиц (МОЛ), номенклатуры, характеристик, серий и, конечно же, инвентарных номеров. Именно здесь хранятся остатки ТМЦ, выданных в эксплуатацию. Для работы с подобными данными полезно иметь под рукой инструмент, выполняющий чтение и корректировку остатков регистра накопления.СтоимостьТМЦВЭксплуатации: Этот регистр предназначен для хранения информации о стоимости ТМЦ в эксплуатации. Он также имеет измерение ИнвентарныйНомер, связывая стоимость с конкретным экземпляром ТМЦ. В ряде случаев для исправления точечных ошибок в измерениях может потребоваться редактор регистров сведений для управляемых форм.НаработкиТМЦВЭксплуатации: Если стоимость ТМЦ в эксплуатации погашается в зависимости от наработки (например, по пробегу или часам работы), то этот регистр будет использоваться для фиксации этих наработок. В нем также присутствует измерение ИнвентарныйНомер.ВнутреннееПотребление. Однако инвентарный номер может фигурировать и в других документах, таких как ВводОстатков, ВводОстатковТМЦВЭксплуатации, ИнвентаризацияТМЦВЭксплуатации, НаработкаТМЦВЭксплуатации, ОприходованиеТМЦВЭксплуатации, ПеремещениеВЭксплуатации, ПрочееОприходованиеТоваров, СписаниеИзЭксплуатации, УведомлениеОбОстаткахПрослеживаемыхТоваров, а также в обработках, например, ПечатьЭтикетокТМЦВЭксплуатации.ПартииТМЦВЭксплуатации: Инвентарный номер также может быть реквизитом элемента этого справочника.МЦ.04. Настройка такого учета производится в параметрах учетной политики организации.Для того чтобы получить полный список объектов, использующих инвентарный номер в вашей конфигурации, мы можем воспользоваться функционалом конфигуратора 1С. Для этого:
РегистрСведений.СтоимостьТМЦВЭксплуатации.ИнвентарныйНомер.ОпределяемыйТип.ИнвентарныйНомерТМЦВЭксплуатации.ОпределяемыйТип.ИнвентарныйНомерТМЦВЭксплуатации, чтобы перейти к этому объекту в конфигураторе.Рассмотрим пример запроса, демонстрирующий, как инвентарные номера учитываются в системе, который может быть использован для заполнения документов инвентаризации:
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
ТекущиеДанныеУчета = Новый ФиксированноеСоответствие(Новый Соответствие);
Если НЕ ЗначениеЗаполнено(Объект.Организация) ИЛИ НЕ ЗначениеЗаполнено(Объект.Подразделение) Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТМЦВЭксплуатации.ФизическоеЛицо КАК ФизическоеЛицо,
| ТМЦВЭксплуатации.Номенклатура КАК Номенклатура,
| ТМЦВЭксплуатации.Характеристика КАК Характеристика,
| ТМЦВЭксплуатации.Серия КАК Серия,
| ТМЦВЭксплуатации.ИнвентарныйНомер КАК ИнвентарныйНомер,
| СУММА(ТМЦВЭксплуатации.КоличествоОстаток) КАК КоличествоПоДаннымУчета
|ИЗ
| РегистрНакопления.ТМЦВЭксплуатации.Остатки(
| &Дата,
| Организация = &Организация
| И Подразделение = &Подразделение
| И (ФизическоеЛицо = &ФизическоеЛицо
| ИЛИ &ФизическоеЛицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка))) КАК ТМЦВЭксплуатации
|
|СГРУППИРОВАТЬ ПО
| ТМЦВЭксплуатации.ФизическоеЛицо,
| ТМЦВЭксплуатации.Номенклатура,
| ТМЦВЭксплуатации.Характеристика,
| ТМЦВЭксплуатации.Серия,
| ТМЦВЭксплуатации.ИнвентарныйНомер
|
|ИМЕЮЩИЕ
| СУММА(ТМЦВЭксплуатации.КоличествоОстаток) > 0
|
|УПОРЯДОЧИТЬ ПО
| ТМЦВЭксплуатации.ФизическоеЛицо.ФИО,
| ТМЦВЭксплуатации.Номенклатура.Представление,
| ТМЦВЭксплуатации.Характеристика.Представление,
| ТМЦВЭксплуатации.Серия.Представление,
| ТМЦВЭксплуатации.ИнвентарныйНомер
|";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
Запрос.УстановитьПараметр("ФизическоеЛицо", Объект.ФизическоеЛицо);
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Объект.Дата), НачалоДня(Объект.Дата), НачалоДня(ТекущаяДатаСеанса)));
// РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Дальнейшая обработка результата запроса для заполнения табличной части документа.
КонецПроцедуры
Этот код наглядно показывает, что система при инвентаризации или для получения остатков оперирует не абстрактной номенклатурой, а конкретными экземплярами ТМЦ, идентифицируемыми в том числе по инвентарным номерам, хранящимся в регистре ТМЦВЭксплуатации.
Рассмотрим различные подходы к исправлению ошибочно введенного инвентарного номера, начиная от наиболее предпочтительных и заканчивая рискованными, но иногда необходимыми.
Наиболее безопасным и методологически корректным способом исправления ошибок в закрытых периодах является применение функционала исправительных документов, предусмотренного в 1С:ERP и 1С:КА. Этот механизм позволяет корректировать или сторнировать ранее созданные документы, включая ВнутреннееПотребление, в текущем периоде, сохраняя целостность учета.
ВнутреннееПотребление создадим новый исправительный документ. Система автоматически сформирует сторнирующие записи по старым данным и внесет новые, корректные движения с правильным инвентарным номером. Этот подход гарантирует сохранение логики учета как в управленческом, так и в регламентированном контурах, а также оставляет полный аудит изменений.Применение исправительных документов значительно снижает риски рассогласования данных и упрощает процесс аудита, поскольку все изменения фиксируются штатными средствами системы.
Этот метод подходит, если политика компании допускает временное открытие закрытых периодов. Это более прямолинейный подход, но сопряженный с определенными рисками:
ВнутреннееПотребление, указав правильный инвентарный номер.ТМЦВЭксплуатации, СтоимостьТМЦВЭксплуатации, НаработкиТМЦВЭксплуатации и др.).Важно! Этот способ требует максимальной осторожности. Изменения в закрытом периоде могут потребовать сдачи корректирующей отчетности.
Автор исходной темы предлагает написать обработку для прямого изменения данных в документе и регистрах. Это наиболее рискованный метод, который следует применять только в крайних случаях. Прямое изменение записей может привести к серьезному рассогласованию. Если вы решитесь на этот путь, изучите примеры корректировки записей регистра, чтобы корректно сформировать программный код.
Если мы все же решаем использовать этот подход, необходимо учитывать следующее:
ИнвентарныйНомер в табличной части документа ВнутреннееПотребление.ВнутреннегоПотребления.ОбменДанными.Загрузка = Истина: При программном изменении данных это позволяет выполнять запись объектов с обходом некоторых контролей, однако это требует глубокого понимания логики системы.Пример части кода обработки для изменения в регистре:
// Предполагается, что мы уже определили старый и новый инвентарный номер,
// а также ссылку на документ-регистратор.
// Замена в РегистреНакопления.ТМЦВЭксплуатации
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТМЦВЭксплуатации.Период,
| ТМЦВЭксплуатации.Организация,
| ТМЦВЭксплуатации.Подразделение,
| ТМЦВЭксплуатации.ФизическоеЛицо,
| ТМЦВЭксплуатации.Номенклатура,
| ТМЦВЭксплуатации.Характеристика,
| ТМЦВЭксплуатации.Серия,
| ТМЦВЭксплуатации.ИнвентарныйНомер,
| ТМЦВЭксплуатации.Количество,
| ТМЦВЭксплуатации.Регистратор
|ИЗ
| РегистрНакопления.ТМЦВЭксплуатации КАК ТМЦВЭксплуатации
|ГДЕ
| ТМЦВЭксплуатации.Регистратор = &Регистратор
| И ТМЦВЭксплуатации.ИнвентарныйНомер = &СтарыйИнвентарныйНомер";
Запрос.УстановитьПараметр("Регистратор", ДокументСсылка); // Ссылка на документ "Внутреннее потребление"
Запрос.УстановитьПараметр("СтарыйИнвентарныйНомер", СтарыйИнвентарныйНомер); // Строка со старым инвентарным номером
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() > 0 Тогда
ДвиженияТМЦ = Движения.ТМЦВЭксплуатации;
ДвиженияТМЦ.Записывать = Истина;
Для Каждого СтрокаДвижения Из РезультатЗапроса Цикл
// Создаем сторнирующую запись
ДвижениеСторно = ДвиженияТМЦ.Добавить();
ДвижениеСторно.ВидДвижения = ВидДвиженияНакопления.Расход;
ДвижениеСторно.Период = СтрокаДвижения.Период;
ДвижениеСторно.Организация = СтрокаДвижения.Организация;
ДвижениеСторно.Подразделение = СтрокаДвижения.Подразделение;
ДвижениеСторно.ФизическоеЛицо = СтрокаДвижения.ФизическоеЛицо;
ДвижениеСторно.Номенклатура = СтрокаДвижения.Номенклатура;
ДвижениеСторно.Характеристика = СтрокаДвижения.Характеристика;
ДвижениеСторно.Серия = СтрокаДвижения.Серия;
ДвижениеСторно.ИнвентарныйНомер = СтрокаДвижения.ИнвентарныйНомер;
ДвижениеСторно.Количество = СтрокаДвижения.Количество;
// Регистрируем новую запись с правильным номером
ДвижениеПриход = ДвиженияТМЦ.Добавить();
ДвижениеПриход.ВидДвижения = ВидДвиженияНакопления.Приход;
ДвижениеПриход.Период = СтрокаДвижения.Период;
ДвижениеПриход.Организация = СтрокаДвижения.Организация;
ДвижениеПриход.Подразделение = СтрокаДвижения.Подразделение;
ДвижениеПриход.ФизическоеЛицо = СтрокаДвижения.ФизическоеЛицо;
ДвижениеПриход.Номенклатура = СтрокаДвижения.Номенклатура;
ДвижениеПриход.Характеристика = СтрокаДвижения.Характеристика;
ДвижениеПриход.Серия = СтрокаДвижения.Серия;
ДвижениеПриход.ИнвентарныйНомер = НовыйИнвентарныйНомер; // <--- Новый инвентарный номер
ДвижениеПриход.Количество = СтрокаДвижения.Количество;
КонецЦикла;
ДвиженияТМЦ.Записать();
КонецЕсли;
Независимо от выбранного метода, необходимо тщательно проанализировать следующие аспекты:
Таким образом, для корректного изменения ошибочно введенного инвентарного номера ТМЦ в эксплуатации в 1С:ERP и 1С:КА наиболее предпочтительным и безопасным способом является использование функционала исправительных документов. В случае, когда требуется более глубокая корректировка, можно использовать специализированный инструмент для исправления проблем в проведенных документах. Помните, что любые ручные правки требуют повышенного внимания к синхронности и целостности данных.