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