Как правильно изменить единицу измерения номенклатуры в 1С, чтобы избежать ошибок в учете?

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

Изменение единицы измерения для уже существующей номенклатуры в системе 1С может показаться простой задачей, но на практике это действие требует особого внимания и аккуратности. Особенно, если номенклатура уже участвовала в каких-либо учетных операциях, имеет остатки на складах или фигурирует в ценовых списках. Некорректное изменение может привести к серьезным расхождениям в учете, ошибкам в отчетах и даже к потере данных. Давайте вместе разберем эту непростую ситуацию и выясним, как действовать правильно.

Эволюция единиц измерения в 1С: от простого к комплексному

Прежде чем мы перейдем к методам изменения, рассмотрим, как устроены единицы измерения в современных конфигурациях 1С, таких как 1С:Управление торговлей 11.5, 1С:ERP, 1С:УНФ 3.0, 1С:Розница 3.0. Мы увидим, что концепция значительно расширилась.

  1. Единица хранения (базовая единица измерения): Это основа всего учета. Именно в этой единице ведутся складской учет, формируются движения по

    регистрам накопления

    и строятся все количественные отчеты по номенклатуре. Ранее она часто называлась просто ЕдиницаИзмерения.
  2. Упаковки (УпаковкиЕдиницыИзмерения): В новых конфигурациях мы столкнемся с понятием Упаковки или УпаковкиЕдиницыИзмерения. Это альтернативные единицы, которые позволяют учитывать товар в разных разрезах (например, штуки, коробки, паллеты) и использовать их в документах. Каждая упаковка имеет постоянный коэффициент пересчета, который связывает ее с базовой единицей хранения. Это позволяет системе автоматически пересчитывать количество между разными упаковками и базовой единицей. Упаковки могут поддерживать вложенность, что еще больше усложняет картину.
  3. Единица для отчетов: В некоторых конфигурациях предусмотрена отдельная единица, заданная для анализа складских остатков в удобной форме, не влияющая на учетные движения. Она также использует коэффициент пересчета относительно единицы хранения.

Важно понимать, что реквизит ЕдиницаИзмерения в карточке номенклатуры в современных решениях часто является ссылкой на основной элемент из справочника УпаковкиЕдиницыИзмерения, который помечен как "Единица хранения".

Безопасные методы изменения единицы измерения: когда номенклатура уже в учете

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

  1. Создание новой номенклатуры:

    Начнем с создания нового элемента справочника Номенклатура. Присвоим ему новое наименование (например, "Товар А (кг)" вместо "Товар А (шт)"), новую артикул, если это необходимо, и, самое главное, укажем правильную базовую единицу измерения. При необходимости перенесем все характеристики, свойства и виды цен, которые были у старой номенклатуры.

  2. Перенос остатков и движений:

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

    • Документ "Перемещение товаров": Создаем документ, в котором "отгружаем" старую номенклатуру со склада и "приходуем" новую номенклатуру. Ключевой момент здесь — корректный пересчет количества с учетом коэффициентов пересчета между старой и новой единицами измерения. Например, если у нас было 1000 штук (по 0.001 кг каждая), и мы переходим на килограммы, то нам нужно будет оприходовать 1 кг.
    • Специализированные обработки: В некоторых случаях, для массового переноса, может потребоваться разработка или использование специализированных обработок, которые автоматизируют создание документов перемещения или оприходования/списания.
    • Документ "Комплектация номенклатуры" (для 1С:Бухгалтерии): В 1С:Бухгалтерии мы можем использовать этот документ, чтобы "разобрать" старую номенклатуру и "собрать" новую. Например, если у нас были "Детали (шт)", мы можем "раскомплектовать" их и "скомплектовать" как "Детали (кг)", указав соответствующие коэффициенты.

    Важно: Убедитесь, что все регистры (количественные, стоимостные) отражают перенос корректно. Проверьте себестоимость!

  3. Обновление документов и цен:

    После переноса остатков нам нужно обновить все документы, где фигурировала старая номенклатура. Это могут быть:

    • Договоры с контрагентами.
    • Прайс-листы и установки цен.
    • Заказы клиентов/поставщиков (если они еще не проведены).
    • Спецификации производства.

    Мы должны заменить ссылки на старую номенклатуру на новую. Для этого может пригодиться обработка "Групповое изменение реквизитов", о которой мы поговорим ниже.

  4. Закрытие старой номенклатуры:

    Чтобы исключить дальнейшее использование старой номенклатуры и избежать ошибок, мы рекомендуем пометить ее как "неактивную" или, если это возможно и безопасно (нет ссылок в проведенных документах), удалить. Пометка на удаление — это более безопасный вариант.

  5. Проверка отчетов:

    После всех изменений мы обязательно должны сформировать ключевые отчеты (например, "Ведомость по товарам на складах", "Анализ себестоимости") и убедиться, что данные отображаются корректно в новой единице измерения, и нет расхождений в остатках.

Программное изменение и групповые обработки: когда нужно действовать массово

Для массового изменения реквизитов, в том числе единицы измерения, в 1С предусмотрены мощные инструменты. Однако использовать их нужно с особой осторожностью.

Групповое изменение реквизитов

В большинстве конфигураций 1С (например, в УТ 11, ERP) существует стандартная обработка Групповое изменение реквизитов. Найти ее можно через меню "Администрирование" - "Обслуживание" - "Корректировка данных" (или схожий путь).

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

Используя эту обработку, мы можем выбрать справочник Номенклатура, отобрать нужные элементы по определенным критериям и изменить реквизит ЕдиницаИзмерения на новый. При этом важно, чтобы новая единица измерения уже существовала в справочнике УпаковкиЕдиницыИзмерения и была привязана к соответствующему элементу ОКЕИ.

