Как в 1С программно установить флажок Использовать только базовую единицу в справочнике Номенклатура

Программист 1С v7.7 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При массовой обработке справочника Номенклатура разработчики нередко сталкиваются с задачей унификации единиц измерения. В типовых конфигурациях прошлых поколений, таких как «Торговля и Склад 7.7» или «Комплексная конфигурация 7.7», на форме карточки товара присутствует удобный флажок «Использовать только базовую единицу». Однако попытка обратиться к нему напрямую через код объекта приводит к ошибке: такого реквизита в структуре метаданных не существует. Разберем архитектурные причины такого поведения платформы и выясним, как решить задачу программно.

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

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

  1. При открытии карточки номенклатуры модуль формы программно проверяет условие: совпадает ли значение реквизита ОсновнаяЕдиница со значением реквизита БазоваяЕдиница.
  2. Если единицы совпадают, интерфейсный флажок выставляется в положение «включено», а поле выбора основной единицы измерения блокируется или скрывается.
  3. Если пользователь вручную выбирает другую основную единицу (например, упаковку или коробку), флажок автоматически снимается.

Таким образом, прямое присвоение значения несуществующему реквизиту вроде Спр.ИспользоватьТолькоБазовуюЕдиницу = 1; вызовет ошибку времени выполнения «Поле агрегатного объекта не обнаружено». Чтобы флажок стал активным, необходимо изменить логику хранения связанных данных.

Программное решение на платформе 1С 7.7

Посмотрим на пример правильного обхода справочника. Наша цель — присвоить реквизиту ОсновнаяЕдиница ссылку на значение из БазоваяЕдиница для каждого элемента, пропуская группы справочника.


СпрН = СоздатьОбъект("Справочник.Номенклатура");
СпрН.ВыбратьЭлементы();

Пока СпрН.ПолучитьЭлемент() = 1 Цикл
    // Пропускаем группы справочника, так как единицы задаются только для элементов
    Если СпрН.ЭтоГруппа() = 1 Тогда
        Продолжить;
    КонецЕсли;

    // Приравниваем основную единицу к базовой
    СпрН.ОсновнаяЕдиница = СпрН.БазоваяЕдиница;
    СпрН.Записать();
КонецЦикла;

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

Критические нюансы и подводные камни при работе со справочником Единицы

Разберем по шагам важные детали структуры данных, которые необходимо учитывать, если данные номенклатуры создаются «с нуля» внешней обработкой:

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

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

  1. Создаем и записываем элемент справочника Номенклатура, чтобы получить ссылку на объект.
  2. В подчиненном справочнике Единицы создаем новый элемент, где в качестве владельца указываем записанную номенклатуру, коэффициент задаем равным 1, а ссылку на классификатор берем из справочника ОКЕИ. Сохраняем единицу.
  3. Присваиваем созданную подчиненную единицу реквизитам БазоваяЕдиница и ОсновнаяЕдиница номенклатуры и повторно вызываем метод Записать().

Различия концепции в современных конфигурациях 1С 8

Рассмотрим, как данная логика устроена в современных решениях линейки 1С:Предприятие 8 (таких как «1С:Управление торговлей», «1С:Комплексная автоматизация» или «1С:ERP»). В них подход к учету единиц измерения существенно переработан:

  1. В конфигурациях поколения обычных форм (УТ 10.3, УПП 1.3) визуального флага также нет, а учет разделяется реквизитами БазоваяЕдиницаИзмерения, ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов.
  2. В конфигурациях на управляемых формах (УТ 11, КА 2, ERP) единицы задаются через Индивидуальные наборы упаковок либо отключение использования упаковок для конкретного вида номенклатуры. Если для вида номенклатуры упаковки отключены, система жестко ведет учет исключительно в базовой единице хранения.

Альтернативные способы без изменения исходного кода

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

  1. В среде 1С 7.7 рекомендуется использовать типовую сервисную обработку «Групповая обработка справочников» или универсальную обработку UChoice, которая позволяет массово перенести значение реквизита БазоваяЕдиница в реквизит ОсновнаяЕдиница.
  2. В среде 1С 8 для массовых корректировок используется штатная обработка «Групповое изменение реквизитов», доступная администратору в панели поддержки и обслуживания.

Попытки модифицировать данные напрямую через SQL-запросы или интерфейс ADO крайне не рекомендуются. Прямая запись в таблицы СУБД обходит встроенные триггеры платформы, не обновляет кэш метаданных и может нарушить ссылочную целостность базы данных.

← На главную