Имя: Пароль:
1C
1С v8
Поле не найдено "Регистратор"
0 happysan
 
14.09.26
16:27
Доброго времени суток!
Как говорил политик 90-х В.Черномырдин: "Никогда такого не было, и вот опять!».
Создаю программную расшифровку в СКД:
Набор данных(делалось и через "ВЫРАЗИТЬ", и без группировок, и тип периода в параметрах виртуальной таблицы менялся):
ВЫБРАТЬ
                СоставКнигиПокупок.Регистратор КАК Регистратор,
                СУММА(СоставКнигиПокупок.НДСОборот) КАК РасшифровкаСтроки120
ПОМЕСТИТЬ ВТ_РасшифровкаСтроки120
ИЗ
                РегистрНакопления.НДСЗаписиКнигиПокупок.Обороты(
                                               &НачалоПериода,
                                               &КонецПериодаГраница,
                                               Запись,
                                               Организация В (&Организация)
                                                               И Поставщик = &Контрагент
                                                               И Событие <> ЗНАЧЕНИЕ(Перечисление.СобытияПоНДСПокупки.ПредъявленНДСКВычету0)
                                                               И НЕ ЗаписьДополнительногоЛиста
                                                               И ТИПЗНАЧЕНИЯ(СчетФактура) <> ТИП(Документ.СводнаяСправкаНДС)) КАК СоставКнигиПокупок

СГРУППИРОВАТЬ ПО
                СоставКнигиПокупок.Регистратор

Код расшифровки:
&НаСервере
Функция ПолучитьПараметрыОсновнойСКД(Контрагент)

                ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
                
                ПараметрыКомпоновкиОрганизация = ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
                ПараметрКомпоновкиОрганизация = ПараметрыКомпоновкиОрганизация.Элементы.Найти("Организация");
                ИдентификаторНастройкиОрганизация = ПараметрКомпоновкиОрганизация.ИдентификаторПользовательскойНастройки;
                КоллекцияОрганизация = ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
                ПараметрПользовательскихНастроекОрганизация = КоллекцияОрганизация.Найти(ИдентификаторНастройкиОрганизация);
                
                Если ПараметрПользовательскихНастроекОрганизация <> Неопределено Тогда
                               ЗначениеОрганизации = ПараметрПользовательскихНастроекОрганизация.Значение;
                КонецЕсли;

                ПараметрыКомпоновкиПериод = ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
                ПараметрКомпоновкиПериод = ПараметрыКомпоновкиПериод.Элементы.Найти("Период");
                ИдентификаторНастройкиПериод = ПараметрКомпоновкиПериод.ИдентификаторПользовательскойНастройки;
                КоллекцияПериод = ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
                ПараметрПользовательскихНастроекПериод = КоллекцияПериод.Найти(ИдентификаторНастройкиПериод);
                
                Если ПараметрПользовательскихНастроекПериод <> Неопределено Тогда
                               ЗначениеПериод = ПараметрПользовательскихНастроекПериод.Значение;
                КонецЕсли;
                
                // Ищем нужный вариант по имени, заданному в конфигураторе
                Вариант = ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.Найти("Расшифровка строки 120 по юр. лицам");
                
                Если Вариант <> Неопределено Тогда
                КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(Вариант.Настройки.ПараметрыДанных, ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных);
                               // Загружаем настройки варианта в компоновщик
                               ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);  
                КонецЕсли;
                
                
                НастройкиОтчета =  ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
                
                КомпоновкаДанныхКлиентСервер.УстановитьПараметр(НастройкиОтчета, "Организация", ЗначениеОрганизации);
                КомпоновкаДанныхКлиентСервер.УстановитьПараметр(НастройкиОтчета, "Период", ЗначениеПериод);
                КомпоновкаДанныхКлиентСервер.УстановитьПараметр(НастройкиОтчета, "Контрагент", Контрагент);
                
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки, "Организация", ЗначениеОрганизации);
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки, "Период", ЗначениеПериод);

                НастройкиОтчета =  ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
                СхемаКомпоновки = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

                // Инициализация компоновщика
                КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
                МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки());
                
                ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
                ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
                
                ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
                ПроцессорВывода.УстановитьДокумент(Результат);
                ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);        

КонецФункции  

При попытке расшифровки выдаёт сообщение "Поле не найдено "Регистратор"".

Если кто-то в курсе, что системе нужно, то буду признателен в содействии!
1 yurikmellon2
 
14.09.26
16:36
(0) позабыты хлопоты, остановлен бег
вкалывают роботы, а не человек
GLM-5.3-Flash пишет что:
Что означает эта ошибка
«Поле не найдено "Регистратор"» — это ошибка компоновщика, а не запроса. Она возникает, когда в настройках (группировка, выбранные поля, отбор, сортировка) есть поле Регистратор, а в наборе данных макета такого поля нет. В вашем случае это почти наверняка происходит по одной из причин ниже.

