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