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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8 начинающие специалисты часто сталкиваются с типовыми задачами настройки интерфейса и агрегации данных. Одной из таких задач является вывод итоговых сумм из табличной части документа непосредственно в форму списка, чтобы пользователям не приходилось открывать каждый документ для просмотра общей суммы. Кроме того, в процессе работы возникают вопросы эргономики: как сделать выбор элементов справочника более быстрым и как победить автоматическое растягивание колонок в управляемых формах.

В этой статье мы подробно и по шагам разберем решение всех трех вопросов, проанализируем лучшие практики и рассмотрим альтернативные подходы, которые помогут сделать ваши конфигурации быстрыми, а интерфейсы — удобными.

Часть 1. Вывод итога табличной части в форму списка документов

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

Рассмотрим самый надежный, производительный и рекомендуемый стандарт разработки 1С — сохранение суммы в отдельный реквизит документа.

Для реализации этого метода выполним следующие шаги:

  1. Откроем конфигуратор, найдем наш документ и добавим в его шапку (в реквизиты самого документа, а не табличной части) новый реквизит. Назовем его, например, СуммаДокумента с типом данных Число (длина 15, точность 2, неотрицательное).
  2. Перейдем на вкладку «Прочие» в окне редактирования документа и нажмем кнопку «Модуль объекта».
  3. В модуле объекта создадим предопределенную процедуру-обработчик события ПередЗаписью. Именно здесь мы будем автоматически рассчитывать сумму табличной части и записывать ее в наш новый реквизит шапки перед каждым сохранением документа.

Пропишем в модуле объекта следующий код:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Рассчитываем сумму колонки "Сумма" нашей табличной части "Товары"
    // и записываем результат в реквизит шапки "СуммаДокумента"
    ЭтотОбъект.СуммаДокумента = ЭтотОбъект.Товары.Итог("Сумма");
    
КонецПроцедуры

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

Важный нюанс интерактивной работы: если пользователь меняет строки в табличной части открытого документа, значение реквизита в шапке формы не обновится мгновенно, а изменится только после записи. Чтобы исправить это и сделать интерфейс отзывчивым, настроим моментальный пересчет на форме документа:

  1. Откроем форму документа, выделим саму таблицу (нашу табличную часть) в дереве элементов формы.
  2. В панели свойств найдем событие ПриИзменении и сгенерируем для него обработчик на клиенте.
  3. Пропишем код автоматического пересчета:

&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
    
    // Обновляем значение реквизита на форме сразу при редактировании строк
    Объект.СуммаДокумента = Объект.Товары.Итог("Сумма");
    
КонецПроцедуры

Альтернативное решение без создания реквизита (Динамический список)

Если по каким-то причинам изменять структуру метаданных и добавлять новый реквизит запрещено, можно пойти по пути динамического расчета. Для этого в свойствах динамического списка формы списка документов необходимо включить флаг «Произвольный запрос» и написать следующий SQL-запрос:


ВЫБРАТЬ
    ДокументПродажа.Ссылка КАК Ссылка,
    ДокументПродажа.Дата КАК Дата,
    ДокументПродажа.Номер КАК Номер,
    ЕСТЬNULL(ТаблицаСумм.ВсегоСумма, 0) КАК СуммаДокумента
ИЗ
    Документ.Продажа КАК ДокументПродажа
    ЛЕВОЕ СОЕДИНЕНИЕ (
        ВЫБРАТЬ
            ПродажаТовары.Ссылка КАК Ссылка,
            СУММА(ПродажаТовары.Сумма) КАК ВсегоСумма
        ИЗ
            Документ.Продажа.Товары КАК ПродажаТовары
        ГРУППИРОВАТЬ ПО
            ПродажаТовары.Ссылка
    ) КАК ТаблицаСумм ПО ТаблицаСумм.Ссылка = ДокументПродажа.Ссылка

Внимание: используйте этот метод с осторожностью! При больших объемах данных в информационной базе такое левое соединение с табличной частью приведет к существенному замедлению работы формы списка, так как СУБД будет вынуждена рассчитывать сумму по всем строкам при каждой прокрутке экрана пользователем.

Часть 2. Быстрый выбор элементов справочника без кнопки «Показать все»

В современном интерфейсе «Такси» при попытке выбрать значение в поле ввода система по умолчанию активирует интеллектуальный поиск. Она показывает историю последних выборов (около 4-5 позиций) и предлагает нажать кнопку «Показать все» для перехода к полному справочнику. Если справочник небольшой и пользователю неудобно делать лишние клики, такое поведение можно изменить.

Выясним, как настроить систему для мгновенного доступа к элементам:

Способ А. Режим «Быстрого выбора»

Если справочник содержит ограниченное количество элементов (например, до 50 позиций, такие как «Склады», «Статьи затрат», «Организации»), лучшим решением будет активация быстрого выбора:

  1. В конфигураторе найдем нужный справочник (например, «Продукты»).
  2. Откроем его свойства, перейдем на вкладку «Формы» (или «Поле ввода»).
  3. В разделе «Быстрый выбор» установим значение в положение «Использовать».

Теперь при нажатии на поле ввода система сразу откроет компактный выпадающий список со всеми элементами данного справочника.

Способ Б. Классический выбор без выпадающего списка истории

Если справочник крупный (например, обширная «Номенклатура»), вываливать весь список в выпадающее окно нельзя — это затормозит систему. Однако мы можем убрать раздражающую кнопку «Показать все» и сделать так, чтобы по нажатию на кнопку выбора сразу открывалось стандартное окно справочника:

  1. Откроем управляемую форму документа и выберем элемент поля ввода (колонку таблицы), связанный со справочником.
  2. В свойствах этого элемента найдем категорию «Параметры выбора и ввода».
  3. Установим свойство ИсторияВыбораПриВводе в положение «Не использовать».
  4. Установим свойство КнопкаВыпадающегоСписка в значение «Нет».
  5. Установим свойство КнопкаВыбора в значение «Да».

После этого поле ввода избавится от истории и при клике на стандартную кнопку с троеточием пользователь мгновенно попадет в форму выбора справочника.

Способ В. Программный список выбора

Для продвинутых задач можно использовать программное формирование списка. Например, в событии поля НачалоВыбора мы можем отключить стандартное поведение платформы и вывести только актуальные позиции:


&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы выбора
    СтандартнаяОбработка = Ложь;
    
    // Формируем свой список значений (например, топ-10 популярных товаров)
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.Добавить(ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"), "Выберите товар...");
    
    // Заполняем список актуальными данными (можно получить запросом с сервера)
    // ...
    
    // Показываем список непосредственно под полем ввода
    ПоказатьВыборИзСписка(Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект), СписокВыбора, Элемент);
    
КонецПроцедуры

Часть 3. Борьба с растягиванием колонок на всю ширину формы

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

Рассмотрим несколько проверенных способов борьбы с этой проблемой.

Метод 1. Настройка свойств колонок «Растягивать по горизонтали»

По умолчанию у всех колонок свойство растягивания установлено в значение «Авто». Чтобы зафиксировать размеры колонок:

  1. Для колонок с фиксированной длиной данных (таких как «Количество», «Цена», «Сумма», «Дата», «Номер») принудительно установите свойство РастягиватьПоГоризонтали в значение «Нет».
  2. Укажите жесткое значение в свойстве Ширина (например, 10 или 12 символов) и заполните свойство МаксимальнаяШирина тем же числом.

Метод 2. Использование декоративной буферной колонки (Лайфхак)

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

  1. Добавим в самый конец нашей таблицы на форме новую колонку.
  2. Оставим свойство ПутьКДанным для этой колонки пустым (она не будет связана ни с какими реквизитами базы данных).
  3. Уберем у нее текст заголовка.
  4. Установим свойство РастягиватьПоГоризонтали в значение «Да».

В результате все ваши реальные колонки («Товар», «Количество», «Цена», «Сумма») сохранят свой красивый, компактный и строго заданный размер, а все лишнее свободное пространство монитора займет пустая, визуально незаметная декоративная колонка-буфер.

Метод 3. Оптимизация заголовков и использование подсказок

Часто колонки таблицы принудительно расширяются из-за слишком длинного текста заголовка в шапке (например, «Количество к поступлению на склад отправителя»). Чтобы избежать этого, выполним следующие действия:

Применяя эти несложные, но эффективные приемы программирования и настройки интерфейса, вы сможете создавать действительно качественные, производительные и дружелюбные к пользователям решения на платформе 1С:Предприятие 8.

← На главную