Синтаксическая ошибка справочники найтипокоду

  

ЭЦ

04.04.13 — 16:34

ГОСПОДА !

Имеется отчет на СКД.

В схеме компоновки имеется параметр с выражением

Справочники.ПодразделенияОрганизаций.НайтиПоКоду(«000000064»)

отчет нормально работает.

Теперь надо его запустить из формы документа

//—————————-

Отчет = Отчеты.sРезультатыОпроса.Создать();

СхемаКомпоновкиДанных = Отчет.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);

ЭлтНастройки = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(«ОПРОС»);

ЭлтНастройки.Значение = Ссылка;

ЭлтНастройки.Использование = Истина;

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(«Опрос»,Ссылка);

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

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

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

ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

//————————-

Вылетает при инициализации ПроцессораКомпоновки с диагностикой

Синтаксическая ошибка «Справочники.ПодразделенияОрганизаций.НайтиПоКоду»

В чем тут может быть?

Прошу подсказать.

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

33 Comments

  1. Очень помогает в ситуациях, которые по-началу не поддаются объяснению )

    Reply

  2. К СКД ещё только приступил, поэтому не могу вполне оценить нужность этого механизма, но нутром чую, что он очень и очень пригодится. Попробую его понять и ипользовать. Спасибо!

    Reply

  3. В дерево отчетов попадают используемые наборы данных типа Запрос

    Объединения содержат вложенные наборы данных

    Наборы данных типа Объект представляются как простой запрос описания таблицы (перечислены поля)

    Также платформа добавляет системные наборы данных (для построения иерархии и т.п.)

    Далее идет отдельная ветка «Схема», в которой находится исходная схема КД

    Reply

  4. В самой консоли появилась дополнительная фишка — отладка запросов с передачей параметров типа «Таблица значений». Есть, конечно, ряд ограничений (на типизацию колонок), но в целом может пригодиться.

    Reply

  5. Хорошая идея и хорошая реализация. Молодец.

    Reply

  6. (6) Спасибо и за обработку, и за ссылку на курс по СКД.

    Reply

  7. отлично, будем пробовать 🙂

    Reply

  8. Спасибо. Давно искала что-то подобное 🙂

    Reply

  9. Пытаюсь добавить параметры из запроса, выдает ошибку {Форма.Форма.Форма(1560)}: Ошибка при вызове метода контекста (НайтиПараметры): {(56, 1)}: Синтаксическая ошибка

    Reply

  10. на форме «Параметры» есть кнопка «Список» она в общем-то и не нужна, ведь когда выбираем значение параметра, то можем там указать, что это список значений и заполнить его. А вот если бы там была кнопка «Таблица значений» и она бы добавляла в параметр значение «Таблица значений» было бы классно.

    Reply

  11. (12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)

    Reply

  12. (13) mlv84, Таблицу значений я добавил для отладочных целей. Самостоятельный ее ввод мне, например, не очень нужен (даже ее редактирование). Это создаст кучу проблем (интерфейс, юзабилити, типизация колонок и т.д.) Но если вам это необходимо и думаете что это будет интересно сообществу — дерзайте! Выкладывайте. или напишите tezin, он может добавить этот функционал в следующих версиях.

    Reply

  13. Serj1C пишет:

    (12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)

    Это да, прошу прощения. Запрос просто был большой. Кусочек потерялся при копировании. А таблицу значений придумала как обойти. Спасибо.

    Reply

  14. (16) mlv84, Поделись, плиз, как придумала

    Reply

  15. ничего сверх сложного. В моём случае в таблице значений была только одна строка. Я просто посмотрела в отладчике какие там значения. А потом в запросе их явно указала.

    У меня было так:

    «ВЫБРАТЬ

    | ТаблицаПериодов.ДатаНачала КАК ДатаНачала,

    | ТаблицаПериодов.ДатаОкончания КАК ДатаОкончания,

    | ТаблицаПериодов.ГруппаНачислений

    |ПОМЕСТИТЬ ИсходныеДанные

    |ИЗ

    | &ТаблицаПериодов КАК ТаблицаПериодов

    ………………..

    а сделала так:

    «ВЫБРАТЬ

    | ДАТАВРЕМЯ(2011, 04, 01, 0,0,0) КАК ДатаНачала,

    | ДАТАВРЕМЯ(2011, 04, 30, 23,59,59) КАК ДатаОкончания,

    | «%ДопНачисление%» как ГруппаНасилений //У меня здесь строковое значение передавалось

    КАК ТаблицаПериодов

    Reply

  16. (18) mlv84, Да, я тоже так делаю:

    Выбрать &Контрагент1 Контрагент, 15000 Сумма Поместить ТЗ

    Объединить все Выбрать &Контрагент2, 20000

    Объединить все Выбрать &Контрагент3, NULL

    и т.д.

    Reply

  17. Описанные функции (отладки запросов из компоновки) реализованы также в подсистеме «Инструменты разработчика» (функция Отладить, консоль компоновки данных) http://infostart.ru/public/15126/ . Там же там вы найдете много исследовательских инструментов в консоли компоновки данных, которые позволяет вам лучше понять, как устроен макет компоновки и расшифровка.

    Reply

  18. (20) tormozit, да, ваша подсистема выше всех похвал

    Reply

  19. UPD 29.02.2012

    Обновление оригинальной консоли до последней версии + возможность редактирования параметра с типом ТаблицаЗначений (интерфейс не дружественный, юзабилити на нуле, но если сильно понадобится, то редактируется).

    Reply

  20. Очень помогает как раз разбираюсь с СКД

    Reply

  21. Функционал отличный. Интерфейс хотелось бы по компактнее.

    Reply

  22. {Форма.ФормаОтладкаСКД.Форма(47)}: Ошибка при вызове метода контекста (Инициализировать)

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

    по причине: Ошибка компоновки данных

    по причине: Ошибка инициализации

    по причине: Ошибка в выражении

    по причине: Синтаксическая ошибка «Справочники.ТехнологическиеОперации.НайтиПоКоду»

    Стандартная СКД принимает выражение Параметра в таком виде. Если элемент справочника не предопределенный, его можно найти позже — ПоКоду, ну или ПоНаименованию, что хуже в случае редактирования Наименования 😉

    При вызове Отладка СКД и нажатии Сформировать обработка не понимает такого выражения для Параметра.

    Reply

  23. (25) alex_shkut, Любопытно, никогда не замечал. Баг платформы. Могу отписать на 1c@1c.ru, но не думаю, что скоро исправят.

    Reply

  24. Возможность отлаживать отчет на СКД из формы отчета — это очень удобно. Спасибо. Имя файла в пути поправьте.

    Reply

  25. При использовании набора данных «Объект»:

    {Форма.Форма.Форма(791)}: Ошибка при вызове метода контекста (Выполнить): {(9, 2)}: Таблица не найдена «РезультатОсновногоЗапроса»

    <<?>>РезультатОсновногоЗапроса КАК Таблица

    РезультатОсновногоЗапроса — это имя объекта (внешнего набора данных).

    Reply

  26. Вот сам и отвечаю на свой пост (25)

    В Запроснике надо найти нечто похожее (не вскрывал его :))

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

    А вот описание значения Истина в конце функции:

    <ВозможностьИспользованияВнешнихФункций> (необязательный)

    Тип: Булево. Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.

    Значение по умолчанию: Ложь

    В моей текущей ситуации это была именно внешняя функция, но думаю, что это касается и прочих «СКД недвижковых» функций типа Справочники.НайтиПоКоду().

    Мне помогло, думаю что в Запроснике этого будет достаточно, чтобы ошибка исчезла.

    Нашел, где это: ФормаОтладкаСКД строка 47

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

    надо: ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,истина);

    Reply

  27. (30) alex_shkut, мда, не тривиально… Ок, мотаем на ус!

    Reply

  28. Почему Вы не пишите вначале, что это для обычных форм, я получается зря потратила стартмани!

    Reply

  29. (32) Публикация 2011 года, на сриншотах обычное приложение…

    Давайте я вам вышлю инструменты, которые использую сейчас в работе

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

