Как изменить базовую единицу измерения и единицу хранения остатков при наличии движений в 1С

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

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

Почему 1С запрещает менять единицы измерения «на лету»

Рассмотрим внутреннюю механику работы платформы. В регистрах накопления (остатки товаров, продажи, закупки) количество товара всегда хранится в базовых единицах. Если в карточке товара «Тонны» заменить на «Килограммы» простым исправлением текста, возникнет катастрофическая ошибка. Например, если на складе числилось 2 тонны, после замены единицы система будет считать, что на остатке 2 килограмма. Стоимость при этом останется прежней, что приведет к искажению себестоимости в тысячу раз. Именно поэтому штатные средства конфигураций «Управление торговлей» или «Бухгалтерия» блокируют поле единицы измерения сразу после записи первого документа.

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

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

  1. Отбор номенклатуры: Выбираем позиции, у которых необходимо заменить «Тонны» на «Килограммы». Удобнее всего собрать их в таблицу с возможностью пометки (чекбоксами).
  2. Подготовка справочников: Проверяем наличие нужной единицы (кг) в подчиненном справочнике ЕдиницыИзмерения. Если ее нет — создаем программно или вручную.
  3. Поиск ссылок: Находим все документы, в которых участвует данная номенклатура. Важно учитывать не только складские документы, но и заказы, счета и установки цен.
  4. Снятие с проведения: Программно отменяем проведение всех найденных документов. Это «очистит» регистры от старых данных в тоннах.
  5. Замена реквизитов: В карточке номенклатуры меняем БазоваяЕдиницаИзмерения и ЕдиницаХраненияОстатков. Чтобы обойти блокировку, программисты используют свойство ОбменДанными.Загрузка = Истина.
  6. Пересчет количественных показателей: Проходим по табличным частям всех документов. Если в документе было количество 0.005 (тонн), его нужно умножить на коэффициент (1000) и записать 5 (кг).
  7. Восстановление цен: Корректируем записи в регистре сведений ЦеныНоменклатуры, чтобы цена за 1 кг соответствовала новой реальности.
  8. Перепроведение: Возвращаем документы в проведенное состояние.

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

Способ 2: Использование технического хака (только для опытных программистов)

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


// Пример программного изменения единицы
ОбъектНоменклатура = ВыбраннаяСсылка.ПолучитьОбъект();
ОбъектНоменклатура.ОбменДанными.Загрузка = Истина; 
ОбъектНоменклатура.БазоваяЕдиницаИзмерения = НоваяЕдиницаСсылка;
ОбъектНоменклатура.ЕдиницаХраненияОстатков = НоваяЕдиницаСсылка;
ОбъектНоменклатура.Записать();

Внимание: Использование ОбменДанными.Загрузка = Истина отключает только проверку в самой карточке. После этого необходимо выполнить прямой запрос к базе данных (SQL) или использовать специализированные обработки для пересчета ресурсов во всех регистрах накопления. Без этого отчеты «Ведомость по товарам на складах» покажут неверные остатки.

Способ 3: Безопасный «бухгалтерский» метод через инвентаризацию

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

  1. Создаем новую карточку номенклатуры с правильными единицами измерения (например, «Болт (кг)» вместо старого «Болт (т)»).
  2. В текущем периоде создаем документ «Списание товаров» для старой карточки (в тоннах).
  3. Одновременно создаем документ «Оприходование товаров» для новой карточки (в килограммах), указав корректное количество и себестоимость.
  4. Старую карточку помечаем на удаление или добавляем префикс «НЕ ИСПОЛЬЗОВАТЬ» в наименование.

Этот метод сохраняет историю операций в старых периодах в неизменном виде и позволяет начать «чистый» учет с новой даты.

Нюансы работы в 1С 7.7 (Торговля и Склад)

В старых версиях системы, таких как ТиС 7.7, проблема часто усугубляется «слетающими» единицами. Проанализируем причину: это происходит из-за удаления записей в подчиненном справочнике при сохранении ссылок в основной карточке. Посмотрим на решение: необходимо восстановить соответствие идентификаторов в DBF-таблицах или через встроенный язык, проверив целостность индексов. Если вы планируете перенос из 7.7 в 8.3, лучше заранее привести единицы к нужному виду еще в старой базе, чтобы избежать трудоемкой корректировки после миграции.

Рекомендации по предотвращению ошибок

Чтобы в будущем не сталкиваться с необходимостью массового пересчета остатков, рекомендуем придерживаться следующих правил:

Подводя итог, отметим, что штатных средств для «бесшовного» изменения базовой единицы с автоматическим пересчетом всех прошлых документов в 1С 10.3 и 11.x не существует. Выбор стоит между написанием сложной обработки для пересчета движений или организационным решением через создание новых карточек товаров.

← На главную