При массовой обработке справочника Номенклатура разработчики нередко сталкиваются с задачей унификации единиц измерения. В типовых конфигурациях прошлых поколений, таких как «Торговля и Склад 7.7» или «Комплексная конфигурация 7.7», на форме карточки товара присутствует удобный флажок «Использовать только базовую единицу». Однако попытка обратиться к нему напрямую через код объекта приводит к ошибке: такого реквизита в структуре метаданных не существует. Разберем архитектурные причины такого поведения платформы и выясним, как решить задачу программно.
Проанализируем устройство формы элемента номенклатуры в конфигурации 1С 7.7. Флажок «Использовать только базовую единицу» не хранится в таблице базы данных как отдельное логическое поле. Он представляет собой визуальный элемент диалога (реквизит формы), предназначенный для управления интерфейсом:
ОсновнаяЕдиница со значением реквизита БазоваяЕдиница.Таким образом, прямое присвоение значения несуществующему реквизиту вроде Спр.ИспользоватьТолькоБазовуюЕдиницу = 1; вызовет ошибку времени выполнения «Поле агрегатного объекта не обнаружено». Чтобы флажок стал активным, необходимо изменить логику хранения связанных данных.
Посмотрим на пример правильного обхода справочника. Наша цель — присвоить реквизиту ОсновнаяЕдиница ссылку на значение из БазоваяЕдиница для каждого элемента, пропуская группы справочника.
СпрН = СоздатьОбъект("Справочник.Номенклатура");
СпрН.ВыбратьЭлементы();
Пока СпрН.ПолучитьЭлемент() = 1 Цикл
// Пропускаем группы справочника, так как единицы задаются только для элементов
Если СпрН.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
// Приравниваем основную единицу к базовой
СпрН.ОсновнаяЕдиница = СпрН.БазоваяЕдиница;
СпрН.Записать();
КонецЦикла;
После выполнения данного кода при открытии формы элемента флажок «Использовать только базовую единицу» будет автоматически отображаться установленным. При подборе позиций в документы по умолчанию также будет подставляться базовая единица измерения.
Разберем по шагам важные детали структуры данных, которые необходимо учитывать, если данные номенклатуры создаются «с нуля» внешней обработкой:
БазоваяЕдиница и ОсновнаяЕдиница ссылаются не на общероссийский классификатор единиц измерения (ОКЕИ), а на элементы подчиненного справочника Единицы.Владелец. Нельзя присвоить товару единицу измерения, созданную для другого товара. Это приведет к ошибкам валидации при проведении документов: «В подборе выбрана единица другого элемента справочника Номенклатура».Если базовая единица у товара еще не сформирована, корректный алгоритм создания выглядит следующим образом:
Номенклатура, чтобы получить ссылку на объект.Единицы создаем новый элемент, где в качестве владельца указываем записанную номенклатуру, коэффициент задаем равным 1, а ссылку на классификатор берем из справочника ОКЕИ. Сохраняем единицу.БазоваяЕдиница и ОсновнаяЕдиница номенклатуры и повторно вызываем метод Записать().Рассмотрим, как данная логика устроена в современных решениях линейки 1С:Предприятие 8 (таких как «1С:Управление торговлей», «1С:Комплексная автоматизация» или «1С:ERP»). В них подход к учету единиц измерения существенно переработан:
БазоваяЕдиницаИзмерения, ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов.Если требуется разово изменить единицы для большого массива данных без написания собственных обработок, выясним доступные штатные инструменты:
UChoice, которая позволяет массово перенести значение реквизита БазоваяЕдиница в реквизит ОсновнаяЕдиница.Попытки модифицировать данные напрямую через SQL-запросы или интерфейс ADO крайне не рекомендуются. Прямая запись в таблицы СУБД обходит встроенные триггеры платформы, не обновляет кэш метаданных и может нарушить ссылочную целостность базы данных.