jediAlex

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

1

Отчет СКД: не заполняются значения параметров

12.11.2018, 10:37. Показов 21198. Ответов 36

Метки нет (Все метки)


Здравствуйте. Делаю отчет на СКД в собственной конфигурации 1С 8.3. суть отчета: выгрузить из регистра за период количество времени, списанное сотрудниками подразделений по дням. Вот запрос:

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
ВЫБРАТЬ     Сотрудники.Наименование КАК ФамилияИмяОтчество,     Сотрудники.Подразделение.Наименование + ЕСТЬNULL(Сотрудники.МаркерПодразделения.Наименование, "") КАК Подразделение,     ОтработаноЧасовОстаткиИОбороты.ПериодДень КАК ДатаОтчета,     ЕСТЬNULL(ОтработаноЧасовОстаткиИОбороты.КоличествоЧасовРасход, 0) КАК ЧасовВОтчете ИЗ     Справочник.Сотрудники КАК Сотрудники         ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработаноЧасов.ОстаткиИОбороты(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), , Авто, , ) КАК ОтработаноЧасовОстаткиИОбороты         ПО Сотрудники.Ссылка = ОтработаноЧасовОстаткиИОбороты.Сотрудник.Ссылка ГДЕ     Сотрудники.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусСотрудника.Работает)     И Сотрудники.Подразделение В(&МассивПодразделений)     И ОтработаноЧасовОстаткиИОбороты.Регистратор ССЫЛКА Документ.ЕжедневныйОтчет   УПОРЯДОЧИТЬ ПО     Подразделение

т.е. нужно получить информацию по всем сотрудникам из перечня подразделений и увидеть, по каким из работающих сотрудников есть списания в выбранном периоде и в какой день, а по каким — нет. Захотел присвоить значения параметров программно — чтобы их не набирать каждый раз для формирования отчета, а сразу заполнить при открытии формы. Сделал так в форме отчета:

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 
&НаСервере Функция ПодразделенияДляОтчета() Экспорт МассивПодразделений=Новый массив; МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000001"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000003"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000004"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000005"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000006"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000007"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000008"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000009"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000010"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000011"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000012"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000013"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000020")); Возврат МассивПодразделений;   КонецФункции    &НаСервере Процедура ПриОткрытииНаСервере()     // Вставить содержимое обработчика.     ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МассивПодразделений");    ПараметрСКД.Использование = Истина;    ПараметрСКД.Значение  = ПодразделенияДляОтчета();     ПараметрНачалоПериода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");    ПараметрНачалоПериода.Использование = Истина;    Если ДеньНедели(ТекущаяДата()) >1 И ДеньНедели(ТекущаяДата()) <6 тогда    ПараметрНачалоПериода.Значение  = Текущаядата()-86400; иначе Если ДеньНедели(ТекущаяДата()) =1 тогда    ПараметрНачалоПериода.Значение  = Текущаядата()-3*86400; КонецЕсли; КонецЕсли;  ПараметрОкончаниеПериода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ОкончаниеПериода");    ПараметрОкончаниеПериода.Использование = Истина;    Если ДеньНедели(ТекущаяДата()) >1 И ДеньНедели(ТекущаяДата()) <6 тогда    ПараметрОкончаниеПериода.Значение  = Текущаядата()-86400; иначе Если ДеньНедели(ТекущаяДата()) =1 тогда    ПараметрОкончаниеПериода.Значение  = Текущаядата()-3*86400; КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ)     ПриОткрытииНаСервере(); КонецПроцедуры

ни один из параметров в режиме предприятия не заполняется… что не так делаю? помогите пожалуйста. Параметры отчета в СКД прилагаю.

Миниатюры

Отчет СКД: не заполняются значения параметров
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

12.11.2018, 10:37

36

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

12.11.2018, 10:59

2

jediAlex, Все это надо делать не в модуле формы и ПриОткрытии, а в модуле объекта отчета и в ПриКомпоновкиРезультата
А правильно делать — это в параметрах скд (ваш скрин) Вот там в выражениях и в доступных значениях настроить ваши значения параметров

0

340 / 315 / 43

Регистрация: 20.08.2014

Сообщений: 1,242

Записей в блоге: 1

12.11.2018, 11:06

3

Попробуйте параметры устанавливать в модуле объекта в процедуре ПриКомпоновкеРезультата().

0

jediAlex

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

12.11.2018, 12:04

 [ТС]

4

сделал в модуле объекта:

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка=Ложь; ПараметрСКД = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МассивПодразделений");    ПараметрСКД.Использование = Истина;    ПараметрСКД.Значение  = ПодразделенияДляОтчета();     ПараметрНачалоПериода = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");    ПараметрНачалоПериода.Использование = Истина;    Если ДеньНедели(ТекущаяДата()) >1 И ДеньНедели(ТекущаяДата()) <6 тогда    ПараметрНачалоПериода.Значение  = Текущаядата()-86400; иначе Если ДеньНедели(ТекущаяДата()) =1 тогда    ПараметрНачалоПериода.Значение  = Текущаядата()-3*86400; КонецЕсли; КонецЕсли;  ПараметрОкончаниеПериода = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ОкончаниеПериода");    ПараметрОкончаниеПериода.Использование = Истина;    Если ДеньНедели(ТекущаяДата()) >1 И ДеньНедели(ТекущаяДата()) <6 тогда    ПараметрОкончаниеПериода.Значение  = Текущаядата()-86400; иначе Если ДеньНедели(ТекущаяДата()) =1 тогда    ПараметрОкончаниеПериода.Значение  = Текущаядата()-3*86400; КонецЕсли; КонецЕсли;   КонецПроцедуры

ситуация та же… параметры не заполняются. Что не так опять делаю?

0

1117 / 671 / 195

Регистрация: 22.04.2013

Сообщений: 5,072

Записей в блоге: 1

12.11.2018, 12:29

5

а почему стандартная обработка ложь?
просто вы задаёте своих параметров или чего хотите, а уж компоновщик и прочие штуки пусть оно делает так, как ему полагается.
хотя вероятно дело не в этом

0

polax

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

12.11.2018, 16:39

6

jediAlex Устанавливаешь Ложь стандартной обработке, а работаешь только с Компоновщиком. Ну изменил компоновщик, а где макет, где процессор вывода? У тебя ничего не выполняется без этого. И если эти параметры в скд установлены как пользовательские, то устанавливает параметры не в Настройках, а в ПользовательскиеНастройки. Ну и еще раз, как минимум параметры дат можно попробовать выставить на закладке Параметы макета скд

