Документ «Установка цен номенклатуры»
Документ массово задаёт отпускные цены номенклатуры (по типу цен) и фиксирует их в периодическом регистре сведений ЦеныНоменклатуры — никаких бухгалтерских проводок он не делает. Из этого регистра цены потом подставляются в счета, реализацию и прайс-листы на дату документа.
🎯 Что это и зачем
Чтобы при выписке счёта или реализации цена подставлялась сама, её надо где-то хранить. «Установка цен номенклатуры» — это документ-прайс: вы задаёте для организации и выбранного типа цен (Розничная, Оптовая, Закупочная, …) список позиций с ценами, проводите — и система запоминает, что «с такой-то даты для такого-то типа цен товар стоит столько-то».
Документ решает повседневные задачи ценообразования: - плановый пересмотр прайс-листа (сезон, акция, индексация); - установка розничных цен на основании поступления (закупочная цена + наценка); - массовая загрузка прайса поставщика из файла Excel; - копирование действующих цен с последующей корректировкой (например, «+10 % ко всем»).
Кто работает: специалисты по ценообразованию, менеджеры по закупкам/продажам, бухгалтер. Периодичность — по мере изменения цен (от ежедневно в рознице до раз в квартал).
ЦеныНоменклатуры. Подробнее см. [Часть 2 → Движения](#движения--куда-документ-пишет-данные).🧭 Где найти в программе
Раздел «Номенклатура и склад» → пункт «Установка цен номенклатуры» (рядом со справочниками «Номенклатура» и «Склады»). Откроется журнал документов; новый создаём кнопкой «Создать». Документ также вызывается из карточки Поступления товаров и услуг командой «Создать на основании».
navigation-map.json объекта Документ.УстановкаЦенНоменклатуры нет — точный путь во Fresh не зафиксирован. Раздел указан как «Номенклатура и склад» по аналогии с соседними объектами (Справочник.Номенклатура, Справочник.Склады маршрутизируются именно туда), а разбор objects/ упоминает альтернативный вход через «Справочники»/«Продажа». Перед публикацией проверьте реальное расположение пункта меню в целевой базе и допишите маршрут в navigation-map.json.👤 Часть 1. Для пользователя
Проходим по шагам: от пустого документа до проведённого прайса и проверки записанных цен.
Урок 1. Прайс-лист вручную
Когда: плановый пересмотр цен, сезонные изменения, маркетинговая акция.
Шаг 1. Создаём документ
Раздел «Номенклатура и склад» → «Установка цен номенклатуры» → «Создать».
Шаг 2. Заполняем шапку
- Организация — подставится основная или выбираем вручную (обязательно).
- Тип цен — для какого вида цен задаём значения: Розничная, Оптовая, Закупочная и т. д. (обязательно). Один документ = один тип цен на все строки.
- Структурное подразделение — необязательно; склад/магазин, для которого пересматриваем цены (см. предупреждение ниже).
ЦеныНоменклатуры хранит цену в разрезе Организация + Тип цен + Номенклатура, без подразделения (проверено по коду релиза 3.0.72.1). Поэтому разные цены для разных магазинов через это поле получить нельзя — для этого заводят разные типы цен. Подразделение тут — справочный реквизит. См. [несостыковку KZ30-UCN-0002](#несостыковка-kz30-ucn-0002).Шаг 3. Заполняем товары
Табличная часть Товары — главное в документе. Способы наполнения: - Подбор — выбрать позиции из справочника номенклатуры и проставить цены. - Добавить строку вручную: Номенклатура → Цена → Валюта. - кнопки группового заполнения (по ценам, по себестоимости, по поступлению, из файла) — см. Уроки 2–4.
Шаг 4. Проводим
«Провести» или «Записать и закрыть». После проведения цены попадают в регистр и начинают подставляться в документы продажи на дату этого документа.
ЦеныНоменклатуры) либо создайте тестовый счёт/реализацию и посмотрите, какая цена подставилась.Урок 2. Цены на основании поступления
Когда: оприходовали товар и хотим сразу выставить отпускную цену (закупка + наценка).
- Откройте проведённый документ Поступление товаров и услуг.
- «Создать на основании» → «Установка цен номенклатуры».
- Система заполнит: Документ-основание (ссылку на поступление), Организацию и табличную часть Товары строками из поступления.
- Укажите/проверьте Тип цен и проставьте наценку (скорректируйте цены вручную или групповым изменением).
- Записать и провести.
Цена * 1.30). Базовой автонаценки «из коробки» в документе нет — процент задаёте сами.Урок 3. Заполнение по действующим ценам и по себестоимости
Чтобы не вводить заново, табличную часть можно наполнить расчётно:
- По ценам номенклатуры — копирует действующие цены выбранного типа на указанную дату. Удобно для индексации: заполнили текущим прайсом → подняли всё на N %.
- По себестоимости номенклатуры — берёт себестоимость остатков (на дату документа) и от неё считаем цену с наценкой. Если по позиции нет остатка/себестоимости — строка не добавится.
Варианты команд (важно не перепутать): - Заполнить… — очищает таблицу и заполняет заново; - Добавить… — дописывает строки к уже введённым; - Обновить… — обновляет цену у уже добавленных позиций, не добавляя новых.
Урок 4. Загрузка прайса из файла
Когда: поставщик прислал прайс таблицей.
- Создайте документ, заполните шапку.
- «Загрузить из файла» → выберите Excel (колонки вида Артикул/Наименование/Цена/Валюта).
- Система сопоставит строки файла с номенклатурой по артикулу/наименованию. При неоднозначности предложит выбрать нужную позицию из списка совпадений.
- Несопоставленные строки останутся помеченными — заведите номенклатуру или уточните соответствие вручную.
- Записать и провести.
Товары.Цена формулой, затем перепровести — пригодится для разовой индексации сразу по пачке прайсов.🛠 Часть 2. Для программиста
Источник: реальный код релиза 3.0.72.1 — Documents/УстановкаЦенНоменклатуры/Ext/ObjectModule.bsl (модуль маленький, разобран целиком) и …/Ext/ManagerModule.bsl (процедуры проведения и печати), плюс разбор objects/ и business-logic/.
Структура объекта
Реквизиты шапки:
| Реквизит | Тип | Обязательность | Назначение |
|---|---|---|---|
Организация |
СправочникСсылка.Организации | ShowError | Владелец прайса; пишется в регистр. |
ТипЦен |
СправочникСсылка.ТипыЦенНоменклатуры | ShowError | Вид цены; один на весь документ; пишется в регистр. |
СтруктурноеПодразделение |
СправочникСсылка.ПодразделенияОрганизаций | DontCheck | Справочный реквизит. В регистр не пишется (см. ниже). |
ДокументОснование |
ДокументСсылка.ПоступлениеТоваровУслуг | DontCheck | Ссылка на поступление при вводе «на основании». |
РучнаяКорректировка |
Булево | DontCheck | Истина → авто-движения не формируются (ручная правка регистра). |
НеПроводитьНулевыеЗначения |
Булево | DontCheck | Исключает строки с Цена = 0 из движений. |
Ответственный, Автор |
СправочникСсылка.Пользователи | DontCheck | Аудит. |
Комментарий |
Строка | DontCheck | Произвольный текст. |
УдалитьИнформация |
Строка | DontCheck | Устаревший реквизит (префикс «Удалить»), в логике не используется. |
Табличная часть Товары: Номенклатура (СправочникСсылка.Номенклатура), Цена (Число), Валюта (СправочникСсылка.Валюты). Только эти три поля участвуют в проведении.
Формы: ФормаДокумента (основная, с командами заполнения и загрузки), ФормаСписка (журнал + «Изменить выделенные»), ФормаВыбора.
Жизненный цикл (обработчики ObjectModule)
ObjectModule.bsl целиком обёрнут в #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение. Обработчиков всего три:
| Обработчик | Строк | Что делает |
|---|---|---|
ОбработкаЗаполнения |
~14 | Если основание — ДокументСсылка.ПоступлениеТоваровУслуг, вызывает ЗаполнитьПоДокументуОснования; если пришла Структура — ЗаполнитьЗначенияСвойств (с удалением ключа Автор). В конце всегда — ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(...). |
ПриКопировании |
2 | ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(...) — восстанавливает валюту регламентированного учёта и шапку при копировании. |
ОбработкаПроведения |
~17 | Готовит наборы записей, при РучнаяКорректировка выходит, иначе формирует движения по ЦеныНоменклатуры (разбор ниже). |
Плюс служебная экспортная процедура ЗаполнитьПоДокументуОснования(Основание) — она же присваивает ДокументОснование = Основание.
ObjectModule НЕТ. Нет ОбработкаПроверкиЗаполнения — обязательность Организация/ТипЦен обеспечивается только флагом ShowError метаданных (платформенная проверка). Никакой прикладной проверки дублей номенклатуры или неотрицательности цены в модуле объекта нет (вопреки тому, что предполагает разбор objects/). Если такие проверки нужны — они должны жить в модуле формы, а не здесь.Как формируется проведение — реальный код (3.0.72.1)
Главное правило конфигурации соблюдено и здесь: движения формирует не сам документ, а модуль менеджера. ОбработкаПроведения лишь оркеструет.
Источник: ObjectModule.bsl, процедура ОбработкаПроведения (целиком):
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ПОДГОТОВКА ПРОВЕДЕНИЯ ПО ДАННЫМ ДОКУМЕНТА
ПроведениеСервер.ПодготовитьНаборыЗаписейКПроведению(ЭтотОбъект);
Если РучнаяКорректировка Тогда
Возврат;
КонецЕсли;
ПараметрыПроведения = Документы.УстановкаЦенНоменклатуры.ПодготовитьПараметрыПроведения(Ссылка, Отказ);
Если Отказ Тогда
Возврат;
КонецЕсли;
// ФОРМИРОВАНИЕ ДВИЖЕНИЙ
Документы.УстановкаЦенНоменклатуры.СформироватьДвиженияУстановкаЦен(ПараметрыПроведения.ТаблицаТовары,
ПараметрыПроведения.ТаблицаРеквизитов, Движения, Отказ);
КонецПроцедуры
Разбор по строкам:
1. ПодготовитьНаборыЗаписейКПроведению(ЭтотОбъект) вызывается всегда, до проверки РучнаяКорректировка — наборы записей подготавливаются в любом случае.
2. Если РучнаяКорректировка ... Возврат — в режиме ручной корректировки автоформирование пропускается; движения регистра заполняет пользователь.
3. ПодготовитьПараметрыПроведения(Ссылка, Отказ) (ManagerModule) одним пакетом запросов вытаскивает реквизиты документа (Период=Дата, Организация, ТипЦен, НеПроводитьНулевыеЗначения) и табличную часть Товары. Именно здесь работает фильтр нулей — в тексте запроса: И НЕ(&НеПроводитьНулевыеЗначения И ТаблицаТовары.Цена = 0).
4. СформироватьДвиженияУстановкаЦен(...) раскладывает строки в набор записей регистра.
Ключевая процедура движений (ManagerModule, СформироватьДвиженияУстановкаЦен, стр. 271, целиком):
Процедура СформироватьДвиженияУстановкаЦен(Таблица, ТаблицаРеквизитов, Движения, Отказ) Экспорт
Если Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Реквизиты = ТаблицаРеквизитов[0];
Для каждого СтрокаТовара Из Таблица Цикл
Движение = Движения.ЦеныНоменклатуры.Добавить();
Движение.Период = Реквизиты.Период;
Движение.ТипЦен = Реквизиты.ТипЦен;
Движение.Организация = Реквизиты.Организация;
Движение.Номенклатура = СтрокаТовара.Номенклатура;
Движение.Цена = СтрокаТовара.Цена;
Движение.Валюта = СтрокаТовара.Валюта;
КонецЦикла;
Движения.ЦеныНоменклатуры.Записывать = Истина;
КонецПроцедуры
Отсюда видно точную «форму» записи регистра — см. таблицу движений ниже.
Движения — куда документ пишет данные
Бухгалтерских проводок документ не делает: в регистрах бухгалтерии (Типовой, Налоговый) движений нет, по складу (ТоварыОрганизацийБУ) — тоже. Единственный приёмник:
| Регистр | Вид | Что пишет |
|---|---|---|
РегистрСведений.ЦеныНоменклатуры |
Периодический регистр сведений (период = Дата документа), подчинён регистратору |
По строке на каждую позицию Товары |
Структура записи (по факту кода):
| Поле регистра | Источник | Роль |
|---|---|---|
Период |
Дата документа |
период (на эту дату действует цена) |
ТипЦен |
шапка ТипЦен |
измерение |
Организация |
шапка Организация |
измерение |
Номенклатура |
строка Товары.Номенклатура |
измерение |
Цена |
строка Товары.Цена |
ресурс |
Валюта |
строка Товары.Валюта |
ресурс |
objects/ указывает среди измерений регистра Подразделение (из шапки СтруктурноеПодразделение). В реальном коде 3.0.72.1 этого нет: ТекстЗапросаРеквизитыДокумента() не выбирает подразделение, а СформироватьДвиженияУстановкаЦен его не присваивает. Цена хранится в разрезе Организация + Тип цен + Номенклатура. Дифференциация цен по подразделениям через это поле невозможна — для этого используют отдельные типы цен. Источник истины — ManagerModule.bsl.objects/ описывает ОбработкаПроведения так, будто ПодготовитьНаборыЗаписейКПроведению вызывается под условием РучнаяКорректировка = Ложь. В реальном коде порядок обратный: подготовка наборов идёт безусловно, и лишь затем — Если РучнаяКорректировка Тогда Возврат. Источник истины — ObjectModule.bsl.Валидации
- Платформенные (ShowError):
Организация,ТипЦен— без них документ не записать. ПрикладногоОбработкаПроверкиЗаполнениявObjectModuleнет. - Фильтр нулей: не валидация, а отбор на проведении — при
НеПроводитьНулевыеЗначения = Истинастроки сЦена = 0не попадают в регистр (фильтр в тексте запросаПодготовитьПараметрыПроведения). - Пустая таблица:
СформироватьДвиженияУстановкаЦенприТаблица.Количество() = 0просто выходит — проведение пустого документа не ошибка, но и записей не создаёт. - Дубли номенклатуры / отрицательная цена: в коде модуля объекта/менеджера явных проверок нет. Контроль — на стороне пользователя/формы.
Зависимости (общие модули)
| Модуль | Зачем |
|---|---|
Документы.УстановкаЦенНоменклатуры (ManagerModule) |
ПодготовитьПараметрыПроведения, СформироватьДвиженияУстановкаЦен, ЗаполнитьДокументПоПоступлению, печать |
ПроведениеСервер |
ПодготовитьНаборыЗаписейКПроведению |
ЗаполнениеДокументов |
ЗаполнитьШапкуДокумента (заполнение/копирование) |
ОбщегоНазначенияБКВызовСервераПовтИсп |
ПолучитьВалютуРегламентированногоУчета |
ОбщегоНазначенияБКВызовСервера |
ТекстРазделителяЗапросовПакета (пакетные запросы менеджера) |
УправлениеПечатью |
печать макета «Перечень цен» (ManagerModule) |
Связи объекта: основание — Документ.ПоступлениеТоваровУслуг (через ЗаполнитьДокументПоПоступлению, ~121 стр. в ManagerModule). На основании самого документа ничего не создаётся — он конечное звено: данные дальше живут в регистре ЦеныНоменклатуры и читаются документами продажи. Печатная форма — макет «ПереченьЦен» (регистрируется ДобавитьКомандыПечати, выводится обработчиком Печать).
- «Цена не подставляется в счёт/реализацию» — почти всегда дело не в этом документе, а в связке: (1) задан ли в договоре/настройках покупателя нужный тип цен; (2) есть ли запись в
ЦеныНоменклатурыдля пары организация + тип цен + номенклатура на дату продажи; (3) совпадает ли валюта. Проверяйте именно регистр на дату.- «Нужны разные цены по магазинам» — поле
СтруктурноеПодразделениетут не поможет (в регистр не пишется). Решение — отдельные типы цен под точки продаж.- Бухгалтерия не сходится из-за этого документа — не сходится не может: проводок он не делает. Если в ОСВ что-то «не так», источник — документы продажи/поступления, а не прайс.
- Простая версия конфигурации блокирует у документа
Дату/Номери реквизитНеПроводитьНулевыеЗначения(см.ПолучитьБлокируемыеРеквизитыОбъектав ManagerModule) — учитывайте при доработках и инструктаже.
- Хотите перехватить/расширить запись цен — точка входа одна:
Документы.УстановкаЦенНоменклатуры.СформироватьДвиженияУстановкаЦен. Документ туда только делегирует.РучнаяКорректировка = Истинаполностью отключает автоформирование (раннийВозврат) — движения регистра тогда на совести пользователя.- Фильтр
НеПроводитьНулевыеЗначенияреализован в SQL запросаПодготовитьПараметрыПроведения, а не в цикле движений — если меняете логику нулей, правьте текст запроса, иначе фильтр «утечёт».- Заполнение «на основании» поддержано только из
ПоступлениеТоваровУслуг; для других основанийЗаполнитьПоДокументуОснованиялишь проставитДокументОснование, строки не заполнит.- Регистр периодический по
Период = Дата— две установки цен в один день на одну пару тип цен + номенклатура перетрут друг друга по дате; для истории цен нужны разные даты документов.
🔗 Связанные разделы
- nomenklatura — справочник номенклатуры; тут заводятся позиции и типы цен
- realizaciya-tmz-i-uslug — основной потребитель цен из регистра при отгрузке
- postuplenie-tmz-i-uslug — документ-основание для установки цен «по закупке»
- schet-na-oplatu-pokupatelyu — счёт покупателю, где цена подставляется по типу цен
🆕 Что нового
| Версия | Изменение | Тип |
|---|---|---|
| 3.0.72.1 | Первичное описание (на релизе 3.0.72.1) | 🆕 |