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