Как в 1С:Предприятии настроить фильтрацию сотрудников по адресу магазина?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача ограничения списка выбора в одном поле в зависимости от значения, указанного в другом. Типичный пример: при выборе магазина в документе или справочнике, в поле «Сотрудник» должны отображаться только те работники, которые закреплены именно за этой торговой точкой. Рассмотрим подробно, как реализовать этот функционал, разберем типичные ошибки новичков и выясним, как построить правильную архитектуру решения.

Метод 1: Использование механизма «Связи параметров выбора»

Это самый простой и эффективный способ, позволяющий добиться нужного результата без написания программного кода. Платформа 1С предоставляет визуальный конструктор для настройки зависимости между полями.

Проанализируем шаги, которые необходимо выполнить:

  1. Подготовка метаданных: Убедимся, что в справочнике Сотрудники создан реквизит (например, Магазин или АдресМагазина), который связывает сотрудника с конкретным местом работы.
  2. Настройка связи: Откроем объект, в котором происходит выбор (в нашем примере это справочник или документ Продажи).
  3. Свойства реквизита: Найдем реквизит Сотрудник и перейдем в его свойства.
  4. Поле «Связи параметров выбора»: Нажмем на кнопку выбора (три точки). В открывшемся окне добавим новую связь:
    • В колонке Параметр выбора укажем Отбор.Магазин (или тот реквизит, который создан в справочнике сотрудников).
    • В колонке Поле формы выберем реквизит текущего объекта — Магазин.

Теперь, когда мы выберем магазин в форме, платформа автоматически применит фильтр к списку сотрудников, сравнивая значение в форме со значением реквизита в справочнике Сотрудники.

Метод 2: Программная фильтрация через событие «НачалоВыбора»

Разберем ситуацию, когда стандартных связей недостаточно. Например, если нам нужно реализовать сложную логику: показывать только активных сотрудников или тех, кто не находится в отпуске на текущую дату. В этом случае мы воспользуемся программным кодом в модуле формы.

Рассмотрим пример реализации в обработчике события НачалоВыбора для поля формы:


&НаКлиенте
Процедура СотрудникНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие списка, чтобы передать свои параметры
    СтандартнаяОбработка = Ложь;
    
    // Формируем структуру отбора
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Магазин", Объект.Магазин);
    ПараметрыОтбора.Вставить("Статус", ПредопределенноеЗначение("Перечисление.СтатусыСотрудников.Работает"));
    
    // Параметры открытия формы выбора
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
    
    // Открываем форму выбора справочника Сотрудники с нашим фильтром
    ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Этот метод дает полную свободу действий программисту, позволяя динамически изменять условия фильтрации в зависимости от контекста задачи.

Анализ архитектурных решений: почему важен правильный выбор объектов

В процессе обсуждения задачи на форумах часто всплывают критические замечания к структуре базы данных. Выясним причину, почему опытные разработчики негативно относятся к некоторым решениям начинающих.

1. Справочник «Продажи» vs Документ «Продажа»

В системе 1С справочники предназначены для хранения условно-постоянной информации (существительные: Товары, Контрагенты). Для регистрации событий, происходящих во времени (глаголы: продать, купить, списать), используются Документы. Если фиксировать продажи в справочнике, мы теряем возможность строить отчеты по периодам, использовать регистры накопления и контролировать остатки товаров. Правильное решение — использовать документ РеализацияТоваровУслуг или ЧекККМ.

2. Адрес как «Перечисление»

Использование объекта Перечисление для адресов магазинов — это серьезная ошибка. Перечисления жестко задаются в конфигураторе. Если компания откроет новый магазин или изменит адрес существующего, пользователю придется вызывать программиста для обновления конфигурации. Посмотрим на правильный подход: адреса должны храниться в справочнике Магазины или Склады. Это позволит пользователям самостоятельно добавлять и редактировать объекты в режиме 1С:Предприятие.

Использование регистров сведений для хранения связей

Проанализируем еще один продвинутый способ организации данных. Что если сотрудник сегодня работает в одном магазине, а завтра его перевели в другой? Хранение магазина прямо в реквизитах справочника Сотрудники не позволит отследить историю перемещений.

Для таких задач лучше использовать Периодический регистр сведений (например, МестаРаботыСотрудников). В этом случае при выборе сотрудника в документе, мы можем программно проверить, в каком магазине он числился на дату совершения продажи.

Рассмотрим, как может выглядеть запрос для получения актуального магазина сотрудника:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	МестаРаботыСотрудниковСрезПоследних.Магазин КАК Магазин
    |ИЗ
    |	РегистрСведений.МестаРаботыСотрудников.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК МестаРаботыСотрудниковСрезПоследних";

Запрос.УстановитьПараметр("Период", Объект.Дата);
Запрос.УстановитьПараметр("Сотрудник", Объект.Сотрудник);

Подведение итогов

Мы рассмотрели несколько способов привязки сотрудников к адресу магазина: от простой настройки Связи параметров выбора в свойствах реквизита до программного управления отборами. Важно помнить, что даже в учебных задачах стоит придерживаться стандартов разработки 1С: использовать документы для учета хозяйственных операций и справочники для хранения аналитики. Это закладывает фундамент для создания масштабируемых и надежных систем автоматизации бизнеса.

← На главную