Добавлено через 3 часа 50 минут
Вижу сложности. Вот нашел у себя пример. Мне нужно было перенести в нестандартную обработку пользовательские настройки (параметры и отбор), с просто настройками — по аналогии.

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)       СтандартнаяОбработка = Ложь;     КомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных;     ДН = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение.ДатаНачала;     ДО = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение.ДатаОкончания;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.ДатаНачала = ДН;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.ДатаОкончания = ДО;     Для каждого Эл Из КомпоновщикНастроек.Настройки.Отбор.Элементы  Цикл             Поле = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Эл.ИдентификаторПользовательскойНастройки);     Эл.Использование =  Поле.Использование;     Эл.ВидСравнения = Поле.ВидСравнения;     Эл.ПравоеЗначение = Поле.ПравоеЗначение;     Эл.ПредставлениеПользовательскойНастройки = Поле.ПредставлениеПользовательскойНастройки;             КонецЦикла;         Макет = КомпоновщикМакет.Выполнить(СхемаКомпоновкиДанных, ЭтотОбъект.КомпоновщикНастроек.Настройки, ДанныеРасшифровки);     ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;     ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);     ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;     ПроцессорВывода.УстановитьДокумент(ДокументРезультат);     ПроцессорВывода.Вывести(ПроцессорКомпоновки);     ДокументРезультат.ПоказатьУровеньГруппировокСтрок(1); // Сворачиваем группировки второго уровня вложенности     КонецПроцедуры

0

jediAlex

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

13.11.2018, 11:51

 [ТС]

7

попробовал сделать по примеру:

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 
СтандартнаяОбработка = Ложь;     КомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных;      Если ДеньНедели(ТекущаяДата()) >1 И ДеньНедели(ТекущаяДата()) <6 тогда    ДН  = Текущаядата()-86400; иначе Если ДеньНедели(ТекущаяДата()) =1 тогда    ДН  = Текущаядата()-3*86400; КонецЕсли; КонецЕсли; Если ДеньНедели(ТекущаяДата()) >1 И ДеньНедели(ТекущаяДата()) <6 тогда    ДО  = Текущаядата()-86400; иначе Если ДеньНедели(ТекущаяДата()) =1 тогда    ДО  = Текущаядата()-3*86400; КонецЕсли; КонецЕсли; Подраздел=ПодразделенияДляОтчета();     //Подраздел=КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение.МассивПодразделений;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.ДатаНачала = ДН;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.ДатаОкончания = ДО;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.МассивСотрудников = Подраздел;     Для каждого Эл Из КомпоновщикНастроек.Настройки.Отбор.Элементы  Цикл         Поле = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Эл.ИдентификаторПользовательскойНастройки);     Эл.Использование =  Поле.Использование;     Эл.ВидСравнения = Поле.ВидСравнения;     Эл.ПравоеЗначение = Поле.ПравоеЗначение;     Эл.ПредставлениеПользовательскойНастройки = Поле.ПредставлениеПользовательскойНастройки;         КонецЦикла;         Макет = КомпоновщикМакет.Выполнить(СхемаКомпоновкиДанных, ЭтотОбъект.КомпоновщикНастроек.Настройки, ДанныеРасшифровки);     ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;     ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);     ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;     ПроцессорВывода.УстановитьДокумент(ДокументРезультат);     ПроцессорВывода.Вывести(ПроцессорКомпоновки);     ДокументРезультат.ПоказатьУровеньГруппировокСтрок(1); // Сворачиваем группировки второго уровня вложенности

в результате параметры не заполняются все равно… что не так делаю?

0

polax

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

13.11.2018, 12:20

8

jediAlex, Не надо просто копировать мой код. Адаптируйте его к своему. Например Параметры. У меня Меняется ОДИН параметр — Стандартный отчет (на скрине &Параметр) поэтому это ОДНА строка

1C
1 
КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2]

у вас нет стандартного отчета, у вас ДВЕ строки поэтому уже установка всего в Элементы[2] работать не может
И потом Окончание периода что это?
В общем, установите правильно параметры в макете скд и все получится

Миниатюры

Отчет СКД: не заполняются значения параметров
 

0

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

13.11.2018, 12:21

9

Куда и что ставить — пользуйтесь отладчиком и смотрите

0

jediAlex

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

13.11.2018, 13:39

 [ТС]

10

ни разу не делал такой вывод отчета(программно) поэтому не пойму что и как делать в данном случае…

Добавлено через 4 минуты
ОкончаниеПериода — параметр, который задается пользователем и используется для расчета конца периода. Я пробовал без этого обойтись — сразу в условии запроса писал
….

1C
1 
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработаноЧасов.ОстаткиИОбороты(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), Авто, , ) КАК ОтработаноЧасовОстаткиИОбороты

но при этом у меня не попадал в отчет конечный день интервала.

0

polax

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

13.11.2018, 22:05

11

jediAlex,

1C
1 
Извини в 13 уехал на работу в 21 приехал, раньше никак

Вот это правильно для моего варианта, неправильно для твоего

1C
1 2 3 4 
 //Подраздел=КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение.МассивПодразделений;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.ДатаНачала = ДН;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.ДатаОкончания = ДО;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение.МассивСотрудников = Подраздел

Замени на

1C
1 2 3 4 
 //Подраздел=КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение.МассивПодразделений;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0].Значение = ДН;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[3].Значение = ДО;     КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение = Подраздел

А вообще ставь точку останова и смотри значение КомпоновщикНастроек.Настройки.ПараметрыДанных.Элем енты, увидишь под каким индексом что стоит

0

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

14.11.2018, 09:37

 [ТС]

12

попробовал, как вы посоветовали. Параметры дат присвоились, а массив подразделений пустое значение… что не так с этим массивом?

Добавлено через 5 минут
ставил точку останова — при выполнении не останавливается

0

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

14.11.2018, 09:41

13

Цитата
Сообщение от jediAlex
Посмотреть сообщение

Подраздел=ПодразделенияДляОтчета();

Функция ПодразделенияДляОтчета() что возвращает? Проверяли? Дайте код этой функции

Добавлено через 1 минуту
Где ставили точку останова? Сначала запускаете конфигуратор, из него запускаете программу (отладку). Есть подозрение что сделали наоборот

0

jediAlex

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

14.11.2018, 09:51

 [ТС]

14

вот функция:

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
Функция ПодразделенияДляОтчета() Экспорт МассивПодразделений=Новый массив; МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000001"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000001"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000003"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000004"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000005"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000006"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000007"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000008"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000009"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000010"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000011"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000012"));         МассивПодразделений.Добавить(Справочники.Подразделения.НайтиПоКоду("000000013")); Возврат МассивПодразделений;   КонецФункции

точку ставлю на строке

1C
1 
КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение = Подраздел;

ставил и на строке

1C
1 
Подраздел=ПодразделенияДляОтчета();

чтоб посмотреть, что функция дает.. останова не происходит…

Добавлено через 1 минуту
код справочника — в виде строки

0

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

14.11.2018, 09:58

15

jediAlex, Раз параметры даты устанавливаются, значит код работает, отсюда — должна останавливаться по точке останова. Вариант один — не запущена отладка:

Цитата
Сообщение от polax
Посмотреть сообщение

Сначала запускаете конфигуратор, из него запускаете программу (отладку).

0

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

14.11.2018, 10:26

 [ТС]

16

отладка запущена

0

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

14.11.2018, 10:28

17

jediAlex, выгружайте dt. Так быстрее и проще разобраться

0

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

14.11.2018, 10:57

 [ТС]

18

выгрузил dt 17 МБ не прикрепляется…413 Request Entity Too Large

0

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,321

14.11.2018, 11:00

19

jediAlex, Его надо загрузить на любой файлообменник и ссылку с файлообменника выложить сюда

Добавлено через 44 секунды
Например сюда

0

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 622

14.11.2018, 18:06

 [ТС]

20

