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