Как вывести оперативный остаток номенклатуры в табличную часть документа в 1С?

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

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

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

Способ 1. Использование встроенного механизма подбора

В типовых конфигурациях (например, в «1С:Управление торговлей 10.3») штатным решением для просмотра остатков и цен является форма подбора номенклатуры. При заполнении документа через подбор менеджер видит текущие остатки по складам и цены в удобном интерфейсе. Это наиболее производительный путь, так как он не нагружает основную форму документа постоянными запросами к базе данных.

Способ 2. Вывод остатка в отдельную колонку табличной части

Если требуется отображать остаток прямо в строках табличной части документа (в обычных формах), можно добавить нереквизитную колонку в табличное поле и заполнять её значение динамически.

Разберем по шагам алгоритм решения этой задачи.

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

Функция ОстатокНаСкладе(Номенклатура, Склад, Дата) Экспорт

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

    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();

    Возврат ?(Выборка.Следующий(), Выборка.Количество, 0);

КонецФункции

Важное замечание по производительности: Условия по номенклатуре и складу следует передавать непосредственно в параметры виртуальной таблицы Остатки(), а не в блок ГДЕ. Это позволит платформе выполнить эффективный отбор на стороне СУБД без считывания лишних данных.

  1. Создайте процедуру для заполнения ячейки строки остатком:

Процедура ПоказатьОстатокСклада(КолонкиТабПоля, ЯчейкиСтрокиТабПоля, Номенклатура, Склад, Дата) Экспорт

    Если КолонкиТабПоля.ОстатокСклада.Видимость Тогда
        Если ТипЗнч(Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда
            Остаток = ОстатокНаСкладе(Номенклатура, Склад, Дата);
            ЯчейкиСтрокиТабПоля.ОстатокСклада.УстановитьТекст(Остаток);
        Иначе
            ЯчейкиСтрокиТабПоля.ОстатокСклада.УстановитьТекст("");
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Разбор частых ошибок

При вызове процедуры заполнения ячеек часто возникает ошибка Поле объекта не обнаружено (ИмяКолонки). Выясним причину этого сбоя.

Ошибка появляется в том случае, если имя колонки в визуальных свойствах табличного поля формы не совпадает с именем, к которому идет обращение в коде. Например, колонка на форме названа ОстатокТовара, а в коде выполняется обращение к КолонкиТабПоля.ОстатокСклада или ЯчейкиСтрокиТабПоля.ОстатокСклада. Все имена колонок должны строго совпадать.

Особенности обновления данных на форме

При вычислении остатка в момент выбора товара значение выводится на текущий момент времени. Однако при проведении документа или изменении количества позиций данные на экране автоматически не обновляются. Для поддержания актуальности остатков потребуется принудительно пересчитывать значения при изменении состава табличной части или повторно запрашивать данные после проведения документа.

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

← На главную