Причина №1 (самая вероятная): запрос набора заканчивается на ПОМЕСТИТЬ
Запрос набора данных СКД обязан возвращать таблицу. Если пакетный запрос заканчивается на ПОМЕСТИТЬ ВТ_..., результат запроса не содержит ни строк, ни полей — набор данных получается «пустым», и любое поле из настроек варианта становится «не найденным».

Добавьте вторую часть пакета:

bsl

ВЫБРАТЬ
    СоставКнигиПокупок.Регистратор КАК Регистратор,
    СУММА(СоставКнигиПокупок.НДСОборот) КАК РасшифровкаСтроки120
ПОМЕСТИТЬ ВТ_РасшифровкаСтроки120
ИЗ
    РегистрНакопления.НДСЗаписиКнигиПокупок.Обороты(
        &НачалоПериода,
        &КонецПериодаГраница,
        Запись,
        ...) КАК СоставКнигиПокупок
СГРУППИРОВАТЬ ПО
    СоставКнигиПокупок.Регистратор
;
// ОБЯЗАТЕЛЬНО: финальная выборка — именно она формирует поля набора данных
ВЫБРАТЬ
    ВТ.Регистратор КАК Регистратор,
    ВТ.РасшифровкаСтроки120 КАК РасшифровкаСтроки120
ИЗ
    ВТ_РасшифровкаСтроки120 КАК ВТ
Кстати, СГРУППИРОВАТЬ ПО Регистратор и СУММА() в запросе вообще не нужны — СКД сама сгруппирует по Регистратору, если в варианте настроек настроены группировка по Регистратор и ресурс Сумма(РасшифровкаСтроки120).

После правки запроса проверьте на вкладке «Поля» набора данных, что Регистратор появился и у него не стоит «Ограничение доступности».

Причина №2: периодичность виртуальной таблицы
Поле Регистратор в таблице Обороты существует только при периодичности «Запись» (или «Регистратор»). При периодичности «Период»/«Авто» ошибка будет точно такой же. Оставьте третий параметр = Запись.

Причина №3: настройки варианта ссылаются на старый набор полей
Если вариант «Расшифровка строки 120 по юр. лицам» настраивался при другой редакции запроса (до добавления ПОМЕСТИТЬ, с другой периодичностью и т.п.), в его структуре осталась группировка/отбор по несуществующему пути. Откройте вариант в конфигураторе и проверьте, что все поля в группировках, отборе и порядке соответствуют актуальным полям набора (и это Регистратор, а не СоставКнигиПокупок.Регистратор).

Причина №4: две разные схемы
В коде настройки берутся из ОтчетОбъект.СхемаКомпоновкиДанных, а макет — из ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"). Если схема отчёта назначается программно (типовые отчёты на БСП так делают), это могут быть разные схемы, и поля не совпадут. Используйте один и тот же источник схемы в обоих местах.

Ошибки в самом коде
«Контрагент» устанавливается в никуда: вы кладёте его в переменную НастройкиОтчета, а в КомпоновщикМакета.Выполнить() передаёте заново полученный ПолучитьНастройки(). Параметр теряется.
СкопироватьЭлементы(...) выполняется до ЗагрузитьНастройки(), которая всё перезатирает — бессмысленно.
УстановитьПараметр в пользовательских настройках работает только для параметров, которые включены в пользовательские настройки (существуют как элементы коллекции) — иначе молча не сработает.
Надёжнее не трогать компоновщик основного отчёта, а работать с настройками варианта напрямую:

bsl

&НаСервере
Процедура ВывестиРасшифровку(Контрагент)

    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    Схема = ОтчетОбъект.СхемаКомпоновкиДанных;

    Вариант = Схема.ВариантыНастроек.Найти("Расшифровка строки 120 по юр. лицам");
    Настройки = ?(Вариант = Неопределено, Схема.НастройкиПоУмолчанию, Вариант.Настройки);

    УстановитьПараметр(Настройки, "Организация", ЗначениеОрганизации);
    УстановитьПараметр(Настройки, "НачалоПериода", ЗначениеПериод.ДатаНачала);
    УстановитьПараметр(Настройки, "КонецПериодаГраница",
        Новый Граница(ЗначениеПериод.ДатаОкончания, ВидГраницы.Включая));
    УстановитьПараметр(Настройки, "Контрагент", Контрагент);

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);

    Результат.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры
Как быстро продиагностировать
Откройте схему в конфигураторе → набор данных → вкладка «Поля»: есть ли там Регистратор физически.
Если поля нет — проблема в запросе (пункты 1–2 выше).
Если поле есть — проблема в настройках варианта: проверьте группировки/отбор/порядок на несуществующие пути.
В 90% случаев при такой ошибке с виртуальной таблицей оборотов виновато именно отсутствие финальной выборки после ПОМЕСТИТЬ.
2 Lama12
 
14.09.26
16:46
Мда... мельчаем 😒
3 happysan
 
14.09.26
17:22
(1) Благодарю)