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