Работа с ценообразованием является одной из ключевых задач при разработке и администрировании конфигураций на платформе 1С:Предприятие 8. Понимание того, как система хранит и обрабатывает информацию о ценах, критически важно для корректного формирования документов продаж, закупок и отчетов. В типовой конфигурации данные о ценах хранятся в специализированных регистрах сведений, привязанных к конкретному типу цен.
Получение типа цены может потребоваться в различных сценариях: от простого выбора в форме документа до сложной алгоритмической обработки в запросах или встроенном коде. Ошибки на этом этапе часто приводят к тому, что система не может подобрать нужную стоимость товара для контрагента. В этой статье мы рассмотрим основные способы получения ссылки на элемент справочника ТипыЦен и работу с соответствующими регистрами.
Разработчикам и администраторам необходимо четко различать понятия «тип цены» как справочника и «вид цены» как характеристики в некоторых конфигурациях. Мы сосредоточимся на стандартном механизме, используемом в Управление торговлей и Бухгалтерии предприятия. Грамотное использование методов выбора обеспечит стабильность работы вашей учетной системы.
Структура хранения данных о ценах в 1С
В основе механизма ценообразования лежит справочник ТипыЦен. Каждый элемент этого справочника обладает уникальным идентификатором (ссылкой), который используется во всех связанных объектах. Именно эту ссылку чаще всего требуется «получить» в коде для дальнейших операций. Связь между товаром и его стоимостью осуществляется через регистр сведений ЦеныНоменклатуры.
Важно понимать, что тип цены не существует в отрыве от владельца. У каждого типа цены есть свойство Владелец, которое определяет, кому принадлежат эти цены: конкретному контрагенту, группе контрагентов или всем сразу. При поиске нужного типа цены игнорирование этого свойства может привести к выбору неверного ценового соглашения.
⚠️ Внимание: В распределенных информационных базах (РИБ) типы цен могут иметь разные UUID на разных узлах. При обмене данными убедитесь, что вы используете предопределенные элементы или синхронизируете справочники корректно.
Дополнительно тип цены может характеризоваться валютой и точностью округления. Эти параметры хранятся непосредственно в элементе справочника. При программном создании новых типов цен необходимо явно указывать эти значения, иначе расчеты могут давать погрешности.
Ссылка на тип цены является основным ключом для выборки данных из регистра цен номенклатуры.
Программный выбор типа цены в коде 1С
Наиболее частая задача разработчика — найти конкретный тип цены по его наименованию или коду. Для этого используется механизм запросов или метод НайтиПоНаименованию. Выбор подхода зависит от контекста: выполняется ли операция в цикле или единоразово при старте системы.
Если вам нужно получить тип цены для стандартной операции, например, «Оптовая», лучше использовать предопределенные элементы, если они настроены в вашей базе. В противном случае, надежным способом является выборка через запрос с параметром. Это гарантирует, что вы получите актуальную ссылку, даже если элемент был переименован пользователем, но сохранил код.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТипыЦен.Ссылка КАК Ссылка
|ИЗ
| Справочник.ТипыЦен КАК ТипыЦен
|ГДЕ
| ТипыЦен.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", "Оптовая");
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
НужныйТипЦены = Выборка.Ссылка;
КонецЕсли;
При работе в цикле по множеству документов повторное выполнение запроса для каждого документа является ошибкой архитектуры. В таких случаях необходимо один раз получить все необходимые типы цен в коллекцию значений или структуру, а затем обращаться к ним по ключу. Это существенно ускоряет проведение документов.
- 🔍 Используйте
НайтиПоНаименованиютолько для редких операций, так как этот метод может быть медленным на больших базах. - ⚡ Кэшируйте ссылки на типы цен в глобальных переменных или модуле менеджера при инициализации.
- 🛡️ Всегда проверяйте результат выборки на пустоту перед использованием ссылки в дальнейшей логике.
Использование констант и предопределенных элементов
В типовых конфигурациях часто встречается практика вынесения основных типов цен в константы. Это упрощает поддержку кода и делает его более читаемым. Вместо хардкода строк с названиями («Оптовая», «Розничная») вы обращаетесь к понятным идентификаторам, таким как Константы.ОсновнойТипЦенПродаж.
Предопределенные элементы справочника позволяют жестко зафиксировать связь между логикой программы и данными. Если в вашей конфигурации настроен предопределенный элемент с именем Opt, вы можете получить его ссылку через метод Справочники.ТипыЦен.Опт.ПолучитьСсылку(). Это самый надежный способ, не зависящий от переименований.
Однако, если вы работаете с нетиповой конфигурацией или самописным решением, механизм констант может отсутствовать. В таком случае рекомендуется создать собственные константы типа СправочникСсылка.ТипыЦен и заполнить их при начальной настройке системы. Это избавит от необходимости писать сложные запросы в будущем.
⚠️ Внимание: При обновлении типовой конфигурации предопределенные элементы могут быть пересозданы. Убедитесь, что ваши доработки не конфликтуют с новыми версиями метаданных.
Использование констант также упрощает переход между различными базами данных (например, с учебной на производственную). Вам не нужно искать ID элементов, достаточно убедиться, что в константах прописаны верные ссылки для текущего окружения.
Создайте общий модуль с функциями-обертками для получения часто используемых типов цен. Это централизует логику и упростит изменение алгоритмов выбора в будущем.
Получение типа цены через форму документа
В пользовательском режиме получение типа цены чаще всего происходит автоматически при выборе контрагента. Механизм Соглашений по ценам анализирует введенного партнера и предлагает подходящий тип цены. Разработчику может потребоваться перехватить этот момент или реализовать свой алгоритм подстановки.
Для этого используется событие формы ПриЧтенииНаСервере или обработчики изменения реквизитов. Вы можете программно установить значение в поле ТипЦен, основываясь на свойствах контрагента (например, вид номенклатуры или регион). Это позволяет гибко управлять ценообразованием без участия оператора.
Если автоматический выбор не сработал, пользователь может выбрать тип цены вручную из списка. Список формируется динамически: система показывает только те типы цен, которые доступны текущему пользователю и допустимы для выбранного вида операции (продажа или закупка).
| Сценарий | Метод получения | Особенности |
|---|---|---|
| Автоматический подбор | Событие изменения контрагента | Требуется анализ соглашений |
| Выбор пользователем | Форма ввода (Dialog) | Ограничено правами доступа |
| Печатная форма | Чтение из документа | Требуется проверка заполнения |
| Обмен данными | Поиск по коду/ИД | Критична уникальность ключа |
Важно учитывать права доступа. Даже если тип цены существует в базе, пользователь может не видеть его в списке выбора, если у него нет прав на чтение этого элемента справочника или соответствующего раздела учета.
Работа с регистром цен номенклатуры
После того как вы получили ссылку на тип цены, следующим шагом обычно является чтение или запись цен. Для этого используется регистр сведений ЦеныНоменклатуры. Ключевыми измерениями этого регистра являются Номенклатура, ТипЦен и Период.
Для получения актуальной цены на конкретную дату используется срез последних или срез первых. В запросе необходимо обязательно указать параметр типа цены. Без этого условия запрос вернет цены по всем типам, что приведет к дублированию строк и неверным расчетам.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ЦеныНоменклатуры.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
|ГДЕ
| ЦеныНоменклатуры.Номенклатура = &Товар
| И ЦеныНоменклатуры.ТипЦен = &ТипЦены
| И ЦеныНоменклатуры.Период МЕЖДУ &НачПериода И &КонПериода
|УПОРЯДОЧИТЬ ПО
| ЦеныНоменклатуры.Период УБЫВ";
Запрос.УстановитьПараметр("ТипЦены", СсылкаНаТипЦены);
// ... установка остальных параметров
При записи новых цен необходимо контролировать уникальность записей. Платформа 1С позволяет включать в регистр ограничения уникальности. Если попытаться записать цену с тем же набором измерений и периодом, возникнет ошибка, которую нужно обрабатывать.
☑️ Проверка перед записью цены
Обработка ошибок и исключительных ситуаций
В процессе получения типа цены могут возникать различные ошибки. Самая распространенная ситуация — запрошенный тип цены не найден в базе. Это может произойти при переносе данных из старой системы или при некорректной настройке новой базы.
Если вы используете метод НайтиПоНаименованию и элемент не найден, метод вернет пустую ссылку. Попытка использовать такую ссылку в запросе или присвоить её реквизиту документа приведет к ошибке выполнения. Всегда используйте конструкцию Если Не ПустаяСсылка(Ссылка) Тогда....
Еще одной проблемой может быть несовпадение видов цен. В некоторых конфигурациях тип цены жестко привязан к виду цены (покупка/продажа). Попытка использовать тип цены «Закупочная» в документе «Реализация товаров» вызовет логику контроля, которая запретит проведение документа.
⚠️ Внимание: При импорте цен из внешних файлов (Excel, XML) обязательно проверяйте существование типа цены перед загрузкой. Иначе вы создадите «висячие» записи в регистре, которые не смогут быть использованы в документах.
Для отладки проблем с ценами удобно использовать универсальный отчет по регистру сведений. Он позволяет наглядно увидеть, какие периоды и типы цен существуют для конкретной номенклатуры, и выявить пробелы в данных.
Как восстановить удаленный тип цены?
Если тип цен был удален, но ссылки на него остались в исторических данных, восстановление возможно только через выгрузку/загрузку XML или прямое вмешательство в базу данных (не рекомендуется). Проще создать новый элемент и переписать соглашения.
Часто задаваемые вопросы (FAQ)
Как получить список всех типов цен, доступных для конкретного контрагента?
Для этого необходимо сделать выборку из регистра сведений СоглашенияПоЦенам или использовать запрос к справочнику ТипыЦен с отбором по владельцу. Пример запроса: ВЫБРАТЬ ТипыЦен.Ссылка ИЗ Справочник.ТипыЦен КАК ТипыЦен ГДЕ ТипыЦен.Владелец = &Контрагент.
Почему тип цены не подставляется в документ автоматически?
Чаще всего причина в отсутствии действующего соглашения с этим контрагентом на нужную дату. Также проверьте, установлен ли флаг «Использовать соглашения» в параметрах системы и не заблокирован ли тип цены для данного вида операции.
Можно ли изменить код типа цены после его создания?
Нет, код элемента справочника в 1С является неизменяемым после записи. Если вам критически важно изменить код, придется создать новый элемент справочника и перенести на него все данные, а старый пометить на удаление.
Как найти документы, где используется определенный тип цены?
Используйте отчет «Анализ состояния учета» или универсальный поиск по базе данных. Также можно написать запрос к таблицам документов (например, Документ.РеализацияТоваровУслуг), отбирая записи по реквизиту ТипЦен.
Влияет ли тип цены на расчет НДС?
Сам по себе тип цены не влияет на ставку НДС, но цена, выбранная по этому типу, является базой для расчета налога. Если в типе цен задана валюта, отличная от валюты регламентированного учета, потребуется пересчет курса на дату документа.