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

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Метод 1: Добавление нового реквизита в метаданные документа

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

Рассмотрим пошаговый алгоритм реализации этого метода:

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

Пример кода для модуля объекта, который автоматически фиксирует дату при закрытии обращения:


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

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

Метод 2: Программное добавление колонки и обработка событий формы

Иногда требуется добавить колонку без изменения структуры метаданных (чтобы не снимать объект с полной поддержки) или если данные для этой колонки вычисляются динамически. В обычных формах для этого используется программное создание элементов формы в событии ПриОткрытии или ПередОткрытием.

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


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

// Установка перехватчика события
УстановитьДействие("ПередОткрытием", Новый Действие("МояПередОткрытием"));

Важно помнить, что при программном добавлении элементов в обычных формах нам нужно вручную управлять их поведением и отображением данных.

Метод 3: Использование события ПриВыводеСтроки для визуализации данных

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

Проанализируем пример реализации, где мы выводим данные в колонку, основываясь на данных текущей строки списка:


Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Предположим, дата закрытия хранится в связанном регистре или вычисляется
    Если ДанныеСтроки.Ссылка.Закрыто Тогда
        ОформлениеСтроки.Ячейки.ДатаЗакрытия.УстановитьТекст(Формат(ДанныеСтроки.Ссылка.ДатаЗакрытия, "ДФ=dd.MM.yyyy"));
        
        // Дополнительно можно выделить закрытые обращения цветом
        ОформлениеСтроки.ЦветФона = Новый Цвет(230, 230, 230); // Светло-серый
    Иначе
        ОформлениеСтроки.Ячейки.ДатаЗакрытия.УстановитьТекст("В работе");
    КонецЕсли;
КонецПроцедуры

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

Оптимизация производительности: Метод ПриПолученииДанных

Разберем, почему для высоконагруженных списков ПриПолученииДанных предпочтительнее. Это событие вызывается один раз для всей пачки строк, которые система планирует вывести на экран. Мы можем собрать все ссылки на документы из этой пачки и выполнить один запрос к базе данных, что в десятки раз быстрее, чем делать запросы в цикле ПриВыводеСтроки.

Посмотрим на пример реализации эффективного получения данных:


Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    // Создаем соответствие для хранения ссылок и их оформлений
    СоответствиеСсылок = Новый Соответствие;
    МассивСсылок = Новый Массив;
    
    Для Каждого Оформление Из ОформленияСтрок Цикл
        МассивСсылок.Добавить(Оформление.ДанныеСтроки.Ссылка);
        СоответствиеСсылок.Вставить(Оформление.ДанныеСтроки.Ссылка, Оформление);
    КонецЦикла;
    
    // Выполняем один запрос ко всем нужным данным
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Ссылка, ДатаЗакрытия ИЗ Документ.Обращение ГДЕ Ссылка В (&МассивСсылок)";
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ТекущееОформление = СоответствиеСсылок.Получить(Выборка.Ссылка);
        ТекущееОформление.Ячейки.ДатаЗакрытия.УстановитьТекст(Выборка.ДатаЗакрытия);
    КонецЦикла;
КонецПроцедуры

Альтернатива: Произвольный запрос в динамическом списке

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

Рассмотрим преимущества этого подхода:

Например, текст запроса может выглядеть так:


ВЫБРАТЬ
    Док.Ссылка,
    Док.Номер,
    Док.Дата,
    ЕСТЬNULL(РегистрСведений.ДатыЗакрытия.ДатаСобытия, DATETIME(1,1,1)) КАК ДатаЗакрытия
ИЗ
    Документ.Обращение КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗакрытия КАК ДатыЗакрытия
    ПО Док.Ссылка = ДатыЗакрытия.ДокументОснование

Подведение итогов

Выясним, какой метод выбрать именно вам. Если вы планируете активно использовать дату закрытия для отчетов, фильтрации и поиска — добавляйте реквизит в метаданные (Метод 1). Это обеспечит максимальную стабильность. Если же ваша задача — просто визуально проинформировать пользователя о дате, не перегружая структуру базы данных, используйте событие ПриПолученииДанных (Метод 4) или произвольный запрос.

Не забывайте про пользовательские настройки. В обычных формах пользователи часто сами скрывают колонки через меню «Настройка списка». Если вы добавили колонку, а она не появилась — проверьте настройки видимости в контекстном меню табличного поля. Сочетание программных методов и грамотного проектирования метаданных позволит вам создать удобный и производительный интерфейс для бухгалтерии и других подразделений.

← На главную