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