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