При разработке в среде 1С:Предприятие 8 начинающие специалисты часто сталкиваются с типовыми задачами настройки интерфейса и агрегации данных. Одной из таких задач является вывод итоговых сумм из табличной части документа непосредственно в форму списка, чтобы пользователям не приходилось открывать каждый документ для просмотра общей суммы. Кроме того, в процессе работы возникают вопросы эргономики: как сделать выбор элементов справочника более быстрым и как победить автоматическое растягивание колонок в управляемых формах.
В этой статье мы подробно и по шагам разберем решение всех трех вопросов, проанализируем лучшие практики и рассмотрим альтернативные подходы, которые помогут сделать ваши конфигурации быстрыми, а интерфейсы — удобными.
Попытка напрямую обратиться к «подвалу» табличной части из формы списка — это классическая методологическая ошибка. Подвал на форме формируется динамически «на лету» только тогда, когда конкретный документ открыт в памяти компьютера. База данных СУБД ничего не знает о визуальном подвале формы. Чтобы вывести сумму в список, эти данные необходимо физически хранить в базе данных или вычислять с помощью специальных запросов.
Рассмотрим самый надежный, производительный и рекомендуемый стандарт разработки 1С — сохранение суммы в отдельный реквизит документа.
Для реализации этого метода выполним следующие шаги:
СуммаДокумента с типом данных Число (длина 15, точность 2, неотрицательное).ПередЗаписью. Именно здесь мы будем автоматически рассчитывать сумму табличной части и записывать ее в наш новый реквизит шапки перед каждым сохранением документа.Пропишем в модуле объекта следующий код:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Рассчитываем сумму колонки "Сумма" нашей табличной части "Товары"
// и записываем результат в реквизит шапки "СуммаДокумента"
ЭтотОбъект.СуммаДокумента = ЭтотОбъект.Товары.Итог("Сумма");
КонецПроцедуры
После этого достаточно зайти в форму списка документа, открыть ее схему компоновки или настройки колонок и перетащить созданный реквизит СуммаДокумента на форму. Теперь при проведении или сохранении документов сумма будет записываться в базу данных и отображаться в списке.
Важный нюанс интерактивной работы: если пользователь меняет строки в табличной части открытого документа, значение реквизита в шапке формы не обновится мгновенно, а изменится только после записи. Чтобы исправить это и сделать интерфейс отзывчивым, настроим моментальный пересчет на форме документа:
ПриИзменении и сгенерируем для него обработчик на клиенте.
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
// Обновляем значение реквизита на форме сразу при редактировании строк
Объект.СуммаДокумента = Объект.Товары.Итог("Сумма");
КонецПроцедуры
Если по каким-то причинам изменять структуру метаданных и добавлять новый реквизит запрещено, можно пойти по пути динамического расчета. Для этого в свойствах динамического списка формы списка документов необходимо включить флаг «Произвольный запрос» и написать следующий SQL-запрос:
ВЫБРАТЬ
ДокументПродажа.Ссылка КАК Ссылка,
ДокументПродажа.Дата КАК Дата,
ДокументПродажа.Номер КАК Номер,
ЕСТЬNULL(ТаблицаСумм.ВсегоСумма, 0) КАК СуммаДокумента
ИЗ
Документ.Продажа КАК ДокументПродажа
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
ПродажаТовары.Ссылка КАК Ссылка,
СУММА(ПродажаТовары.Сумма) КАК ВсегоСумма
ИЗ
Документ.Продажа.Товары КАК ПродажаТовары
ГРУППИРОВАТЬ ПО
ПродажаТовары.Ссылка
) КАК ТаблицаСумм ПО ТаблицаСумм.Ссылка = ДокументПродажа.Ссылка
Внимание: используйте этот метод с осторожностью! При больших объемах данных в информационной базе такое левое соединение с табличной частью приведет к существенному замедлению работы формы списка, так как СУБД будет вынуждена рассчитывать сумму по всем строкам при каждой прокрутке экрана пользователем.
В современном интерфейсе «Такси» при попытке выбрать значение в поле ввода система по умолчанию активирует интеллектуальный поиск. Она показывает историю последних выборов (около 4-5 позиций) и предлагает нажать кнопку «Показать все» для перехода к полному справочнику. Если справочник небольшой и пользователю неудобно делать лишние клики, такое поведение можно изменить.
Выясним, как настроить систему для мгновенного доступа к элементам:
Если справочник содержит ограниченное количество элементов (например, до 50 позиций, такие как «Склады», «Статьи затрат», «Организации»), лучшим решением будет активация быстрого выбора:
Теперь при нажатии на поле ввода система сразу откроет компактный выпадающий список со всеми элементами данного справочника.
Если справочник крупный (например, обширная «Номенклатура»), вываливать весь список в выпадающее окно нельзя — это затормозит систему. Однако мы можем убрать раздражающую кнопку «Показать все» и сделать так, чтобы по нажатию на кнопку выбора сразу открывалось стандартное окно справочника:
ИсторияВыбораПриВводе в положение «Не использовать».КнопкаВыпадающегоСписка в значение «Нет».КнопкаВыбора в значение «Да».После этого поле ввода избавится от истории и при клике на стандартную кнопку с троеточием пользователь мгновенно попадет в форму выбора справочника.
Для продвинутых задач можно использовать программное формирование списка. Например, в событии поля НачалоВыбора мы можем отключить стандартное поведение платформы и вывести только актуальные позиции:
&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное открытие формы выбора
СтандартнаяОбработка = Ложь;
// Формируем свой список значений (например, топ-10 популярных товаров)
СписокВыбора = Новый СписокЗначений;
СписокВыбора.Добавить(ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"), "Выберите товар...");
// Заполняем список актуальными данными (можно получить запросом с сервера)
// ...
// Показываем список непосредственно под полем ввода
ПоказатьВыборИзСписка(Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект), СписокВыбора, Элемент);
КонецПроцедуры
Управляемый интерфейс 1С спроектирован по принципу «резиновой верстки» — платформа стремится занять всю полезную площадь экрана. По этой причине крайние правые колонки табличных частей часто некрасиво растягиваются на сотни пикселей вширь, оставляя гигантские пустые пространства в полях ввода.
Рассмотрим несколько проверенных способов борьбы с этой проблемой.
По умолчанию у всех колонок свойство растягивания установлено в значение «Авто». Чтобы зафиксировать размеры колонок:
РастягиватьПоГоризонтали в значение «Нет».Ширина (например, 10 или 12 символов) и заполните свойство МаксимальнаяШирина тем же числом.Даже если у всех информационных колонок отключить растягивание, платформа 1С все равно проигнорирует эти настройки для последней колонки списка, чтобы «залить» пустоту экрана до правого края. Чтобы обойти это ограничение, применим профессиональный прием:
ПутьКДанным для этой колонки пустым (она не будет связана ни с какими реквизитами базы данных).РастягиватьПоГоризонтали в значение «Да».В результате все ваши реальные колонки («Товар», «Количество», «Цена», «Сумма») сохранят свой красивый, компактный и строго заданный размер, а все лишнее свободное пространство монитора займет пустая, визуально незаметная декоративная колонка-буфер.
Часто колонки таблицы принудительно расширяются из-за слишком длинного текста заголовка в шапке (например, «Количество к поступлению на склад отправителя»). Чтобы избежать этого, выполним следующие действия:
Подсказка. При наведении курсора мыши пользователь всегда сможет увидеть развернутое описание колонки.ВысотаШапки до 2 или 3 строк. Это позволит платформе автоматически переносить длинные названия на несколько строк вместо неконтролируемого расширения колонок по горизонтали.Применяя эти несложные, но эффективные приемы программирования и настройки интерфейса, вы сможете создавать действительно качественные, производительные и дружелюбные к пользователям решения на платформе 1С:Предприятие 8.