В повседневной работе торговых предприятий часто возникает ситуация, когда для ключевых клиентов устанавливаются особые условия на определенные позиции номенклатуры. В типовой конфигурации «Торговля и Склад 7.7» (ТиС) менеджеры нередко вынуждены вносить такие скидки или цены вручную в документ Реализация. Это человеческий фактор: сотрудники забывают о договоренностях, что приводит к ошибкам в документах и недовольству руководства. Рассмотрим, как автоматизировать привязку цен к паре «Контрагент — Товар», используя как штатные возможности, так и небольшие программные доработки.
Начнем с самого простого способа, который не требует вмешательства в конфигуратор, но имеет свои эксплуатационные особенности. В системе 1С 7.7 цена продажи жестко привязана к Типу цен, а тип цен, в свою очередь, закрепляется за Договором контрагента. Проанализируем, как это работает по шагам:
Типы цен новый элемент, например, «СпецЦена для Иванова».Договор, указав этот тип цен как основной.Важный нюанс: Этот способ удобен, если у клиента индивидуальные цены на весь ассортимент. Если же спеццена действует только на одну позицию из тысячи, вам придется либо дублировать все остальные цены из базового типа в этот спецтип, либо мириться с тем, что в документе остальные цены будут нулевыми. Программно эту проблему можно решить созданием внешней обработки, которая будет копировать цены из «Оптовой» в «Индивидуальную» по заданному алгоритму, но это уже требует участия разработчика.
Рассмотрим более изящное решение, предложенное опытными разработчиками. В ТиС 7.7 существует справочник Аналоги, который подчинен справочнику Номенклатура. У него есть реквизиты, которые можно использовать не по прямому назначению, а для хранения условий скидки. Разберем логику реализации:
Справочник Аналоги имеет владельца каталога (им может быть Контрагент). Мы можем создать запись в аналогах для конкретного товара, указать там контрагента, а в текстовое поле (например, Наименование или Идентификатор) вписать размер скидки или фиксированную цену. Далее нам потребуется внести изменения в Глобальный модуль в процедуру глПересчетТаблЧасти.
Проанализируем пример кода, который можно интегрировать в механизм подбора товара:
// В модуле документа или Глобальном модуле
СпрАналоги = СоздатьОбъект("Справочник.Аналоги");
СпрАналоги.ИспользоватьВладельца(ТекущаяНоменклатура);
СпрАналоги.ВыбратьЭлементы();
Пока СпрАналоги.ПолучитьЭлемент() = 1 Цикл
// Проверяем, привязан ли этот аналог к нашему покупателю
Если СпрАналоги.ВладелецКаталога = ТекущийКонтрагент Тогда
// Допустим, мы храним спеццену в наименовании аналога
ИндивидуальнаяЦена = Число(СпрАналоги.Наименование);
Если ИндивидуальнаяЦена > 0 Тогда
Цена = ИндивидуальнаяЦена;
// Пересчитываем сумму строки
Сумма = Цена * Количество;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Преимущество этого метода в том, что мы не создаем новые объекты метаданных, сохраняя конфигурацию максимально близкой к типовой, что облегчает будущие обновления.
Если задача стоит масштабно и условий много, правильнее всего будет создать новый объект в дереве метаданных. Разберем по шагам создание системы «Индивидуальных спецификаций»:
СкидкиПокупателей.Номенклатура (или Контрагенты, в зависимости от того, как вам удобнее искать информацию).Контрагент (тип Справочник.Контрагенты), СкидкаПроцент (тип Число), Цена (тип Число).Теперь выясним, как заставить документ Реализация учитывать эти данные. Нам нужно найти процедуру, отвечающую за выбор товара (обычно это ПриЗаписиТекстаСтроки или вызовы в Глобальном модуле, такие как глОбработкаПодбора). Посмотрим на пример реализации логики поиска индивидуальной скидки:
Процедура ПриВыбореНоменклатуры(ТекНом)
СпрСкидки = СоздатьОбъект("Справочник.СкидкиПокупателей");
СпрСкидки.ИспользоватьВладельца(ТекНом);
// Ищем, есть ли запись для текущего контрагента документа
Если СпрСкидки.НайтиПоРеквизиту("Контрагент", Контрагент, 1) = 1 Тогда
// Если нашли — приоритет отдаем индивидуальной цене
Если СпрСкидки.Цена > 0 Тогда
Цена = СпрСкидки.Цена;
ИначеЕсли СпрСкидки.СкидкаПроцент > 0 Тогда
// Если указан процент — вычисляем от базовой цены
Цена = Цена * (1 - СпрСкидки.SкидкаПроцент / 100);
КонецЕсли;
// Вызываем штатный пересчет строки
глПересчетТаблЧасти(Контекст, "Цена");
КонецЕсли;
КонецПроцедуры
В процессе обсуждения данной темы на профессиональных форумах была выявлена важная проблема ТиС 7.7, связанная с партионным учетом. Если вы начинаете активно использовать скидки и при этом у вас отключен контроль отрицательных остатков (что часто бывает в оптовой торговле), вы можете столкнуться с «пересортом по фирмам».
Разберем ситуацию: когда в 1С 7.7 не хватает остатков по конкретной фирме (юрлицу), система может попытаться списать партию, числящуюся за другой фирмой в рамках одной базы. Это происходит из-за ошибки в процедуре ПодготовитьТаблИтогов Глобального модуля. Проанализируем код исправления:
// Фрагмент Глобального модуля ТиС 7.7
Процедура ПодготовитьТаблИтогов(ТаблИтогов, Фирма)
...
Пока ТаблИтогов.ПолучитьСтроку() = 1 Цикл
Если ТаблИтогов.Фирма <> Фирма Тогда
// ТИПОВАЯ ОШИБКА: Фирма обнуляется, а количество остается!
ТаблИтогов.Фирма = ПустаяФирма;
// [ИСПРАВЛЕНИЕ]: Нужно обнулить количество для партий чужих фирм
ТаблИтогов.Количество = 0;
ИначеЕсли ТаблИтогов.Количество < 0 Тогда
ТаблИтогов.Фирма = ПустаяФирма;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Без этой правки ваши индивидуальные скидки и цены могут корректно отображаться в документах, но при проведении себестоимость и движения по партиям будут формироваться неверно, «перемешивая» товар между вашими юридическими лицами.
Мы проанализировали несколько подходов к решению задачи привязки номенклатуры к контрагенту. Штатный метод через типы цен хорош своей простотой, но тяжеловесен в поддержке. Метод с аналогами — отличный компромисс для быстрой реализации. Создание нового справочника — наиболее надежный и гибкий путь для профессиональной разработки.
Выбор конкретного пути зависит от ваших компетенций в программировании 1С 7.7 и того, насколько сильно вы готовы модифицировать типовую конфигурацию. В любом случае, автоматизация этого процесса избавит менеджеров от «ругани начальства» и минимизирует финансовые потери из-за забытых скидок.