Как обнулить и очистить цену продажи в карточке номенклатуры в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

В практической работе с конфигурацией «1С:Бухгалтерия предприятия 3.0» пользователи и программисты часто сталкиваются с задачей массового изменения или обнуления цен. Одной из неочевидных проблем становится очистка поля «Цена продажи», расположенного на вкладке «Основное» непосредственно в карточке элемента справочника Номенклатура.

Попытки решить этот вопрос «в лоб» — например, через стандартную обработку «Групповое изменение реквизитов» — не приносят успеха. Пользователи обнаруживают, что среди доступных реквизитов справочника Номенклатура просто нет поля «Цена продажи». В этой статье мы подробно разберем устройство хранения этих данных в системе, выясним причины такого поведения платформы и рассмотрим пошаговые сценарии полного обнуления цен как вручную, так и программными методами.

Выясняем причину: где физически хранится «Цена продажи»?

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

В этом регистре за хранение продажной цены отвечает запись со следующей комбинацией ключевых полей:

Таким образом, чтобы обнулить цену в карточке товара, нам нужно не перезаписывать сам элемент справочника, а корректно удалить или очистить соответствующие записи в регистре сведений ЦеныНоменклатурыДокументов.

Способ 1. Быстрое обнуление цен вручную (без программирования)

Если перед нами стоит задача быстро очистить цены без написания программного кода, мы можем сделать это напрямую через интерфейс платформы 1С:Предприятие. Рассмотрим этот процесс по шагам:

  1. Откроем главное меню программы в правом верхнем углу экрана и перейдем в раздел «Функции для технического специалиста» (в предыдущих версиях платформы этот пункт назывался «Все функции»). Если этот пункт у вас не отображается, его необходимо предварительно включить в настройках параметров системы («Настройки» — «Параметры» — флаг «Режим технического специалиста»).
  2. В появившемся окне дерева объектов раскроем ветку «Регистры сведений».
  3. Найдем в списке и откроем регистр сведений Цены номенклатуры документов (системное имя — ЦеныНоменклатурыДокументов).
  4. Перед удалением записей обязательно установим отбор, чтобы случайно не стереть другие важные данные (например, закупочные цены). Для этого нажмем кнопку настроек списка или кнопку «Еще» — «Настроить список». В условиях отбора укажем: Способ заполнения цены Равно По продажным ценам.
  5. После применения отбора в табличной части останутся только те записи, которые отвечают за вывод цен продажи в карточках товаров. Выделим все строки списка с помощью комбинации клавиш Ctrl + A.
  6. Нажмем клавишу Delete (или выберем пункт «Удалить» в контекстном меню правой кнопки мыши).

После удаления этих записей поле «Цена продажи» во всех карточках товаров автоматически станет пустым (или равным нулю), что и требовалось получить.

Способ 2. Программное обнуление цен (для разработчиков)

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

С точки зрения платформы 1С, правильным подходом является не просто запись значения «0» в ресурс регистра, а полное удаление соответствующих записей. Это вернет форму карточки номенклатуры к исходному «чистому» состоянию.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЦеныНоменклатурыДокументов.Номенклатура КАК Номенклатура,
    |	ЦеныНоменклатурыДокументов.Цена КАК Цена
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатурыДокументов КАК ЦеныНоменклатурыДокументов
    |ГДЕ
    |	ЦеныНоменклатурыДокументов.СпособЗаполненияЦены = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияЦен.ПоПродажнымЦенам)
    |	И ЦеныНоменклатурыДокументов.Цена <> 0";

РезультатЗапроса = Запрос.Выполнить();

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


// Создаем объект набора записей для целевого регистра
НаборЗаписей = РегистрыСведений.ЦеныНоменклатурыДокументов.СоздатьНаборЗаписей();

// Устанавливаем жесткий отбор по способу заполнения, чтобы не задеть другие типы цен
НаборЗаписей.Отбор.СпособЗаполненияЦены.Установить(Перечисления.СпособыЗаполненияЦен.ПоПродажнымЦенам);

// Записываем пустой набор с флагом Замещение = Истина
НаборЗаписей.Записать(Истина); 

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


// МассивНоменклатуры - предварительно заполненный массив со ссылками на очищаемые товары
Для Каждого Товар Ссылка Из МассивНоменклатуры Цикл
    МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатурыДокументов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Номенклатура = Товар Ссылка;
    МенеджерЗаписи.СпособЗаполненияЦены = Перечисления.СпособыЗаполненияЦен.ПоПродажнымЦенам;
    
    // Пытаемся удалить запись из базы данных
    МенеджерЗаписи.Удалить();
КонецЦикла;

Влияние очистки регистра на документы и ценообразование

Естественным опасением любого бухгалтера или разработчика при очистке регистров является вопрос сохранности исторических данных в документах. Повлияет ли очистка регистра ЦеныНоменклатурыДокументов на ранее проведенные накладные, счета и акты?

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

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

На поведение системы при автозаполнении новых документов также влияет настройка, расположенная по пути: «Администрирование» — «Параметры учета» — «Заполнение цен продажи». Проанализируем два ее режима:

  1. Из карточки номенклатуры: при выборе этого варианта система при создании нового документа ищет значение в рассмотренном нами регистре ЦеныНоменклатурыДокументов. Если мы успешно очистили этот регистр методами, описанными выше, то цена в новых документах по умолчанию будет заполняться как «0» (или останется пустой), требуя ручного ввода или использования механизма прайс-листов.
  2. Из предыдущего документа: при такой настройке программа будет игнорировать пустоту в карточке номенклатуры и попытается найти последнюю цену реализации конкретному контрагенту в его прошлых проведенных документах.

Таким образом, очистка регистра сведений ЦеныНоменклатурыДокументов является безопасной и штатной процедурой, позволяющей навести порядок в справочнике номенклатуры и подготовить базу данных к переходу на профессиональный учет цен с помощью документов установки цен.

← На главную