вот ссылка на ИБ данные правлда там до апреля 2018 г — более новую не мог даже по почте отправить себе с рабочего места из-за массы ограничений. На файлообменники вообще не могу заходить. Юзер —Админ без пароля. См отчет «НаличиОтчетовСотрудников»

Добавлено через 16 секунд
https://my-files.ru/z56the

0

Отчет на СКД. Обычное приложение. В отчете параметр заполняется «конструкцией» Справочники.Бренд.НайтиПоКоду(«000000159»). Да, я тоже осуждаю этот индусский код, но на его существование есть причины. Конструкция нормально работает под полными правами, и не работает под неполными (RLS есть, но в роях, установленных у проблемного пользователя его нет). При этом даже добавление всех прав на это справочник проблему не решает. Текст сообщения об ошибке: Ошибка исполнения отчета по причине: Ошибка получения данных по причине: Функция не найдена «Справочники.Бренд.НайтиПоКоду» В чем может быть причина и какие права надо дать пользователю, чтобы отчет заработал?

при компоновке иди по коду

Уверен что дело в правах? У меня, например, отчет с таким выражением в параметрах до сих пор работает у разных пользователей. Отчет был сделан давно, на какой версии платформы уже не помню, потом я что-то там дорабатывал и попробовал изменить выражение. Так вот после сохранения измененной версии отчета он стал выдавать ошибку как у тебя. При этом предыдущая версия работает и на новой платформе.   И да, у меня вообще используется «НайтиПоНаименованию».

. Не уверен, но по «симптомам» похоже именно на права. Платформа одна и та же (сейчас проверил). Захожу под пользователем с ПолныеПрава — работает. Под обычным пользователем — нет.

Может и права, у мнея работает как под полными правами так и под ограниченными. RLS нет вообще. Я не стал разбираться с этим глюком «работает — не трожь».

Попробуй: Все действия — Установить стандартные настройки

Нашел причину. Она, мягко говоря, экзотическая. Отчет строится по документам и у пользователя не было прав на «Просмотр». Добавление этого права и решило проблему. Сам я не очень понимаю, как это возможно и как это взаимосвязано, но тем не менее.

Добавление права на просмотр документа или справочника Бренды?

Документа, по которому строится отчет. На справочник право Просмотр было и добавление вообще всех прав на справочник результата не дало.

Короче очередное шаманское камлание. Метод Тыка в этот раз сработал.

Это стандартное поведение системы. Точно описано в документации, искать лень.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Main

Top

Interesting

500 ideas

Help

Follow us:

  • Follow us on Vkontakte

  • Follow us on Telegram

  • Follow us on Pinterest

  • Follow us on Odnoklassniki

Applications

  • iOS

  • Android

  • Huawei

PRODUCTS

  • Checklists

  • Button «Share»

  • Media program

COMMUNITY

  • Afisha LJ

  • Frank

  • Stylish merch

CHOOSE LANGUAGE

  • Privacy Policy

  • User Agreement

  • Help

LiveJournal — v.633

?

fixin

  • Readability

  • fixin

    Archive

    Readability

LiveJournal

Log in

No account?
Create an account

Remember me

Forgot password

If this type of authorization does not work for you, convert your account using the link

fixin

November 18 2020, 15:00

Странная «Синтаксическая ошибка» в СКД с макетом

Как поборол эту странную ошибку.

Читать далее: https://geniy1s.ru/strannaya-sintaksicheskaya-oshibka-v-skd-s-maketom/

СКДслучай из практики 1с

promo


fixin

december 31, 2037 16:57

1422

ЧаВо о Фиксине для новичков (блог переехал на fixinchik.ru)

UPD: Друзья, в августе 2019 года блог переехал на http://fixinchik.ru. Welcome! Добро пожаловать в журнал Осипова Сергея Александровича, известного также как Fixin и Гений 1С. Рекомендую ознакомиться с Часто Задаваемыми Вопросами обо мне. Что я хочу в подарок — список. Мой проект «…

Ошибка программной инициализации ПроцессораКомпоновкиДанных

Я
   ЭЦ

naïve

04.04.13 — 16:34

ГОСПОДА !

Имеется отчет на СКД.

В схеме компоновки имеется параметр с выражением

Справочники.ПодразделенияОрганизаций.НайтиПоКоду(«000000064»)

отчет нормально работает.

Теперь надо его запустить из формы документа

//—————————-

Отчет = Отчеты.sРезультатыОпроса.Создать();

СхемаКомпоновкиДанных = Отчет.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);

ЭлтНастройки = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(«ОПРОС»);

ЭлтНастройки.Значение = Ссылка;

ЭлтНастройки.Использование = Истина;

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(«Опрос»,Ссылка);

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

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

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

ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

//————————-

Вылетает при инициализации ПроцессораКомпоновки с диагностикой

Синтаксическая ошибка «Справочники.ПодразделенияОрганизаций.НайтиПоКоду»

В чем тут может быть?

Прошу подсказать.

  

ЭЦ

naïve

1 — 04.04.13 — 16:56

Вот так срабатывает :

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

Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи

Содержание

Поле объекта не обнаружено

1С ошибка Поле объекта не обнаружено

Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.

Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.

Такое сообщение платформа выдает, когда пытается обратиться к свойству объекта языка, которого у данного объекта нет. Не важно, что это за объект – документ, справочник, таблица значений , или сообщение пользователю.

  • Удалили табличную часть, к которой обращаемся в коде?
  • Переименовали реквизит, а в коде не исправили?
  • Заменили значение со ссылки на неопределено?

Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!

Как исправить? Исходя из природы ошибки – переименовать реквизит на нужное имя, отредактировать код, или использовать правильные обращения к стандартным свойствам объекта.

Например, у объекта “СообщениеПользователю” нет свойства “Таблица”, и следующий код приведет к ошибке:

Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = “Ошибка”;

Индекс находится за границами массива

1С ошибка Индекс находится за пределами массива

Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки “Индекс находится за границами массива”.

  • Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
  • Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
  • Ошибочное увеличение счетчика в цикле “Для”

 Как исправить? Для удаления элементов из коллекции по условию – использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла

Обращение к процедуре как к функции

ОШибка

Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.

Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.

А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.

Рассмотрим два примера:

1. Воспроизведем ошибку “Обращение к процедуре как к функции”. При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.

2. Воспроизведем ошибку “Обращение к процедуре объекта как к функции”. Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.

Как исправить? Ошибка тривиальная, и исправление тоже. Чаще всего, достаточно внимательно прочитать описание методов объекта во встроенной справке или синтакс-помощнике. Если метод является процедурой, то значений он возвращать не может. Следовательно, нужно модифицировать код так, чтобы такого ошибочного вызова не было.
Если же используется процедура, объявленная в коде, возможно, есть необходимость изменить ее на функцию, либо также скорректировать код, который эту процедуру использует.

Процедура не может возвращать значение

Родственная предыдущей ошибка. Для того, чтобы код возвращал какое-то значение, следует этот код размещать в функции, а не в процедуре.

В процедуре можно написать ключевое слово “Возврат” без параметров. Это будет означать выход из процедуры.

Следующий код является ошибочным, т.к. в теле процедуры Возврат используется с параметром:

Процедура ПроцедураНеМожетВозвращатьЗначение(Команда)
Возврат "Ошибка";
КонецПроцедуры

Как исправить? Платформа сама подсказывает, в каком месте кода ошибка. Нужно изменить текст модуля – либо удалить параметр у ключевого слова Возврат, либо убрать его вовсе, либо изменить процедуру на функцию – зависит от того, какая логика у вашей процедуры, и как вы предполагаете ее использовать.

Переменная не определена

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

  • Опечатка в имени переменной
  • Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
  • Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
  • Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.

Как исправить?

Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.

Значение не является значением объектного типа

Ошибка “Значение не является значением объектного типа” может возникнуть при неверном обращении к объекту языка. Объектный тип – это такие объекты языка, которые содержат в себе другие объекты – свойства, реквизиты и т.п. Эти свойства доступны через точку, например “Объект.СвойствоЭтогоОбъекта”

Но если через точку попытаться использовать какое-то значение, которое внутри себя свойств не имеет – например, любое значение примитивного типа – это и приведет к ошибке.

Разберем более сложный пример:

&НаСервере
Процедура ЗначениеНеЯвляетсяЗначениемОбъектногоТипаНаСервере(Справочники = Ложь)
Сообщить(Справочники.Сотрудники.ПустаяСсылка());
КонецПроцедуры

Ошибка может быть “плавающей”. Если вместо параметра по умолчанию “Справочники = Ложь” будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.

Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. – если значение того типа, который мы ожидаем – выполняем код. Иначе – не выполняем.

Ошибка при вызове метода контекста

Ошибка при вызове метода контекста

Обнаружены ошибки в 1С Синтаксическая ошибка

В языке 1С у разных объектов (запросов, справочников, табличных документов и др.) есть предопределенные методы, предусмотренные платформой. Обращение к этим методам требует соблюдения порядка и параметров, правильного синтаксиса и соблюдения условий использования. Например, при чтении табличного документа из файла он не должен быть открыт в другой программе, при подключении к http-соединению оно должно быть доступно, и т.п.

Если эти условия не соблюдать, платформа в зависимости от версии может выдавать сообщения вида “Ошибка при вызове метода контекста”, и далее будут следовать более подробные сведения об ошибке – стек вызовов, приведших к ошибке, номер строки и позиции в строке, где произошла ошибка.

Чаще всего ошибка при вызове метода контекста встречается в следующих методах:

  1. Записать
  2. Прочитать
  3. Выполнить
  4. Создать
  5. ПроверитьВывод

Разберем эту ошибку на примере метода Выполнить объекта Запрос:

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 1 ГДЕ ИСТИНА И");
Запрос.Выполнить();

В тексте запроса допущена ошибка –  после первого условия “ГДЕ ИСТИНА” указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.

Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров – это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса – нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать – в системе должен быть установлен принтер; в случае подключения к почте – должны быть корректно указаны логин и пароль, и т.п.

Тип не может быть выбран в запросе в 1С 8.3 (8.2)

Ошибка Тип не может быть выбран в запросе

С такой ошибкой начинающие разработчики (да и не только начинающие 😉 ) сталкиваются чаще всего, при чтении запросом данных из таблиц значений, либо из регистров сведений. Все дело в том, что запросы поддерживают далеко не все типы значений. Так, например, нельзя запросом выбрать тип Картинка, ХранилищеЗначений, Шрифт, и многие другие типы, которые не относятся к примитивным или ссылочным типам значений.

Так, если ресурс регистра сведений имеет тип ХранилищеЗначений, выбрать его запросом будет нельзя. Также, если в таблицу значений поместить значения не подходящих типов, а после передать эту таблицу в качестве параметра-источника данных, выполнение запроса также приведет к ошибке “Тип не может быть выбран в запросе”.

Еще одна ситуация, когда запрос будет выдавать ошибку – если таблица значений, которая передается в качестве параметра, имеет не типизированные колонки.

Неверно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент");

Верно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));

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

Использование в 1С модальных окон в данном режиме запрещено

Ошибка Использование в 1С модальных окон в данном режиме запрещено​

Платформа будет выдавать такое сообщение, если в коде используются методы, приводящие к открытию модальных окон. Модальные окна – это окна, которые при открытии блокируют весь остальной интерфейс. В 1С есть несколько модальных методов – например – “Вопрос”, “ОткрытьЗначение”, “Предупреждение”. Кроме того, в коде может использоваться модальный синтаксис открытия форм: “ОткрытьМодально()”

Если в свойствах конфигурации выбран режим использования модальности “Не использовать”, то выполнение модальных методов будет приводить к этой ошибке “Использование в 1С модальных окон в данном режиме запрещено”.

Для устранения ошибки можно пойти несколькими путями. Как водится, один – быстрый, другой – правильный 🙂

Быстрый способ – переключить режим использования модальности в положение “Использовать”.

Более правильный способ – использовать в коде немодальные вызовы методов. Например, у метода “Вопрос” есть немодальный аналог  – “ПоказатьВопрос”, у метода “Предупреждение” – “ПоказатьПредупреждение”, и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.

Кроме того, в последних версиях платформы появились асинхронные методы – “ВопросАсинх”, “ПредупреждениеАсинх” и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.

1С 8.3 и 8.2: Запись с такими ключевыми полями существует!

Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).

Суть ошибки следующая – регистр сведений позволяет записать запись (строку таблицы) с уникальным набором ключевых полей – а для периодических регистров также и поля Период. Если следующая запись полностью повторяет значение ключевых полей, но осуществляется методом Записать с параметром Замещать = Истина, то запись в таблице регистра просто заменится на идентичную.

Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать – платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает “Запись с такими ключевыми полями существует” – это запись в периодический регистр сведений с периодичностью от “День” и выше, подчиненный регистратору.

В типовых конфигурациях часто эту ошибку можно воспроизвести, если в пользовательском режиме создать два документа “Установка цен номенклатуры” с одной и той же номенклатурой и за один и тот же день. Попытка провести второй документ приведет к ошибке.

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

Поле объекта недоступно для записи в 1С

Ошибка Поле объекта недоступно для записи в 1С​

Чаще всего начинающие программисты 1С сталкиваются с этой ошибкой в двух ситуациях.

Первый случай – это попытка редактирования системных полей, недоступных для записи. Например, в модуле формы сама форма будет содержаться в объекте ЭтаФорма. И попытка присвоить этому реквизиту любое значение приведет к ошибке “Поле объекта недоступно для записи”.

Второй случай – и с ним новички как раз допускают больше всего ошибок – это попытка редактирования полей ссылки, а не самого объекта. Чаще всего код выглядит примерно так:

Элемент = Справочники.Сотрудники.НайтиПоКоду("12345");
Элемент.Наименование = "Новое наименование";

 

Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект – используя соответствующий метод ПолучитьОбъект().

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

Ссылка на обработку

По ссылке вы можете скачать внешнюю обработку, в которой воспроизводится большая часть ошибок, описанных в статье. Для воспроизведения части ошибок нужно будет убрать комментарии в коде.

Заключение

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

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

