Задача: необходимо добавить в табличную часть документа "Реализация товара" колонку "остаток на складе". Остаток должен быть виден при добавлении вручную товара в табличную часть документа из справочника, а также при поиске и добавлении товара по штрихкоду с помощью сканера. Конфигурация "Управление торговлей" на управляемых формах, интерфейс такси. Конструкция шаблона универсальная, подойдет для других документов и других конфигураций на управляемых формах.
Для реализации задачи нужно:
1. Добавить в документ реквизит "ОстакиНаСкладе" с типом строка, длина 10.
2. Добавить в документ новую функцию, которая будет извлекать из регистра текущий остаток товара для товаров.
3. Изменить код процедур, отвечающих за добавление товара из справочника и за добавление товара после поиска по штрихкоду.
НА УПРАВЛЯЕМЫХ ФОРМАХ
Шаблоны кода:
1. Функция выборки остатков. Размещаем в модуле формы документа.
Текст функции:
&НаСервере
Функция ПолучитьОстатокТовараИзРегистра(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст ="
| ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(ТоварыНаСкладахОстатки.КОтгрузкеОстаток, 0) КАК Остаток
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки( , Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Остаток;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Скриншот функции:
2. Модификация процедуры ТоварыПриОкончанииРедактирования. В конце процедуры добавляем наш код:
Новый код в процедуре:
ТЧ = Объект.Товары;
Для Каждого Строка Из ТЧ Цикл
НаименованиеНоменклатуры = Строка.Номенклатура;
ОстатокВЦикле = ПолучитьОстатокТовараИзРегистра(НаименованиеНоменклатуры);
Строка.ОстакиНаСкладе = ОстатокВЦикле;
КонецЦикла;
Скриншот кода:
3. Модификация процедуры ПоискПоШтрихкодуЗавершение. В конце процедуры добавляем код:
Новый код в процедуре:
ТЧ = Объект.Товары;
Для Каждого Строка Из ТЧ Цикл
НаименованиеНоменклатуры = Строка.Номенклатура;
ОстатокВЦикле = ПолучитьОстатокТовараИзРегистра(НаименованиеНоменклатуры);
Сообщить("Товара" + (НаименованиеНоменклатуры) + " на остатке:" + (ОстатокВЦикле));
Строка.ОстакиНаСкладе = ОстатокВЦикле;
КонецЦикла;
Скриншот кода:
Результат выполнения кода на управляемых формах:
НА ОБЫЧНЫХ ФОРМАХ
Необходимо добавть на форму в табличную часть Товары документа Реалиация товаров и услуг новую колонку "ОстакиНаСкладе". Реквизит с таким именем добавлять не нужно. Данные динамические. Расчитываются при открытии документа. В модуле формы документа в процедуре ТоварыПриПолученииДанных нужно добаить код:
Шаблон кода:
Для Каждого ТекСтрока из ОформленияСтрок Цикл
Запрос = Новый Запрос;
Запрос.Параметры.Вставить("ДатаДокумента",Дата);
Запрос.Параметры.Вставить("Номенклатура",ТекСтрока.ДанныеСтроки.Номенклатура);
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
ТекСтрока.Ячейки.ОстакиНаСкладе.ОтображатьТекст = Истина;
ТекСтрока.Ячейки.ОстакиНаСкладе.Выравнивание = ГоризонтальноеПоложение.Право;
Если Выборка.Следующий() Тогда
ОстатокКоличество = ?(Выборка.КоличествоОстаток = Null,0,Выборка.КоличествоОстаток);
Если ОстатокКоличество < 0 ТОгда
ТекСтрока.Ячейки.ОстакиНаСкладе.ЦветТекста = WebЦвета.Красный;
КонецЕсли;
Иначе
ОстатокКоличество = 0;
ТекСтрока.Ячейки.ОстакиНаСкладе.ЦветТекста = WebЦвета.Белый;
КонецЕсли;
Если ОстатокКоличество - ТекСтрока.ДанныеСтроки.Количество < 0 Тогда
ТекСтрока.ЦветФона = WebЦвета.СветлоСерый;
Иначе
ТекСтрока.ЦветФона = WebЦвета.Белый;
КонецЕсли;
ТекСтрока.Ячейки.ОстакиНаСкладе.Текст = "" + ОстатокКоличество;
КонецЦикла;
Скриншот кода:
Результат выполнения кода в режиме 1С Предприятие на обычных формах: