Почему в 1С:Розница 3 отображается старая единица измерения номенклатуры при выводе цен?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В конфигурациях «1С:Розница 3» и «1С:УНФ 3» пользователи часто сталкиваются с неочевидной проблемой: после изменения единицы измерения в карточке номенклатуры в общем списке продолжает отображаться старое значение. При этом, если убрать из списка колонку с ценой, единица измерения отображается корректно. Перезапуск программы или очистка кэша не помогают.

Проанализируем, почему так происходит, и разберем несколько способов решения этой задачи.

Анализ проблемы: откуда берется неверное значение

Чтобы понять корень проблемы, нужно разобраться, откуда система получает данные для отображения в списке. Логика работы динамического списка номенклатуры в этих конфигурациях такова (Цены в списке справочника Номенклатура):

В регистр сведений «Цены номенклатуры» данные попадают из документа «Установка цен номенклатуры». Важный момент: в запись регистра сохраняется та единица измерения, которая была установлена в номенклатуре на момент проведения этого документа. Если вы позже поменяете единицу измерения в карточке товара, это никак не повлияет на уже существующие записи в регистре цен.

В результате возникает парадокс, который сбивает с толку пользователей:

  1. Вы открываете форму регистра «Цены номенклатуры» и видите там новую, правильную единицу измерения. Это происходит потому, что форма для удобства отображает актуальные данные из связанной номенклатуры.
  2. Однако если выполнить прямой запрос к данным этого же регистра (например, через консоль запросов), вы увидите, что в последней записи по-прежнему хранится старое значение единицы измерения.

Именно это устаревшее значение из регистра и подтягивается в список номенклатуры, когда вы включаете отображение колонки с ценой. Таким образом, это не «глюк» и не проблема кэширования, а следствие архитектуры хранения исторических данных о ценах.

Способы решения проблемы

Существует два основных подхода к решению: исправить исходные данные в регистре или доработать конфигурацию, чтобы она по-другому отображала информацию. Рассмотрим оба варианта.

Решение 1: Корректировка данных в регистре цен (для пользователей)

Этот способ является наиболее правильным с точки зрения целостности данных. Его цель — обновить записи в регистре «Цены номенклатуры», чтобы в них содержалась актуальная единица измерения.

Простой вариант: создать новый документ установки цен. Для автоматизации этого процесса в будущем пригодится Автосоздание документов установки цен при проведении приходных накладных.

Самый легкий путь — это создать новый документ «Установка цен номенклатуры» для всех проблемных позиций.

  1. Создайте новый документ «Установка цен номенклатуры».
  2. Добавьте в него товары, у которых некорректно отображается единица измерения.
  3. Система автоматически подставит для них актуальные цены и правильную единицу измерения из карточки товара (см. также Создание документа "Установка цен" за выбранный период).
  4. Проведите документ.

После этого в регистре появится новая запись с верной единицей измерения, и в списке номенклатуры все будет отображаться корректно.

Продвинутый вариант: групповое изменение документов.

Если проблемных позиций много и они встречаются в разных исторических документах установки цен, можно воспользоваться обработкой «Групповое изменение реквизитов». Этот метод позволяет массово исправить данные в табличных частях существующих документов.

Разберем по шагам:

  1. Откройте обработку (раздел Администрирование – Обслуживание – Коррекция данных).
  2. В поле «Изменять» выберите объект: Документы, а затем найдите и выберите «Установка цен номенклатуры».
  3. Теперь нужно отобрать документы, в которых есть проблемный товар. Нажмите на ссылку «Все элементы», чтобы настроить отбор.
  4. В форме отбора добавьте новое условие. В левой части выберите путь: Товары (Табличная часть) -> Номенклатура. Условие — «Равно». В правой части укажите проблемную номенклатуру. Таким образом вы найдете все документы, где устанавливалась цена на этот товар.
  5. После того как документы отобраны, перейдите на вкладку «Реквизиты».
  6. Найдите в списке реквизитов табличную часть «Товары» и раскройте ее.
  7. Установите флажок напротив реквизита «Единица измерения» и укажите в поле «Новое значение» правильную единицу.
  8. Нажмите кнопку «Изменить реквизиты».

Важно: этот способ изменяет исторические документы. Перед выполнением операции обязательно сделайте резервную копию базы данных.

Решение 2: Программная доработка формы списка (для программистов)

Этот метод не исправляет данные, а меняет логику их отображения. Он подходит, если изменять исторические документы нежелательно или невозможно. Решение реализуется через расширение конфигурации, чтобы не снимать ее с поддержки.

Идея заключается в том, чтобы доработать код формы списка номенклатуры.

  1. Создайте новое расширение и добавьте в него форму списка справочника «Номенклатура».
  2. В модуле заимствованной формы найдите процедуру, ответственную за вывод цен. В типовых конфигурациях она часто называется «ВывестиЦены» или имеет схожее название.
  3. Проанализируйте код этой процедуры. Вы увидите, что в ней выполняется запрос к регистру цен, а затем результат запроса обрабатывается в цикле или выгружается в таблицу значений для последующего заполнения колонок списка.
  4. Ваша задача — вмешаться в этот процесс. После того как данные о ценах и единицах измерения получены из регистра, нужно принудительно подставить актуальную единицу измерения из самой номенклатуры.

Рассмотрим псевдокод, который иллюстрирует эту логику:


// Это не готовый код, а пример логики для встраивания в процедуру обработки цен
// ...здесь выполняется запрос к регистру ЦеныНоменклатуры...
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЦен = РезультатЗапроса.Выгрузить();

// Теперь перебираем полученные данные и корректируем единицу измерения
Для Каждого СтрокаЦены ИЗ ТаблицаЦен Цикл
    
    // Получаем ссылку на номенклатуру из текущей строки
    СсылкаНаНоменклатуру = СтрокаЦены.Номенклатура;
    
    // Принудительно заменяем единицу измерения из регистра 
    // на базовую единицу измерения из карточки номенклатуры.
    // Важно: нужно получить значение реквизита, а не просто ссылку.
    // В реальном коде это может потребовать дополнительного запроса или обращения через точку.
    СтрокаЦены.ЕдиницаИзмерения = Справочники.Номенклатура[СсылкаНаНоменклатуру].ЕдиницаИзмерения;
    
КонецЦикла;

// ...дальнейший код, который использует ТаблицаЦен для вывода в динамический список...

Этот подход гарантирует, что пользователь всегда будет видеть актуальную единицу измерения, независимо от того, что записано в регистре цен. Однако сами данные в регистре останутся некорректными, что стоит учитывать при формировании отчетов, построенных непосредственно на этом регистре.

Таким образом, выбор способа решения зависит от ваших задач: если важна чистота и корректность исторических данных — выбирайте первый способ. Если нужно быстрое визуальное исправление без изменения данных — подойдет второй.

← На главную