33 Comments

  1. Очень помогает в ситуациях, которые по-началу не поддаются объяснению )

    Reply

  2. К СКД ещё только приступил, поэтому не могу вполне оценить нужность этого механизма, но нутром чую, что он очень и очень пригодится. Попробую его понять и ипользовать. Спасибо!

    Reply

  3. В дерево отчетов попадают используемые наборы данных типа Запрос

    Объединения содержат вложенные наборы данных

    Наборы данных типа Объект представляются как простой запрос описания таблицы (перечислены поля)

    Также платформа добавляет системные наборы данных (для построения иерархии и т.п.)

    Далее идет отдельная ветка «Схема», в которой находится исходная схема КД

    Reply

  4. В самой консоли появилась дополнительная фишка — отладка запросов с передачей параметров типа «Таблица значений». Есть, конечно, ряд ограничений (на типизацию колонок), но в целом может пригодиться.

    Reply

  5. Хорошая идея и хорошая реализация. Молодец.

    Reply

  6. (6) Спасибо и за обработку, и за ссылку на курс по СКД.

    Reply

  7. отлично, будем пробовать 🙂

    Reply

  8. Спасибо. Давно искала что-то подобное 🙂

    Reply

  9. Пытаюсь добавить параметры из запроса, выдает ошибку {Форма.Форма.Форма(1560)}: Ошибка при вызове метода контекста (НайтиПараметры): {(56, 1)}: Синтаксическая ошибка

    Reply

  10. на форме «Параметры» есть кнопка «Список» она в общем-то и не нужна, ведь когда выбираем значение параметра, то можем там указать, что это список значений и заполнить его. А вот если бы там была кнопка «Таблица значений» и она бы добавляла в параметр значение «Таблица значений» было бы классно.

    Reply

  11. (12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)

    Reply

  12. (13) mlv84, Таблицу значений я добавил для отладочных целей. Самостоятельный ее ввод мне, например, не очень нужен (даже ее редактирование). Это создаст кучу проблем (интерфейс, юзабилити, типизация колонок и т.д.) Но если вам это необходимо и думаете что это будет интересно сообществу — дерзайте! Выкладывайте. или напишите tezin, он может добавить этот функционал в следующих версиях.

    Reply

  13. Serj1C пишет:

    (12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)

    Это да, прошу прощения. Запрос просто был большой. Кусочек потерялся при копировании. А таблицу значений придумала как обойти. Спасибо.

    Reply

  14. (16) mlv84, Поделись, плиз, как придумала

    Reply

  15. ничего сверх сложного. В моём случае в таблице значений была только одна строка. Я просто посмотрела в отладчике какие там значения. А потом в запросе их явно указала.

    У меня было так:

    «ВЫБРАТЬ

    | ТаблицаПериодов.ДатаНачала КАК ДатаНачала,

    | ТаблицаПериодов.ДатаОкончания КАК ДатаОкончания,

    | ТаблицаПериодов.ГруппаНачислений

    |ПОМЕСТИТЬ ИсходныеДанные

    |ИЗ

    | &ТаблицаПериодов КАК ТаблицаПериодов

    ………………..

    а сделала так:

    «ВЫБРАТЬ

    | ДАТАВРЕМЯ(2011, 04, 01, 0,0,0) КАК ДатаНачала,

    | ДАТАВРЕМЯ(2011, 04, 30, 23,59,59) КАК ДатаОкончания,

    | «%ДопНачисление%» как ГруппаНасилений //У меня здесь строковое значение передавалось

    КАК ТаблицаПериодов

    Reply

  16. (18) mlv84, Да, я тоже так делаю:

    Выбрать &Контрагент1 Контрагент, 15000 Сумма Поместить ТЗ

    Объединить все Выбрать &Контрагент2, 20000

    Объединить все Выбрать &Контрагент3, NULL

    и т.д.

    Reply

  17. Описанные функции (отладки запросов из компоновки) реализованы также в подсистеме «Инструменты разработчика» (функция Отладить, консоль компоновки данных) http://infostart.ru/public/15126/ . Там же там вы найдете много исследовательских инструментов в консоли компоновки данных, которые позволяет вам лучше понять, как устроен макет компоновки и расшифровка.

    Reply

  18. (20) tormozit, да, ваша подсистема выше всех похвал

    Reply

  19. UPD 29.02.2012

    Обновление оригинальной консоли до последней версии + возможность редактирования параметра с типом ТаблицаЗначений (интерфейс не дружественный, юзабилити на нуле, но если сильно понадобится, то редактируется).

    Reply

  20. Очень помогает как раз разбираюсь с СКД

    Reply

  21. Функционал отличный. Интерфейс хотелось бы по компактнее.

    Reply

  22. {Форма.ФормаОтладкаСКД.Форма(47)}: Ошибка при вызове метода контекста (Инициализировать)

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

    по причине: Ошибка компоновки данных

    по причине: Ошибка инициализации

    по причине: Ошибка в выражении

    по причине: Синтаксическая ошибка «Справочники.ТехнологическиеОперации.НайтиПоКоду»

    Стандартная СКД принимает выражение Параметра в таком виде. Если элемент справочника не предопределенный, его можно найти позже — ПоКоду, ну или ПоНаименованию, что хуже в случае редактирования Наименования 😉

    При вызове Отладка СКД и нажатии Сформировать обработка не понимает такого выражения для Параметра.

    Reply

  23. (25) alex_shkut, Любопытно, никогда не замечал. Баг платформы. Могу отписать на 1c@1c.ru, но не думаю, что скоро исправят.

    Reply

  24. Возможность отлаживать отчет на СКД из формы отчета — это очень удобно. Спасибо. Имя файла в пути поправьте.

    Reply

  25. При использовании набора данных «Объект»:

    {Форма.Форма.Форма(791)}: Ошибка при вызове метода контекста (Выполнить): {(9, 2)}: Таблица не найдена «РезультатОсновногоЗапроса»

    <<?>>РезультатОсновногоЗапроса КАК Таблица

    РезультатОсновногоЗапроса — это имя объекта (внешнего набора данных).

    Reply

  26. Вот сам и отвечаю на свой пост (25)

    В Запроснике надо найти нечто похожее (не вскрывал его :))

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

    А вот описание значения Истина в конце функции:

    <ВозможностьИспользованияВнешнихФункций> (необязательный)

    Тип: Булево. Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.

    Значение по умолчанию: Ложь

    В моей текущей ситуации это была именно внешняя функция, но думаю, что это касается и прочих «СКД недвижковых» функций типа Справочники.НайтиПоКоду().

    Мне помогло, думаю что в Запроснике этого будет достаточно, чтобы ошибка исчезла.

    Нашел, где это: ФормаОтладкаСКД строка 47

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

    надо: ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,истина);

    Reply

  27. (30) alex_shkut, мда, не тривиально… Ок, мотаем на ус!

    Reply

  28. Почему Вы не пишите вначале, что это для обычных форм, я получается зря потратила стартмани!

    Reply

  29. (32) Публикация 2011 года, на сриншотах обычное приложение…

    Давайте я вам вышлю инструменты, которые использую сейчас в работе

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Всем прив. Такая трабла: есть УТ 10.3 со справочником «ИнформационныеКарты». Так вот, справочники.информационныеКарты.найтиПоКоду(«0000001») — ошибка при вызове метода контекста найтиПоКоду о_О. Тип кода — строка. С пустой строкой в параметре тоже самое. И с числом. В лыжах уже стою на асфальте. Help…

текст ошибки целиком — у пушкина?

Платформа 8.2.13.219 Конфигурация 10.3.8.9 (с поддержки снята) Ошибка: Ошибка при вызове метода контекста (НайтиПоКоду)    дКарта = Справочники.ИнформационныеКарты.НайтиПоКоду(сокрЛП(СтрПолучитьСтроку(стрМн, 8))); по причине: по причине: В данной транзакции уже происходили ошибки! Из отладчика: сокрЛП(СтрПолучитьСтроку(стрМн, 8)) = «000004020»

Такая болезненная реакция только на этот код информационной карты. Например «000001016» отлично находи. Тестирование и исправление (переиндексация, проверка целостности) делал. Безрезультатно.

«В данной транзакции уже происходили ошибки! » Раньше ошибка уже была

ошибка у тебя в СтрПолучитьСтроку(стрМн, 8), а не в поиске по коду

Из отладчика: сокрЛП(СтрПолучитьСтроку(стрМн, 8)) = «000004020»

попробуй на две строки разбей. там попытка идет?

Попытки нет. Могу конечно сделать, но надо причину выяснить. Элемент справочника с таким кодом существует. Еще момент. Около недели назад коды были полностью заменены у всех элементов. Перенумеровали их. А как это на две строки разбить? Переменную для кода сделать? Не помогает.

— да. Ошибка совершенно в другом месте. Всем спасибо за помощь!

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

stanislavyakuza
18.04.2012 14:58 Прочитано: 13279

Здравствуйте!
Помогите разобраться голову сломал.Почему так?
При создании документа программно, заполняю его.После записываю док(если сразу првожу нарываюсь на ошибку , далее).Захожу в документ нажимаю провести И нарываюсь на ошибку — «Запись не верна»,значение поля склад не может быть пустым.Хотя склад заполнен и если даже перезаполню склад не помогает, если пробую сделать тоже самое создаю документ в программе выбираю тот же склад все нормально.

Вот кусок кода моей обработки:
////Данные для документа////
Товар10 = Справочники.Номенклатура.НайтиПоКоду(«260867»);
Товар18 = Справочники.Номенклатура.НайтиПоКоду(«260868»);
Рубль = Справочники.Валюты.НайтиПоКоду(«643»);
Менеджер = Справочники.Пользователи.НайтиПоНаименованию(«Администратор»);
Организация = Справочники.Организации.НайтиПоНаименованию(«Авоська»);
Подразделение = справочники.СтруктураПредприятия.НайтиПоКоду(Значение.Подразделение);
Партнер = Справочники.Партнеры.НайтиПоКоду(Значение.Контрагент);
////////////////////////////////
// Создадим док поступление
ДокПоступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
ДокПоступление.Дата = Объект.ДатаПрихода;
ДокПоступление.Организация = Организация;
ДокПоступление.Склад = Объект.Склад;
Если ПустаяСтрока(Партнер) Тогда
Сообщить(«Не найден контрагент с кодом»+Значение.Контрагент);
спрПартнер = Справочники.Партнеры.СоздатьЭлемент();
спрПартнер.Наименование = «Смотрите название в джестори по коду»+Значение.Контрагент;

спрПартнер.Код = Значение.Контрагент;
спрПартнер.Клиент = Истина;
спрПартнер.Поставщик=Истина;
спрПартнер.Записать();
КонецЕсли;
Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Партнер);

ДокПоступление.Партнер = Партнер;

Если ПустаяСтрока(Контрагент) Тогда
спрКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
спрКонтрагент.Наименование = Партнер.Наименование;
спрКонтрагент.Партнер = Партнер;
спрКонтрагент.Записать();
КонецЕсли;

ДокПоступление.Валюта = рубль;
ДокПоступление.Подразделение = Подразделение;
ДокПоступление.ХозяйственнаяОперация = ПеречислениЯ.ХозяйственныеОперации.ЗакупкаУПоставщика;
ДокПоступление.ДатаПлатежа = Объект.ДатаПрихода;
ДокПоступление.ВалютаВзаиморасчетов = Рубль;
ДокПоступление.ЦенаВключаетНДС = Истина;
ДокПоступление.НалогообложениеНДС = ПеречислениЯ.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
ДокПоступление.Менеджер = Менеджер;
ДокПоступление.Контрагент = Контрагент;

ТабЧ = ДокПоступление.Товары.Добавить();
Если Значение.Ставка = «18» Тогда
Ном=Товар18;
СумНдс= (Значение.сумма/100)*18;
Ставка = ПеречислениЯ.СтавкиНДС.НДС18;
Иначе
СумНдс = (Значение.сумма/100)*10;
ном=товар10;
Ставка = ПеречислениЯ.СтавкиНДС.НДС10;
КонецЕсли;
ТабЧ.Номенклатура = ном;
ТабЧ.КоличествоУпаковок = 1;
Табч.Количество = 1;
Табч.Цена = Значение.Сумма;
Табч.Сумма = Значение.сумма;
Табч.СтавкаНДС = Ставка;
ТабЧ.СуммаНДС = СумНДС;
////Попытка
////Исключение
ДокПоступление.Записать();//(РежимЗаписиДокумента.Проведение);

Yandex
Возможно, вас также заинтересует

Реклама на портале

Mokey
18.04.2012 15:05 Ответ № 1

Из кода ничего непонятно, если Вы говорите, что эта часть работает без проблем, то надо анализировать ту, которая выдаёт ошибку. Такая ошибка возникает тогда, когда в регистре накопления, по которому проводится документ, на реквизит склад наложено ограничение на запись пустых полей. Надо смотреть проведение документа и связь элемента формы Склад с реквизитом документа Склад. Скорее всего они есть что-то каждый сам по себе.

stanislavyakuza
18.04.2012 15:46 Ответ № 2

Благодарю вас ). Не стал разбираться как там все цепляется, оказалось что у каждой строки в табличной части имеется поле склад который так не увидишь.Также аналогичная ситуация у поля(в таб части) «СуммаСНДС»- она же себестоимость и «сумма взаиморасчетов».

Подсказка: Для редактирования своего ответа щелкните по значку (справа)

Содержание

  1. Ошибка при вызове метода контекста в 1С
  2. Решение проблемы
  3. Топ 11 ошибок начинающих 1с программистов
  4. Содержание
  5. Поле объекта не обнаружено
  6. Индекс находится за границами массива
  7. Обращение к процедуре как к функции
  8. Процедура не может возвращать значение
  9. Переменная не определена
  10. Значение не является значением объектного типа
  11. Ошибка при вызове метода контекста
  12. Тип не может быть выбран в запросе в 1С 8.3 (8.2)
  13. Использование в 1С модальных окон в данном режиме запрещено
  14. 1С 8.3 и 8.2: Запись с такими ключевыми полями существует!
  15. Поле объекта недоступно для записи в 1С
  16. Ссылка на обработку

Ошибка при вызове метода контекста в 1С

Любой программист 1С встречался с таким сообщением, как «Ошибка при вызове метода контекста (Выполнить)». Обычно эта ошибка не вызывает затруднения у опытного программиста. Почему она возникает? Рассмотрим ниже.

Как в любом языке программирования, в платформе 1С есть предопределенные методы, которые облегчают жизнь разработчикам. Но выполнение этих команд требует правильного соблюдения синтаксиса языка программирования.

Самые распространенные ошибки при вызове типовых методов:

  • Записать
  • Создать
  • Подключиться
  • Connect
  • ПроверитьВывод
  • PreviewFile1C
  • Прочитать
  • Выполнить
  • ВыполнитьПакет
  • ПрочитатьИзменения

Рассмотрим пример. Мы программно создали запрос (справочник по запросам), передав в параметры «текст» вот такой фрагмент:

В конструкции «ГДЕ» мы преднамеренно ошиблись, поставив «И», но не прописав еще одно условие. Совершенно логично, что 1С не сможет справиться с таким запросом и выдаст ошибку:

<МодульСеанса(21)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >

Рассмотрим еще один пример:

Получите понятные самоучители по 1С бесплатно:

Перенесем ошибочный код в обработчик «ПередЗаписью» справочника «Версии программ» и попробуем записать справочник программно. Видим ошибку:

<МодульСеанса(8)>: Ошибка при вызове метода контекста (Записать)
Выборка.ПолучитьОбъект().Записать();
по причине:
Ошибка при выполнении обработчика — ‘ПередЗаписью’
по причине:
<Справочник.ВерсииПрограмм.МодульОбъекта(20)>: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >

Несмотря на то, что ошибка заключается в выполнения метода «Выполнить», система ругается и на строчку кода, где вызывается программная запись объекта.

