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