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