Изменение единицы измерения для уже существующей номенклатуры в системе 1С может показаться простой задачей, но на практике это действие требует особого внимания и аккуратности. Особенно, если номенклатура уже участвовала в каких-либо учетных операциях, имеет остатки на складах или фигурирует в ценовых списках. Некорректное изменение может привести к серьезным расхождениям в учете, ошибкам в отчетах и даже к потере данных. Давайте вместе разберем эту непростую ситуацию и выясним, как действовать правильно.
Прежде чем мы перейдем к методам изменения, рассмотрим, как устроены единицы измерения в современных конфигурациях 1С, таких как 1С:Управление торговлей 11.5, 1С:ERP, 1С:УНФ 3.0, 1С:Розница 3.0. Мы увидим, что концепция значительно расширилась.
регистрам накопления
и строятся все количественные отчеты по номенклатуре. Ранее она часто называлась простоЕдиницаИзмерения.Упаковки или УпаковкиЕдиницыИзмерения. Это альтернативные единицы, которые позволяют учитывать товар в разных разрезах (например, штуки, коробки, паллеты) и использовать их в документах. Каждая упаковка имеет постоянный коэффициент пересчета, который связывает ее с базовой единицей хранения. Это позволяет системе автоматически пересчитывать количество между разными упаковками и базовой единицей. Упаковки могут поддерживать вложенность, что еще больше усложняет картину.Важно понимать, что реквизит ЕдиницаИзмерения в карточке номенклатуры в современных решениях часто является ссылкой на основной элемент из справочника УпаковкиЕдиницыИзмерения, который помечен как "Единица хранения".
Когда номенклатура уже участвовала в движениях, имеет остатки на складах, установленные цены или фигурирует в документах, прямое изменение базовой единицы измерения в карточке номенклатуры крайне не рекомендуется. Это может привести к рассогласованию данных, некорректным остаткам и ошибкам при проведении документов. Давайте рассмотрим рекомендуемый алгоритм действий, который позволит нам избежать этих проблем.
Начнем с создания нового элемента справочника Номенклатура. Присвоим ему новое наименование (например, "Товар А (кг)" вместо "Товар А (шт)"), новую артикул, если это необходимо, и, самое главное, укажем правильную базовую единицу измерения. При необходимости перенесем все характеристики, свойства и виды цен, которые были у старой номенклатуры.
Если по старой номенклатуре уже есть остатки на складах, их необходимо корректно перенести на новую номенклатуру. Для этого мы можем использовать различные документы:
Важно: Убедитесь, что все регистры (количественные, стоимостные) отражают перенос корректно. Проверьте себестоимость!
После переноса остатков нам нужно обновить все документы, где фигурировала старая номенклатура. Это могут быть:
Мы должны заменить ссылки на старую номенклатуру на новую. Для этого может пригодиться обработка "Групповое изменение реквизитов", о которой мы поговорим ниже.
Чтобы исключить дальнейшее использование старой номенклатуры и избежать ошибок, мы рекомендуем пометить ее как "неактивную" или, если это возможно и безопасно (нет ссылок в проведенных документах), удалить. Пометка на удаление — это более безопасный вариант.
После всех изменений мы обязательно должны сформировать ключевые отчеты (например, "Ведомость по товарам на складах", "Анализ себестоимости") и убедиться, что данные отображаются корректно в новой единице измерения, и нет расхождений в остатках.
Для массового изменения реквизитов, в том числе единицы измерения, в 1С предусмотрены мощные инструменты. Однако использовать их нужно с особой осторожностью.
В большинстве конфигураций 1С (например, в УТ 11, ERP) существует стандартная обработка Групповое изменение реквизитов. Найти ее можно через меню "Администрирование" - "Обслуживание" - "Корректировка данных" (или схожий путь).
Предупреждение: Перед использованием этой обработки мы настоятельно рекомендуем сделать полную резервную копию вашей информационной базы! Ошибки при групповом изменении могут быть катастрофическими.
Используя эту обработку, мы можем выбрать справочник Номенклатура, отобрать нужные элементы по определенным критериям и изменить реквизит ЕдиницаИзмерения на новый. При этом важно, чтобы новая единица измерения уже существовала в справочнике УпаковкиЕдиницыИзмерения и была привязана к соответствующему элементу ОКЕИ.
При программном изменении через код 1С мы сталкиваемся с тем, что реквизит ЕдиницаИзмерения в справочнике Номенклатура является ссылкой на элемент справочника КлассификаторЕдиницИзмерения (в старых конфах) или УпаковкиЕдиницыИзмерения (в новых). Важный момент, на который указывают в форумах, — это владелец единицы измерения.
В современных конфигурациях элемент справочника УпаковкиЕдиницыИзмерения может иметь владельца — номенклатуру, к которой он относится. Если мы пытаемся найти единицу измерения по коду, но не учитываем владельца, мы можем получить не ту единицу или вообще ничего не найти. Давайте посмотрим на пример, как можно искать и устанавливать единицу измерения, учитывая владельца:
// Предположим, у нас есть ссылка на элемент номенклатуры, которую нужно изменить
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоКоду("00001");
Если СсылкаНаНоменклатуру <> Неопределено Тогда
// Получаем объект номенклатуры для изменения
ОбъектНоменклатуры = СсылкаНаНоменклатуру.ПолучитьОбъект();
// Определяем, какую единицу измерения мы хотим установить
// Например, ищем "кг" из ОКЕИ
ЕдиницаИзмеренияДляУстановки = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");
// Или, если используем УпаковкиЕдиницыИзмерения, ищем по наименованию и владельцу
// В современных конфигурациях единицы могут быть индивидуальными для номенклатуры
// или общими. Предположим, мы хотим найти общую единицу "кг" или создать новую.
// Пример поиска в УпаковкиЕдиницыИзмерения, если они общие
ЕдиницаИзмеренияДляУстановкиНоваяКонфа = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("кг");
// Если "кг" не найдено как общая упаковка, возможно, нужно создать новую
// или использовать функцию, которая создает/находит упаковку для конкретной номенклатуры.
// Например, функция ВладелецУпаковкиЕдиницыИзмеренияНоменклатура (может быть внутренней)
// для определения, является ли номенклатура владельцем упаковки.
// В упрощенном примере, если ЕдиницаИзмерения - это ссылка на КлассификаторЕдиницИзмерения:
Если ЕдиницаИзмеренияДляУстановки <> Неопределено Тогда
ОбъектНоменклатуры.ЕдиницаИзмерения = ЕдиницаИзмеренияДляУстановки;
Попытка
ОбъектНоменклатуры.Записать();
Сообщить("Единица измерения для номенклатуры " + ОбъектНоменклатуры.Наименование + " успешно изменена.");
Исключение
Сообщить("Ошибка при записи номенклатуры: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Единица измерения 'кг' не найдена в классификаторе.");
КонецЕсли;
// В более сложной ситуации с УпаковкиЕдиницыИзмерения, мы бы работали с ними:
// Найдем или создадим нужную упаковку, например, "кг" с коэффициентом 1
// И установим ее как ЕдиницуХранения в ОбъектНоменклатуры.
// Это может быть сложная логика, включающая методы модуля менеджера справочника УпаковкиЕдиницыИзмерения.
КонецЕсли;
Важно: При программном изменении мы должны всегда проверять, нашлась ли единица измерения. Если ЕдиницаИзмеренияДляУстановки окажется Неопределено, попытка присвоить ее вызовет ошибку. Также, как мы уже говорили, мы должны учитывать, что реквизит ЕдиницаИзмерения должен быть связан с корректным элементом ОКЕИ.
Даже при самом тщательном подходе могут возникнуть ситуации, когда изменение единицы измерения не срабатывает или дает неожиданный результат. В таких случаях нам поможет отладчик.
Запустите 1С в режиме отладки (F5 или через меню "Отладка" - "Начать отладку"). Установите точки останова (F9) в критических местах вашего кода или обработки, где происходит поиск или установка единицы измерения. Например, перед строкой, где вы ищете единицу измерения, и перед строкой, где вы ее присваиваете.
// Точка останова здесь
ЕдиницаИзмеренияДляУстановки = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг");
// Шаг с заходом (F7) или Шаг через (F8)
Если ЕдиницаИзмемеренияДляУстановки <> Неопределено Тогда
ОбъектНоменклатуры.ЕдиницаИзмерения = ЕдиницаИзмеренияДляУстановки; // Точка останова здесь
ОбъектНоменклатуры.Записать();
КонецЕсли;
Когда выполнение программы достигнет точки останова, вы сможете:
F8 - шаг через, F7 - шаг с заходом).НайтиПоНаименованию). Возможно, наименование "кг" не совпадает с тем, что есть в справочнике, или есть дубли.Если ЕдиницаИзмеренияДляУстановки <> Неопределено Тогда.УпаковкиЕдиницыИзмерения и убедитесь, что вы ищете правильный элемент с учетом владельца или его отсутствия.Подводя итог, мы хотим дать несколько общих рекомендаций, которые помогут вам в работе с единицами измерения:
Мы рассмотрели проблему изменения единицы измерения номенклатуры в 1С со всех сторон. Помните, что главное — это понимание структуры данных и осторожность при внесении изменений. Следуя нашим рекомендациям, вы сможете избежать многих ошибок и обеспечить корректный учет в вашей системе 1С.
← К списку