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