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