Как добавить колонку с ценой в отчет «Ведомость по товарам на складах» и избежать ошибок?

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

При доработке типовых отчетов на системе компоновки данных (СКД), таких как Ведомость по товарам на складах, часто возникают сложности. Одной из наиболее частых является ошибка Несоответствие типов (Параметр номер \"1\") при использовании виртуальных таблиц. Давайте подробно разберем, почему она возникает и как правильно реализовать вывод закупочных цен.

Разбор причины ошибки «Несоответствие типов»

Ошибка возникает, когда система компоновки данных не может корректно интерпретировать параметр, передаваемый в виртуальную таблицу СрезПоследних. Чаще всего это происходит по следующим причинам:

  1. Несоответствие типов: Первый параметр виртуальной таблицы — это Период. Если в параметрах СКД он имеет тип «Строка» или не определен, а система ожидает тип «Дата», возникает сбой.
  2. Автоматическое заполнение: Типовые отчеты 1С активно используют модуль объекта. В процедуре ПриКомпоновкеРезультата программно могут устанавливаться значения параметров. Если вы добавили свой запрос с параметрами, а типовой код пытается их переопределить неверно, возникнет конфликт.

Чтобы понять, что происходит, используйте отладчик. Поставьте точку останова в модуле объекта на методе КомпоновщикНастроек.ВыполнитьНастройку() и посмотрите, какие значения передаются в параметры СКД. Часто вы увидите, что параметр &П (который возник из-за сокращенного имени в тексте ошибки) подставляется типовым механизмом.

Решение проблемы дублирования строк при соединении таблиц

Важным аспектом является логика работы с ценами. Если вы просто присоединяете регистр ЦеныНоменклатурыПоставщиков.СрезПоследних к остаткам, вы неизбежно столкнетесь с «размножением» строк. Например, если на один товар установлены цены от трех разных поставщиков, система выдаст три строки с остатком, что приведет к неверным итогам в отчете.

Для решения этой задачи воспользуйтесь следующими рекомендациями:

Вариант 1: Использование агрегатных функций

Если вам нужно вывести одну «усредненную» или конкретную цену, используйте агрегатные функции внутри запроса. Это позволит «схлопнуть» записи до одной строки на каждую номенклатуру.


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

Вариант 2: Создание отдельного отчета «с нуля»

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

Преимущества создания своего отчета:

Советы по разработке

Всегда проверяйте, что именно вы используете в качестве источника цен. Если цены хранятся в ЦеныНоменклатурыПоставщиков, помните, что это данные конкретных поставщиков. Возможно, для целей управленческого учета вам стоит использовать ЦеныНоменклатуры, где заданы типы цен, что значительно упростит соединение и предотвратит дубли.

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

Следите за тем, чтобы параметры &НачалоПериода и &КонецПериода (или иные, используемые в виртуальных таблицах) были жестко типизированы в настройках СКД (вкладка «Параметры» в конструкторе СКД). Это гарантирует, что система не будет пытаться передать «неверный тип» в запрос.

← На главную