Программное изменение и нюансы владельца единицы измерения

При программном изменении через код 1С мы сталкиваемся с тем, что реквизит ЕдиницаИзмерения в справочнике Номенклатура является ссылкой на элемент справочника КлассификаторЕдиницИзмерения (в старых конфах) или УпаковкиЕдиницыИзмерения (в новых). Важный момент, на который указывают в форумах, — это владелец единицы измерения.

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


// Предположим, у нас есть ссылка на элемент номенклатуры, которую нужно изменить
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоКоду("00001");

Если СсылкаНаНоменклатуру <> Неопределено Тогда
    // Получаем объект номенклатуры для изменения
    ОбъектНоменклатуры = СсылкаНаНоменклатуру.ПолучитьОбъект();

    // Определяем, какую единицу измерения мы хотим установить
    // Например, ищем "кг" из ОКЕИ
    ЕдиницаИзмеренияДляУстановки = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");
    // Или, если используем УпаковкиЕдиницыИзмерения, ищем по наименованию и владельцу
    // В современных конфигурациях единицы могут быть индивидуальными для номенклатуры
    // или общими. Предположим, мы хотим найти общую единицу "кг" или создать новую.

    // Пример поиска в УпаковкиЕдиницыИзмерения, если они общие
    ЕдиницаИзмеренияДляУстановкиНоваяКонфа = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("кг");

    // Если "кг" не найдено как общая упаковка, возможно, нужно создать новую
    // или использовать функцию, которая создает/находит упаковку для конкретной номенклатуры.
    // Например, функция ВладелецУпаковкиЕдиницыИзмеренияНоменклатура (может быть внутренней)
    // для определения, является ли номенклатура владельцем упаковки.

    // В упрощенном примере, если ЕдиницаИзмерения - это ссылка на КлассификаторЕдиницИзмерения:
    Если ЕдиницаИзмеренияДляУстановки <> Неопределено Тогда
        ОбъектНоменклатуры.ЕдиницаИзмерения = ЕдиницаИзмеренияДляУстановки;
        Попытка
            ОбъектНоменклатуры.Записать();
            Сообщить("Единица измерения для номенклатуры " + ОбъектНоменклатуры.Наименование + " успешно изменена.");
        Исключение
            Сообщить("Ошибка при записи номенклатуры: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Единица измерения 'кг' не найдена в классификаторе.");
    КонецЕсли;

    // В более сложной ситуации с УпаковкиЕдиницыИзмерения, мы бы работали с ними:
    // Найдем или создадим нужную упаковку, например, "кг" с коэффициентом 1
    // И установим ее как ЕдиницуХранения в ОбъектНоменклатуры.
    // Это может быть сложная логика, включающая методы модуля менеджера справочника УпаковкиЕдиницыИзмерения.
КонецЕсли;

Важно: При программном изменении мы должны всегда проверять, нашлась ли единица измерения. Если ЕдиницаИзмеренияДляУстановки окажется Неопределено, попытка присвоить ее вызовет ошибку. Также, как мы уже говорили, мы должны учитывать, что реквизит ЕдиницаИзмерения должен быть связан с корректным элементом ОКЕИ.

Отладка и поиск причин: когда что-то пошло не так

Даже при самом тщательном подходе могут возникнуть ситуации, когда изменение единицы измерения не срабатывает или дает неожиданный результат. В таких случаях нам поможет отладчик.

  1. "Оставить в Excel одну строчку, запустить отладчик": Это очень ценный совет. Если вы работаете с внешними данными (например, из Excel) и какая-то конкретная строка не обрабатывается корректно, создайте минимальный набор данных, который воспроизводит проблему (в данном случае, одну строку в Excel), и используйте его для тестирования.
  2. Использование отладчика:

    Запустите 1С в режиме отладки (F5 или через меню "Отладка" - "Начать отладку"). Установите точки останова (F9) в критических местах вашего кода или обработки, где происходит поиск или установка единицы измерения. Например, перед строкой, где вы ищете единицу измерения, и перед строкой, где вы ее присваиваете.

    
    // Точка останова здесь
    ЕдиницаИзмеренияДляУстановки = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");
    // Шаг с заходом (F7) или Шаг через (F8)
    Если ЕдиницаИзмемеренияДляУстановки <> Неопределено Тогда
        ОбъектНоменклатуры.ЕдиницаИзмерения = ЕдиницаИзмеренияДляУстановки; // Точка останова здесь
        ОбъектНоменклатуры.Записать();
    КонецЕсли;
    

    Когда выполнение программы достигнет точки останова, вы сможете:

    • Пошагово выполнять код (F8 - шаг через, F7 - шаг с заходом).
    • Просматривать значения переменных (в окне "Табло" или наводя курсор на переменную).
    • Выяснить, что именно возвращает функция поиска (например, НайтиПоНаименованию). Возможно, наименование "кг" не совпадает с тем, что есть в справочнике, или есть дубли.
    • Проверить, почему не выполняется условие Если ЕдиницаИзмеренияДляУстановки <> Неопределено Тогда.
  3. Анализ "владельца" единицы измерения: Как уже было упомянуто, в новых конфигурациях единицы измерения могут быть привязаны к номенклатуре-владельцу. Если вы ищете общую единицу, но она существует только как упаковка конкретной номенклатуры, поиск может не дать результата. Проанализируйте структуру справочника УпаковкиЕдиницыИзмерения и убедитесь, что вы ищете правильный элемент с учетом владельца или его отсутствия.

Общие рекомендации и важные нюансы

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

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

← К списку