В процессе ведения многофирменного учета в программе 1С:Управление торговлей (редакция 11) пользователи часто сталкиваются с задачей разделения товарного ассортимента между различными юридическими лицами. Например, когда в одной информационной базе ведется учет по двум организациям (одна на ОСНО, другая на УСН), возникает необходимость строго разграничить продажу товаров и услуг: определенные позиции должны продаваться исключительно от организации А, а другие — только от организации Б.
Стандартный справочник Номенклатура в 1С является общим для всей базы данных. В этой статье мы подробно рассмотрим, как решить задачу привязки номенклатуры к организации, проанализируем доступные штатные механизмы конфигурации, выявим их ограничения и разберем наиболее надежный способ реализации контроля через расширение конфигурации.
---
Если перед вами стоит задача решить проблему без привлечения программиста и изменения конфигурации, то использование связки маркетинговых инструментов (соглашений и сегментов) является оптимальным вариантом. Рассмотрим этот процесс по шагам.
Шаг 1. Формирование сегментов номенклатуры
Для начала нам необходимо классифицировать весь товарный ассортимент. Разберем, как распределить товары по сегментам:
Шаг 2. Настройка типовых или индивидуальных соглашений с клиентами
После того как сегменты сформированы, нам нужно связать их с конкретными организациями при оформлении продаж. Для этого используются соглашения:
Как это работает на практике:
При создании документов Заказ клиента или Реализация товаров и услуг менеджер в обязательном порядке выбирает соглашение. После этого при подборе товаров в документ система автоматически наложит фильтр: менеджер физически не сможет увидеть и выбрать в табличную часть товары, которые не входят в сегмент, привязанный к выбранному соглашению.
Важное ограничение метода:
Этот способ контроля работает безупречно только при условии, что у менеджеров в настройках прав доступа отсутствует роль «Отклонение от условий продаж». Если у пользователя есть полные права или назначена указанная роль, система выдаст лишь предупреждение о нарушении сегмента, но позволит провести документ с «чужим» товаром.
---
Рассмотрим еще один штатный инструмент платформы 1С:Предприятие — ограничение доступа на уровне записей (RLS). Этот способ позволяет разграничить видимость элементов справочника Номенклатура.
Выясним особенности настройки данного механизма:
Критический недостаток RLS в рамках нашей задачи:
Этот метод привязывает видимость товаров к конкретному пользователю (менеджеру), а не к реквизиту «Организация» в самом документе. Если менеджер работает в компании-мультихолдинге и должен выписывать документы то от одной организации, то от другой, RLS ему не поможет: он будет видеть всю разрешенную ему номенклатуру одновременно во всех документах, что приведет к ошибкам при вводе данных.
---
Некоторые специалисты предлагают использовать стандартный контроль остатков организаций. Проанализируем эту ситуацию подробнее.
В 1С:УТ 11 присутствует механизм исключения продаж «в минус» в разрезе организаций. Если мы включим опцию Контроль остатков товаров организаций и при этом не настроим схему передачи товаров между организациями («Интеркампани»), то система не позволит провести документ Реализация товаров и услуг от имени Организации Б, если этот товар фактически числится на остатках Организации А.
Почему этот способ не является полноценным решением:
Заказ клиента с вариантом обеспечения «Под заказ» или «Резервировать к дате»), когда фактического поступления товаров на склад организации еще не было, но документ уже необходимо провести.---
Если штатные методы не подходят из-за специфики бизнес-процессов (например, когда менеджеры обладают широкими правами или не используют соглашения), самым надежным решением станет создание небольшого расширения конфигурации.
Чтобы избежать жесткого кодирования (хардкода) конкретных организаций в программном коде, разберем по шагам, как реализовать гибкую схему привязки.
Вариант реализации А: Через дополнительные реквизиты
Номенклатура добавим дополнительный реквизит «Организация-владелец» с типом значения СправочникСсылка.Организации.Вариант реализации Б: Через собственный регистр сведений (более гибкий)
В расширении создадим непериодический регистр сведений СоответствиеНоменклатурыИОрганизаций со следующей структурой:
Номенклатура (Тип: СправочникСсылка.Номенклатура)Организация (Тип: СправочникСсылка.Организации)Преимущество регистра перед доп. реквизитом заключается в том, что мы можем задать связь «один ко многим», разрешив продажу конкретной позиции сразу по нескольким выбранным организациям, но запретив по всем остальным.
Программная реализация контроля проведения в расширении:
Для блокировки проведения документов продажи при наличии некорректных позиций создадим подписку на событие ОбработкаПроведения для документов РеализацияТоваровУслуг и ЗаказКлиента. Ниже рассмотрим пример программного кода, реализующего данную проверку (на примере использования дополнительного реквизита номенклатуры):
Процедура ПередЗаписьюДокумента_КонтрольОрганизаций(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем, что документ проводится
Если Не РежимПроведения = РежимПроведенияДокумента.Проведение Тогда
Возврат;
КонецЕсли;
// Получаем организацию из шапки документа
ОрганизацияДокумента = Источник.Организация;
Если Не ЗначениеЗаполнено(ОрганизацияДокумента) Тогда
Возврат;
КонецЕсли;
// Подготовим запрос для быстрой проверки всей табличной части "Товары"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокТовары.НомерСтроки КАК НомерСтроки,
| ДокТовары.Номенклатура КАК Номенклатура,
| ДокТовары.Номенклатура.Наименование КАК ТоварНаименование,
| ВЫРАЗИТЬ(ДопРеквизиты.Значение КАК Справочник.Организации) КАК РазрешеннаяОрганизация
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК ДокТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
| ПО ДокТовары.Номенклатура = ДопРеквизиты.Ссылка
| И (ДопРеквизиты.Свойство.Имя = ""ОрганизацияВладелец"")
|ГДЕ
| ДокТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Если доп. реквизит заполнен и не совпадает с организацией документа - блокируем проведение
Если ЗначениеЗаполнено(Выборка.РазрешеннаяОрганизация)
И Выборка.РазрешеннаяОрганизация <> ОрганизацияДокумента Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'В строке № " + Выборка.НомерСтроки + " указан товар """ + Выборка.ТоварНаименование + """, разрешенный к продаже только по организации: " + Выборка.РазрешеннаяОрганизация + "!'"),
Источник,
"Товары[" + (Выборка.НомерСтроки - 1) + "].Номенклатура",
,
Отказ);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Преимущества программного контроля через расширение:
Для решения задачи привязки номенклатуры к организации мы рекомендуем в первую очередь оценить применимость штатного функционала Сегментов и Соглашений. Он разворачивается за несколько минут и не требует обновления конфигурации. Если же этот вариант не подходит из-за особенностей работы пользователей, то лучшим выбором станет внедрение небольшого расширения с программным контролем при проведении, пример которого мы подробно разобрали выше.