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