При разработке отчетов в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда стандартных данных в регистрах накопления недостаточно. Типичный пример: отчет должен показывать не только количество инструментов на руках у клиентов, но и конкретную дату, когда этот инструмент должен быть возвращен. Если эта дата хранится только в документе «Выдача», она не попадет в отчет, построенный по виртуальным таблицам остатков или оборотов регистра. В этой статье мы подробно разберем, как правильно «пробросить» дату из документа в регистр и вывести её в отчет.
Прежде чем приступать к написанию кода, давайте проанализируем ситуацию. У нас есть документ Выдача, в котором зафиксирована ДатаВозврата. Есть регистр накопления, который хранит информацию о движениях инструментов. Наша задача — сделать так, чтобы при проведении документа эта дата записывалась в регистр, откуда её сможет легко «подцепить» Система компоновки данных (СКД).
Рассмотрим два основных способа решения этой задачи:
Мы подробно разберем оба варианта, так как каждый из них эффективен в определенных условиях.
Если мы решили, что дата должна физически храниться в регистре, первым делом нам нужно добавить новое поле в сам регистр накопления. Важный нюанс: добавляйте дату именно как Реквизит, а не как Измерение. Измерения влияют на уникальность записей и раздувают таблицы итогов, что для справочной информации (каковой является дата возврата) совершенно излишне.
Теперь перейдем к программной части. Разберем по шагам, где и какой код нужно написать:
Во-первых, выясним, где находится нужный нам обработчик. Начинающие разработчики часто пытаются писать код в модуле формы, но это ошибка. Модуль формы отвечает за интерфейс, а за запись данных в базу отвечает Модуль объекта. Чтобы его открыть, найдите документ в дереве конфигурации, нажмите правую кнопку мыши и выберите «Открыть модуль объекта».
Во-вторых, найдем процедуру ОбработкаПроведения. Именно здесь описывается логика формирования движений. Рассмотрим пример кода, который нужно добавить в цикл обхода табличной части:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Очищаем движения, если это предусмотрено логикой
Движения.ИнструментыВНаличии.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
// Создаем новую запись в регистре
Движение = Движения.ИнструментыВНаличии.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
// Заполняем основные измерения
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Клиент = ЭтотОбъект.Контрагент;
Движение.Количество = ТекСтрокаТовары.Количество;
// Добавляем нашу дату возврата из реквизита документа
// Предположим, что ДатаВозврата находится в шапке документа
Движение.ДатаВозврата = ЭтотОбъект.ДатаВозврата;
КонецЦикла;
КонецПроцедуры
После внесения изменений обязательно нужно выполнить перепроведение документов. Помните: код срабатывает только в момент нажатия кнопки «Провести». Если документы были созданы ранее, в регистре поле останется пустым, пока вы не перепроведете их вручную или через обработку «Групповое перепроведение документов».
Проанализируем ситуацию: если ваша база уже содержит тысячи документов, перепроводить их может быть долго и рискованно (могут «поплыть» границы последовательностей или закрытые периоды). В этом случае мы можем обойтись без модификации регистра, используя возможности Системы компоновки данных.
Разберем алгоритм настройки запроса в СКД:
ИнструментыВНаличии.Остатки).Выдача по полю Регистратор.ДатаВозврата из таблицы документа.Посмотрим, как выглядит пример такого запроса:
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.Клиент,
Остатки.КоличествоОстаток,
Выдача.ДатаВозврата КАК ДатаВозврата
ИЗ
РегистрНакопления.ИнструментыВНаличии.Остатки КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Выдача КАК Выдача
ПО Остатки.Регистратор = Выдача.Ссылка
Важный момент: если вы используете виртуальную таблицу остатков, поле Регистратор в ней недоступно напрямую. В таких случаях дату лучше получать через таблицу ОстаткиИОбороты или все же использовать Вариант 1 с записью в реквизит регистра.
При выводе даты в отчет пользователи часто жалуются на некрасивый вид пустых значений (например, «01.01.0001 0:00:00»). Выясним, как сделать отчет профессиональным.
Рассмотрим настройку Оформления в СКД:
Перейдите на вкладку «Наборы данных», выберите поле ДатаВозврата. В колонке «Оформление» установите параметр «Формат». Используйте строку формата ДФ=dd.MM.yyyy. Чтобы скрыть пустые даты, в поле «Выражение представления» можно прописать условие, которое будет возвращать пустую строку, если дата не заполнена.
Также полезно использовать свойство «Роль» для поля периода в СКД. Если вы решите выводить дату возврата как дополнительный разрез, убедитесь, что СКД понимает, что это не измерение, участвующее в расчете итогов, а дополнительная информация.
Подведем итог нашему исследованию. Для того чтобы успешно вывести дату из документа в отчет, мы должны:
Модуль объекта для написания логики проведения.Реквизит регистра, сохраняя производительность системы.Теперь, вооружившись этими знаниями, вы сможете решить задачу отображения любых дополнительных данных в отчетах 1С, обеспечив пользователям максимально информативный и удобный инструмент для работы.