Часто пользователи 1С сталкиваются с ситуацией, когда цены в программе установлены, документы проведены, но при попытке сформировать отчет Прайс-лист система выдает пустой бланк. Это может вызвать замешательство, особенно если в разделе CRM и маркетинг все данные кажутся заполненными. В рамках данной статьи мы разберем основные причины этой проблемы, проанализируем архитектуру хранения цен в 1С и составим пошаговый алгоритм действий для восстановления корректной работы отчета.
Для начала важно понять фундаментальный принцип работы 1С: отчеты практически никогда не берут данные напрямую из документов. Документ УстановкаЦенНоменклатуры — это лишь регистратор события. Сами же цены хранятся в специальном объекте — регистре сведений. В данном случае это периодический регистр сведений ЦеныНоменклатуры.
Если документ проведен, но не сделал записей в этот регистр, отчет будет пустым. Проверим это, перейдя в движения документа. В форме документа нажмите кнопку Отчеты, далее выберите Движения документа. Проанализируем открывшуюся таблицу: если она пуста, значит, документ "не сработал". Рассмотрим причины, по которым это происходит.
В конфигурации 1С:Управление торговлей 11 (и аналогичных, таких как ERP или КА) реализован механизм многоэтапной установки цен. Проанализируем настройки системы. Если в базе включена опция Согласование цен номенклатуры, то простого проведения документа недостаточно.
Установка цен номенклатуры. Найдем поле Статус. Если там указано "Не согласован" или "На согласовании", документ не сделает движений в регистр, и цены не будут считаться актуальными.Если с документами всё в порядке и движения в регистре есть, причина кроется в настройках фильтрации самого отчета. Рассмотрим наиболее часто встречающиеся ошибки пользователей при формировании прайса.
Флаг "Только имеющиеся в наличии"
Это самая частая причина "пустого" отчета. В настройках прайс-листа часто по умолчанию включена опция отображения только тех товаров, которые есть на остатках складов. Если вы только что завели номенклатуру и установили цены, но еще не оформили поступление, отчет с таким флагом будет пустым. Отключим этот фильтр в настройках и проверим результат.
Отбор по видам цен
Выясним, какие виды цен выбраны для отображения. В форме отчета нажмем Настроить и перейдем на вкладку Колонки. Убедимся, что выбраны именно те виды цен (например, "Розничная" или "Оптовая"), по которым проводилась установка цен. Если в списке колонок пусто или выбраны не те типы, отчет не найдет данных для вывода.
Не каждый вид цены может быть выведен в прайс-лист. Проанализируем настройки справочника Виды цен:
Цены в 1С имеют строгую привязку ко времени. Выясним, на какую дату и время формируется отчет. Если документ установки цен был создан "сегодня" в 12:00, а вы формируете прайс-лист на дату "сегодня", но система по умолчанию подставляет начало дня (00:00:00), то цены еще не "наступили".
Попробуем сформировать отчет на завтрашнее число или убедимся, что время в поле Дата отчета позже, чем время проведения документа. Это критически важно для корректной выборки из периодического регистра сведений.
Рассмотрим ситуацию, когда в отчете установлены жесткие фильтры по структуре предприятия или номенклатуры:
Подводя итог, можно сказать, что решение проблемы всегда кроется в цепочке: Статус документа -> Движения регистра -> Фильтры отчета. Мы рекомендуем всегда начинать проверку с кнопки Движения документа. Если в таблице Цены номенклатуры пусто — ищите причину в документе (статус, проведение, заполнение). Если записи в таблице есть — ищите причину в настройках отчета (складские остатки, выбранные виды цен, дата).
Для программистов, желающих программно проверить наличие цен, можно использовать запрос к виртуальной таблице СрезПоследних:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("ВидЦены", НужныйВидЦены);
РезультатЗапроса = Запрос.Выполнить();
Этот простой код позволит быстро понять, видит ли система цены на программном уровне, что поможет исключить ошибки в самом СКД-отчете.