В конфигурациях «1С:Розница 3» и «1С:УНФ 3» пользователи часто сталкиваются с неочевидной проблемой: после изменения единицы измерения в карточке номенклатуры в общем списке продолжает отображаться старое значение. При этом, если убрать из списка колонку с ценой, единица измерения отображается корректно. Перезапуск программы или очистка кэша не помогают.
Проанализируем, почему так происходит, и разберем несколько способов решения этой задачи.
Чтобы понять корень проблемы, нужно разобраться, откуда система получает данные для отображения в списке. Логика работы динамического списка номенклатуры в этих конфигурациях такова (Цены в списке справочника Номенклатура):
«Номенклатура». В этом случае вы всегда видите актуальное значение, которое указано в карточке товара.«Цены номенклатуры». Чтобы не делать лишних соединений, из этого же запроса берется и единица измерения. И именно здесь кроется проблема.В регистр сведений «Цены номенклатуры» данные попадают из документа «Установка цен номенклатуры». Важный момент: в запись регистра сохраняется та единица измерения, которая была установлена в номенклатуре на момент проведения этого документа. Если вы позже поменяете единицу измерения в карточке товара, это никак не повлияет на уже существующие записи в регистре цен.
В результате возникает парадокс, который сбивает с толку пользователей:
«Цены номенклатуры» и видите там новую, правильную единицу измерения. Это происходит потому, что форма для удобства отображает актуальные данные из связанной номенклатуры.Именно это устаревшее значение из регистра и подтягивается в список номенклатуры, когда вы включаете отображение колонки с ценой. Таким образом, это не «глюк» и не проблема кэширования, а следствие архитектуры хранения исторических данных о ценах.
Существует два основных подхода к решению: исправить исходные данные в регистре или доработать конфигурацию, чтобы она по-другому отображала информацию. Рассмотрим оба варианта.
Этот способ является наиболее правильным с точки зрения целостности данных. Его цель — обновить записи в регистре «Цены номенклатуры», чтобы в них содержалась актуальная единица измерения.
Простой вариант: создать новый документ установки цен. Для автоматизации этого процесса в будущем пригодится Автосоздание документов установки цен при проведении приходных накладных.
Самый легкий путь — это создать новый документ «Установка цен номенклатуры» для всех проблемных позиций.
«Установка цен номенклатуры».После этого в регистре появится новая запись с верной единицей измерения, и в списке номенклатуры все будет отображаться корректно.
Продвинутый вариант: групповое изменение документов.
Если проблемных позиций много и они встречаются в разных исторических документах установки цен, можно воспользоваться обработкой «Групповое изменение реквизитов». Этот метод позволяет массово исправить данные в табличных частях существующих документов.
Разберем по шагам:
Администрирование – Обслуживание – Коррекция данных).«Изменять» выберите объект: Документы, а затем найдите и выберите «Установка цен номенклатуры».«Все элементы», чтобы настроить отбор.Товары (Табличная часть) -> Номенклатура. Условие — «Равно». В правой части укажите проблемную номенклатуру. Таким образом вы найдете все документы, где устанавливалась цена на этот товар.«Реквизиты».«Товары» и раскройте ее.«Единица измерения» и укажите в поле «Новое значение» правильную единицу.«Изменить реквизиты».Важно: этот способ изменяет исторические документы. Перед выполнением операции обязательно сделайте резервную копию базы данных.
Этот метод не исправляет данные, а меняет логику их отображения. Он подходит, если изменять исторические документы нежелательно или невозможно. Решение реализуется через расширение конфигурации, чтобы не снимать ее с поддержки.
Идея заключается в том, чтобы доработать код формы списка номенклатуры.
«Номенклатура».«ВывестиЦены» или имеет схожее название.Рассмотрим псевдокод, который иллюстрирует эту логику:
// Это не готовый код, а пример логики для встраивания в процедуру обработки цен
// ...здесь выполняется запрос к регистру ЦеныНоменклатуры...
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЦен = РезультатЗапроса.Выгрузить();
// Теперь перебираем полученные данные и корректируем единицу измерения
Для Каждого СтрокаЦены ИЗ ТаблицаЦен Цикл
// Получаем ссылку на номенклатуру из текущей строки
СсылкаНаНоменклатуру = СтрокаЦены.Номенклатура;
// Принудительно заменяем единицу измерения из регистра
// на базовую единицу измерения из карточки номенклатуры.
// Важно: нужно получить значение реквизита, а не просто ссылку.
// В реальном коде это может потребовать дополнительного запроса или обращения через точку.
СтрокаЦены.ЕдиницаИзмерения = Справочники.Номенклатура[СсылкаНаНоменклатуру].ЕдиницаИзмерения;
КонецЦикла;
// ...дальнейший код, который использует ТаблицаЦен для вывода в динамический список...
Этот подход гарантирует, что пользователь всегда будет видеть актуальную единицу измерения, независимо от того, что записано в регистре цен. Однако сами данные в регистре останутся некорректными, что стоит учитывать при формировании отчетов, построенных непосредственно на этом регистре.
Таким образом, выбор способа решения зависит от ваших задач: если важна чистота и корректность исторических данных — выбирайте первый способ. Если нужно быстрое визуальное исправление без изменения данных — подойдет второй.