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