Решение проблемы

Для решения проблемы достаточно понять, в чем именно заключается ошибка. В 99% случаев проблема решается банальным чтением справки и анализом проблемы.

Для того чтобы узнать, как пользоваться тем или иным методом, достаточно установить курсор на интересующей Вас функции и нажать «Ctrl + F1». Платформа 1С выдаст Вам контекстную подсказку по требуемому методу:

Проверьте параметры, передаваемые в функцию, и правильность её использования.

Другие статьи по 1С:

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник

Топ 11 ошибок начинающих 1с программистов

Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи

Содержание

Поле объекта не обнаружено

Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки «Поле объекта не обнаружено». Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.

Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.

Такое сообщение платформа выдает, когда пытается обратиться к свойству объекта языка, которого у данного объекта нет. Не важно, что это за объект — документ, справочник, таблица значений , или сообщение пользователю.

  • Удалили табличную часть, к которой обращаемся в коде?
  • Переименовали реквизит, а в коде не исправили?
  • Заменили значение со ссылки на неопределено?

Вуаля — платформа выдаст ошибку «Поле объекта не обнаружено»!

Как исправить? Исходя из природы ошибки — переименовать реквизит на нужное имя, отредактировать код, или использовать правильные обращения к стандартным свойствам объекта.

Например, у объекта «СообщениеПользователю» нет свойства «Таблица», и следующий код приведет к ошибке:

Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = «Ошибка»;

Индекс находится за границами массива

Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки «Индекс находится за границами массива».

  • Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов — с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
  • Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
  • Ошибочное увеличение счетчика в цикле «Для»

Как исправить? Для удаления элементов из коллекции по условию — использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла

Обращение к процедуре как к функции

Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.

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

А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.

Рассмотрим два примера:

1. Воспроизведем ошибку « Обращение к процедуре как к функции» . При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.

2. Воспроизведем ошибку « Обращение к процедуре объекта как к функции» . Здесь мы неверно используем метод объекта массива «Добавить», который является процедурой.

Как исправить? Ошибка тривиальная, и исправление тоже. Чаще всего, достаточно внимательно прочитать описание методов объекта во встроенной справке или синтакс-помощнике. Если метод является процедурой, то значений он возвращать не может. Следовательно, нужно модифицировать код так, чтобы такого ошибочного вызова не было.
Если же используется процедура, объявленная в коде, возможно, есть необходимость изменить ее на функцию, либо также скорректировать код, который эту процедуру использует.

Процедура не может возвращать значение

Переменная не определена

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

  • Опечатка в имени переменной
  • Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова «Перем», или передана в качестве параметра)
  • Написание на клиенте серверного кода. Например, обращение к менеджеру справочников «Справочники», и т.п. Клиентская часть приложения «не видит » серверные объекты языка
  • Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.

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

Значение не является значением объектного типа

Ошибка «Значение не является значением объектного типа» может возникнуть при неверном обращении к объекту языка. Объектный тип — это такие объекты языка, которые содержат в себе другие объекты — свойства, реквизиты и т.п. Эти свойства доступны через точку, например «Объект.СвойствоЭтогоОбъекта»

Но если через точку попытаться использовать какое-то значение, которое внутри себя свойств не имеет — например, любое значение примитивного типа — это и приведет к ошибке.

Разберем более сложный пример:

Ошибка может быть «плавающей». Если вместо параметра по умолчанию «Справочники = Ложь» будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.

Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. — если значение того типа, который мы ожидаем — выполняем код. Иначе — не выполняем.

Ошибка при вызове метода контекста

В языке 1С у разных объектов (запросов, справочников, табличных документов и др.) есть предопределенные методы, предусмотренные платформой. Обращение к этим методам требует соблюдения порядка и параметров, правильного синтаксиса и соблюдения условий использования. Например, при чтении табличного документа из файла он не должен быть открыт в другой программе, при подключении к http-соединению оно должно быть доступно, и т.п.

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

Чаще всего ошибка при вызове метода контекста встречается в следующих методах:

  1. Записать
  2. Прочитать
  3. Выполнить
  4. Создать
  5. ПроверитьВывод

В тексте запроса допущена ошибка — после первого условия «ГДЕ ИСТИНА» указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.

Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров — это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса — нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать — в системе должен быть установлен принтер; в случае подключения к почте — должны быть корректно указаны логин и пароль, и т.п.

Тип не может быть выбран в запросе в 1С 8.3 (8.2)

С такой ошибкой начинающие разработчики (да и не только начинающие 😉 ) сталкиваются чаще всего, при чтении запросом данных из таблиц значений, либо из регистров сведений. Все дело в том, что запросы поддерживают далеко не все типы значений. Так, например, нельзя запросом выбрать тип Картинка, ХранилищеЗначений, Шрифт, и многие другие типы, которые не относятся к примитивным или ссылочным типам значений.

Так, если ресурс регистра сведений имеет тип ХранилищеЗначений, выбрать его запросом будет нельзя. Также, если в таблицу значений поместить значения не подходящих типов, а после передать эту таблицу в качестве параметра-источника данных, выполнение запроса также приведет к ошибке «Тип не может быть выбран в запросе».

Еще одна ситуация, когда запрос будет выдавать ошибку — если таблица значений, которая передается в качестве параметра, имеет не типизированные колонки.

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

Использование в 1С модальных окон в данном режиме запрещено

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

Если в свойствах конфигурации выбран режим использования модальности «Не использовать», то выполнение модальных методов будет приводить к этой ошибке «Использование в 1С модальных окон в данном режиме запрещено».

Для устранения ошибки можно пойти несколькими путями. Как водится, один — быстрый, другой — правильный 🙂

Быстрый способ — переключить режим использования модальности в положение «Использовать».

Более правильный способ — использовать в коде немодальные вызовы методов. Например, у метода «Вопрос» есть немодальный аналог — «ПоказатьВопрос», у метода «Предупреждение» — «ПоказатьПредупреждение», и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.

Кроме того, в последних версиях платформы появились асинхронные методы — «ВопросАсинх», «ПредупреждениеАсинх» и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.

1С 8.3 и 8.2: Запись с такими ключевыми полями существует!

Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).

Суть ошибки следующая — регистр сведений позволяет записать запись (строку таблицы) с уникальным набором ключевых полей — а для периодических регистров также и поля Период. Если следующая запись полностью повторяет значение ключевых полей, но осуществляется методом Записать с параметром Замещать = Истина, то запись в таблице регистра просто заменится на идентичную.

Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать — платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает «Запись с такими ключевыми полями существует» — это запись в периодический регистр сведений с периодичностью от «День» и выше, подчиненный регистратору.

В типовых конфигурациях часто эту ошибку можно воспроизвести, если в пользовательском режиме создать два документа «Установка цен номенклатуры» с одной и той же номенклатурой и за один и тот же день. Попытка провести второй документ приведет к ошибке.

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

Поле объекта недоступно для записи в 1С

Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект — используя соответствующий метод ПолучитьОбъект().

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

Ссылка на обработку

По ссылке вы можете скачать внешнюю обработку, в которой воспроизводится большая часть ошибок, описанных в статье. Для воспроизведения части ошибок нужно будет убрать комментарии в коде.

Источник

Понравилась статья? Поделить с друзьями:
  • Синтаксическая ошибка справочники видыцен доступныевидыцен
  • Синтаксические ошибки программы это
  • Синтаксические ошибки причастный оборот
  • Синтаксические ошибки примеры и исправления таблица
  • Синтаксические ошибки презентация