Как вывести дату возврата из реквизитов документа в отчет 1С через регистры

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

При разработке отчетов в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда стандартных данных в регистрах накопления недостаточно. Типичный пример: отчет должен показывать не только количество инструментов на руках у клиентов, но и конкретную дату, когда этот инструмент должен быть возвращен. Если эта дата хранится только в документе «Выдача», она не попадет в отчет, построенный по виртуальным таблицам остатков или оборотов регистра. В этой статье мы подробно разберем, как правильно «пробросить» дату из документа в регистр и вывести её в отчет.

Анализ проблемы и выбор архитектурного решения

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

Рассмотрим два основных способа решения этой задачи:

  1. Добавление реквизита в регистр: Это классический путь, когда мы расширяем структуру регистра и программно заполняем новое поле при проведении.
  2. Связь таблиц в СКД: Более «легкий» способ, позволяющий не дублировать данные в базе, а получать дату напрямую из документа-регистратора в самом запросе отчета.

Мы подробно разберем оба варианта, так как каждый из них эффективен в определенных условиях.

Вариант 1. Модификация движений в модуле объекта документа

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

Теперь перейдем к программной части. Разберем по шагам, где и какой код нужно написать:

Во-первых, выясним, где находится нужный нам обработчик. Начинающие разработчики часто пытаются писать код в модуле формы, но это ошибка. Модуль формы отвечает за интерфейс, а за запись данных в базу отвечает Модуль объекта. Чтобы его открыть, найдите документ в дереве конфигурации, нажмите правую кнопку мыши и выберите «Открыть модуль объекта».

Во-вторых, найдем процедуру ОбработкаПроведения. Именно здесь описывается логика формирования движений. Рассмотрим пример кода, который нужно добавить в цикл обхода табличной части:


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

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

Вариант 2. Получение даты в отчете без изменения регистра (через СКД)

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

Разберем алгоритм настройки запроса в СКД:

  1. В схеме компоновки данных создаем новый набор данных — запрос.
  2. Выбираем основную таблицу (например, ИнструментыВНаличии.Остатки).
  3. Добавляем левое соединение (Left Join) с таблицей документа Выдача по полю Регистратор.
  4. Выбираем поле ДатаВозврата из таблицы документа.

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


ВЫБРАТЬ
    Остатки.Номенклатура,
    Остатки.Клиент,
    Остатки.КоличествоОстаток,
    Выдача.ДатаВозврата КАК ДатаВозврата
ИЗ
    РегистрНакопления.ИнструментыВНаличии.Остатки КАК Остатки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Выдача КАК Выдача
        ПО Остатки.Регистратор = Выдача.Ссылка

Важный момент: если вы используете виртуальную таблицу остатков, поле Регистратор в ней недоступно напрямую. В таких случаях дату лучше получать через таблицу ОстаткиИОбороты или все же использовать Вариант 1 с записью в реквизит регистра.

Тонкости оформления даты в отчете

При выводе даты в отчет пользователи часто жалуются на некрасивый вид пустых значений (например, «01.01.0001 0:00:00»). Выясним, как сделать отчет профессиональным.

Рассмотрим настройку Оформления в СКД:

Перейдите на вкладку «Наборы данных», выберите поле ДатаВозврата. В колонке «Оформление» установите параметр «Формат». Используйте строку формата ДФ=dd.MM.yyyy. Чтобы скрыть пустые даты, в поле «Выражение представления» можно прописать условие, которое будет возвращать пустую строку, если дата не заполнена.

Также полезно использовать свойство «Роль» для поля периода в СКД. Если вы решите выводить дату возврата как дополнительный разрез, убедитесь, что СКД понимает, что это не измерение, участвующее в расчете итогов, а дополнительная информация.

Резюме по работе с регистрами накопления

Подведем итог нашему исследованию. Для того чтобы успешно вывести дату из документа в отчет, мы должны:

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

← На главную