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