В практической работе с конфигурацией «1С:Бухгалтерия предприятия 3.0» пользователи и программисты часто сталкиваются с задачей массового изменения или обнуления цен. Одной из неочевидных проблем становится очистка поля «Цена продажи», расположенного на вкладке «Основное» непосредственно в карточке элемента справочника Номенклатура.
Попытки решить этот вопрос «в лоб» — например, через стандартную обработку «Групповое изменение реквизитов» — не приносят успеха. Пользователи обнаруживают, что среди доступных реквизитов справочника Номенклатура просто нет поля «Цена продажи». В этой статье мы подробно разберем устройство хранения этих данных в системе, выясним причины такого поведения платформы и рассмотрим пошаговые сценарии полного обнуления цен как вручную, так и программными методами.
Для начала проанализируем архитектуру конфигурации. Поле «Цена продажи» в карточке номенклатуры — это виртуальное (динамическое) поле. Данные в него подтягиваются при открытии формы элемента из независимого регистра сведений ЦеныНоменклатурыДокументов. Именно поэтому стандартная групповая обработка реквизитов самого справочника здесь бессильна.
В этом регистре за хранение продажной цены отвечает запись со следующей комбинацией ключевых полей:
По продажным ценам (элемент перечисления СпособыЗаполненияЦен.ПоПродажнымЦенам);Таким образом, чтобы обнулить цену в карточке товара, нам нужно не перезаписывать сам элемент справочника, а корректно удалить или очистить соответствующие записи в регистре сведений ЦеныНоменклатурыДокументов.
Если перед нами стоит задача быстро очистить цены без написания программного кода, мы можем сделать это напрямую через интерфейс платформы 1С:Предприятие. Рассмотрим этот процесс по шагам:
Цены номенклатуры документов (системное имя — ЦеныНоменклатурыДокументов).Способ заполнения цены Равно По продажным ценам.Ctrl + A.Delete (или выберем пункт «Удалить» в контекстном меню правой кнопки мыши).После удаления этих записей поле «Цена продажи» во всех карточках товаров автоматически станет пустым (или равным нулю), что и требовалось получить.
Если задачу необходимо решить в рамках автоматизации (например, при написании внешней обработки перехода на новую систему ценообразования), нам потребуется использовать встроенный язык 1С. Разберем программную логику решения.
С точки зрения платформы 1С, правильным подходом является не просто запись значения «0» в ресурс регистра, а полное удаление соответствующих записей. Это вернет форму карточки номенклатуры к исходному «чистому» состоянию.
Для начала посмотрим на пример запроса, с помощью которого мы можем выбрать из базы данных всю номенклатуру, у которой заполнена и не равна нулю продажная цена:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыДокументов.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыДокументов.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатурыДокументов КАК ЦеныНоменклатурыДокументов
|ГДЕ
| ЦеныНоменклатурыДокументов.СпособЗаполненияЦены = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияЦен.ПоПродажнымЦенам)
| И ЦеныНоменклатурыДокументов.Цена <> 0";
РезультатЗапроса = Запрос.Выполнить();
Если стоит задача полностью очистить абсолютно все продажные цены в информационной базе, наиболее быстрым и производительным методом будет запись пустого набора записей с установленным отбором. При таком подходе система мгновенно очистит таблицу на уровне СУБД:
// Создаем объект набора записей для целевого регистра
НаборЗаписей = РегистрыСведений.ЦеныНоменклатурыДокументов.СоздатьНаборЗаписей();
// Устанавливаем жесткий отбор по способу заполнения, чтобы не задеть другие типы цен
НаборЗаписей.Отбор.СпособЗаполненияЦены.Установить(Перечисления.СпособыЗаполненияЦен.ПоПродажнымЦенам);
// Записываем пустой набор с флагом Замещение = Истина
НаборЗаписей.Записать(Истина);
В случаях, когда требуется выборочная очистка (например, только для определенной группы товаров или по конкретному списку позиций), мы должны использовать менеджер записи для точечного удаления данных в цикле. Рассмотрим пример такого кода:
// МассивНоменклатуры - предварительно заполненный массив со ссылками на очищаемые товары
Для Каждого Товар Ссылка Из МассивНоменклатуры Цикл
МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатурыДокументов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = Товар Ссылка;
МенеджерЗаписи.СпособЗаполненияЦены = Перечисления.СпособыЗаполненияЦен.ПоПродажнымЦенам;
// Пытаемся удалить запись из базы данных
МенеджерЗаписи.Удалить();
КонецЦикла;
Естественным опасением любого бухгалтера или разработчика при очистке регистров является вопрос сохранности исторических данных в документах. Повлияет ли очистка регистра ЦеныНоменклатурыДокументов на ранее проведенные накладные, счета и акты?
Ответ однозначный: нет, не повлияет. При проведении документов продажи (например, Реализация товаров и услуг или Счет покупателю) физические цены жестко записываются непосредственно в табличные части этих документов. Очистка регистра сведений повлияет исключительно на то, какие цены будут автоматически подставляться при создании новых документов с текущего момента.
Также важно понимать разницу между двумя ключевыми регистрами сведений в программе:
ЦеныНоменклатуры — периодический регистр. Он хранит историю цен, установленных официальными документами Установка цен номенклатуры. Эти цены привязаны к конкретным типам цен (например, «Оптовая», «Розничная», «Дистрибьюторская»). Программа обращается к этому регистру в первую очередь, если в договоре контрагента или в самом документе продажи явно указан тип цен. Данные из этого регистра обладают наивысшим приоритетом заполнения.ЦеныНоменклатурыДокументов — непериодический вспомогательный регистр. Он используется для быстрого заполнения цен «из карточки» или на основе простых розничных продаж, когда полноценный учет по типам цен в компании не ведется.На поведение системы при автозаполнении новых документов также влияет настройка, расположенная по пути: «Администрирование» — «Параметры учета» — «Заполнение цен продажи». Проанализируем два ее режима:
ЦеныНоменклатурыДокументов. Если мы успешно очистили этот регистр методами, описанными выше, то цена в новых документах по умолчанию будет заполняться как «0» (или останется пустой), требуя ручного ввода или использования механизма прайс-листов.Таким образом, очистка регистра сведений ЦеныНоменклатурыДокументов является безопасной и штатной процедурой, позволяющей навести порядок в справочнике номенклатуры и подготовить базу данных к переходу на профессиональный учет цен с помощью документов установки цен.